精华内容
下载资源
问答
  • 以前做开发都是直接SQL语句,最近这个工程领导要求凡是跟数据库交互的都要用存储过程,开始还遇到了一些困难,但还是搞定了,现在在这把我的成果告诉大家,与大家一起分享,有句话说得好啊,一个人乐那不叫乐,大家乐那才...

    以前做开发都是直接写SQL语句,最近这个工程领导要求凡是跟数据库交互的都要用存储过程,开始还遇到了一些困难,但还是搞定了,现在在这把我的成果告诉大家,与大家一起分享,有句话说得好啊,一个人乐那不叫乐,大家乐那才是真的乐,现在告诉大家在Java类中怎么调用存储过程,我用的是Oracle数据库,先建好存储过程,然后建一个类

    package com.rj.service;

    import java.sql.*;

    /**

    * 调用储存过程测试

    * @author Administrator

    *

    */

    public class Test {

    public Test() {

    }

    public void tt(){

    }

    public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:Ora9 ";

    Connection conn = null;

    //CallableStatement cstmt = null;

    try {

    Class.forName(driver);

    conn = DriverManager.getConnection(strUrl, "scott", "tiger");

    CallableStatement proc = null;

    //调用存储过程UpdateUser是过程名,?代表参数个数

    String sql = "{call UpdateUser(?) }";

    proc = conn.prepareCall(sql);

    proc.setString(1, "001");

    proc.execute();

    }

    catch (SQLException ex2) {

    ex2.printStackTrace();

    }

    catch (Exception ex2) {

    ex2.printStackTrace();

    }

    finally

    {

    try {

    if(conn!=null)

    {

    conn.close();

    }

    }

    catch (SQLException ex1) {

    ex1.printStackTrace();

    }

    }

    }

    }

    如有不明白的可以问,当然我这并不是在说我有多历害,我只是想让跟我有同样经历的人不要走弯路,能够帮到大家,仅此而已.

    展开全文
  • 以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。 一般系统的大致整体架构图如下: 需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊...

    在这里插入图片描述
    转载:https://www.jianshu.com/p/fa75acba5b07

    在移动互联网,分布式、微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了)。

    一般系统的大致整体架构图如下:

    在这里插入图片描述

    需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。因为这篇主要介绍的是API接口,所以我们聚焦点,其他的模块小伙伴们自行去补充。

    接口交互

    前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,后端服务器接收请求,进行业务处理,返回数据给前端。

    针对URL路径的restful风格,以及传入参数的公共请求头的要求(如:app_version,api_version,device等),老顾这里就不介绍了,小伙伴们可以自行去了解,也比较简单。

    着重介绍一下后端服务器如何实现把数据返回给前端?

    返回格式

    后端返回给前端我们一般用JSON体方式,定义如下:

    {
        #返回状态码
        code:integer,       
        #返回信息描述
        message:string,
        #返回值
        data:object
    }
    

    CODE状态码

    code返回状态码,一般小伙伴们是在开发的时候需要什么,就添加什么。

    如接口要返回用户权限异常,我们加一个状态码为101吧,下一次又要加一个数据参数异常,就加一个102的状态码。这样虽然能够照常满足业务,但状态码太凌乱了

    我们应该可以参考HTTP请求返回的状态码

    :下面是常见的HTTP状态码:
    200 - 请求成功
    301 - 资源(网页等)被永久转移到其它URL
    404 - 请求的资源(网页等)不存在
    500 - 内部服务器错误
    

    在这里插入图片描述

    我们可以参考这样的设计,这样的好处就把错误类型归类到某个区间内,如果区间不够,可以设计成4位数。

    #10001999 区间表示参数错误
    #20002999 区间表示用户错误
    #30003999 区间表示接口异常
    

    这样前端开发人员在得到返回值后,根据状态码就可以知道,大概什么错误,再根据message相关的信息描述,可以快速定位。

    Message

    这个字段相对理解比较简单,就是发生错误时,如何友好的进行提示。一般的设计是和code状态码一起设计,如

    在这里插入图片描述

    再在枚举中定义,状态码

    在这里插入图片描述

    状态码和信息就会一一对应,比较好维护。

    Data

    返回数据体,JSON格式,根据不同的业务又不同的JSON体。

    我们要设计一个返回体类Result

    在这里插入图片描述

    控制层Controller

    我们会在controller层处理业务请求,并返回给前端,以order订单为例

    在这里插入图片描述

    我们看到在获得order对象之后,我们是用的Result构造方法进行包装赋值,然后进行返回。小伙伴们有没有发现,构造方法这样的包装是不是很麻烦,我们可以优化一下。

    美观优化

    我们可以在Result类中,加入静态方法,一看就懂

    在这里插入图片描述

    那我们来改造一下Controller

    在这里插入图片描述

    代码是不是比较简洁了,也美观了。

    优雅优化

    上面我们看到在Result类中增加了静态方法,使得业务处理代码简洁了。但小伙伴们有没有发现这样有几个问题:

    1、每个方法的返回都是Result封装对象,没有业务含义
    2、在业务代码中,成功的时候我们调用Result.success,异常错误调用Result.failure。是不是很多余
    3、上面的代码,判断id是否为null,其实我们可以使用hibernate validate做校验,没有必要在方法体中做判断。

    我们最好的方式直接返回真实业务对象,最好不要改变之前的业务方式,如下图

    在这里插入图片描述

    这个和我们平时的代码是一样的,非常直观,直接返回order对象,这样是不是很完美。那实现方案是什么呢?

    实现方案

    小伙伴们怎么去实现是不是有点思路,在这个过程中,我们需要做几个事情

    1、定义一个注解@ResponseResult,表示这个接口返回的值需要包装一下
    2、拦截请求,判断此请求是否需要被@ResponseResult注解
    3、核心步骤就是实现接口ResponseBodyAdvice和@ControllerAdvice,判断是否需要包装返回值,如果需要,就把Controller接口的返回值进行重写。

    注解类

    用来标记方法的返回值,是否需要包装

    在这里插入图片描述

    拦截器

    拦截请求,是否此请求返回的值需要包装,其实就是运行的时候,解析@ResponseResult注解

    在这里插入图片描述

    此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。

    重写返回体

    在这里插入图片描述

    上面代码就是判断是否需要返回值包装,如果需要就直接包装。这里我们只处理了正常成功的包装,如果方法体报异常怎么办?处理异常也比较简单,只要判断body是否为异常类。

    在这里插入图片描述

    怎么做全局的异常处理,篇幅原因,这里就不做介绍了,只要思路理清楚了,自行改造就行。

    重写Controller

    在这里插入图片描述

    在控制器类上或者方法体上加上@ResponseResult注解,这样就ok了,简单吧。到此返回的设计思路完成,是不是又简洁,又优雅。

    总结

    这个方案还有没有别的优化空间,当然是有的。如:每次请求都要反射一下,获取请求的方法是否需要包装,其实可以做个缓存,不需要每次都需要解析。当然整体思路了解,小伙伴们就可以在此基础上面自行扩展。谢谢!!!

    展开全文
  • 环境:IDEAJDK8Spring BootMySQLSpring Data JPA在数据库中创建一个存储过程CREATE PROCEDURE GetStudent(IN ageMin int, IN gradeMin int)BEGINSELECT * FROM studentWHERE age > ageMinAND grade > gradeMin...

    环境:

    IDEA

    JDK8

    Spring Boot

    MySQL

    Spring Data JPA

    在数据库中创建一个存储过程

    CREATE PROCEDURE GetStudent(IN ageMin int, IN gradeMin int)

    BEGIN

    SELECT * FROM student

    WHERE age > ageMin

    AND grade > gradeMin;

    END;

    简单解释:

    第一行中的GetStudent 是过程名,括号中的是参数,IN代表传入参数,OUT是传出参数, ageMin是参数名,int是参数类型(参数类型需是数据库中的参数类型)。

    BEGIN和END中间的就是SQL语句

    在数据库中调用:

    call GetStudent(1,2);

    使用spring data jpa调用这个存储过程:

    步骤:

    创建一个实体类

    在实体类中使用注解的方式绑定数据库中的存储过程

    调用这个存储过程

    先上代码

    实体类:

    package com.zhang.demo;

    import lombok.AllArgsConstructor;

    import lombok.Data;

    import lombok.NoArgsConstructor;

    import javax.persistence.*;

    @Entity

    @NamedStoredProcedureQuery(name = "GetStudent", procedureName = "GetStudent",

    resultClasses = {Student.class},

    parameters = {

    @StoredProcedureParameter(mode = ParameterMode.IN, name = "ageMin", type = Integer.class),

    @StoredProcedureParameter(mode = ParameterMode.IN, name = "gradeMin", type = Integer.class)

    })

    @Data

    @NoArgsConstructor

    @AllArgsConstructor

    public class Student {

    @Id

    @GeneratedValue

    private Long id;

    private String no;

    private String name;

    private Integer grade;

    private Integer age;

    }

    说明:

    @NamedStoredProcedureQuery 申明一个存储过程

    name属性是给这个存储结构起一个名字

    procedureName属性是存储结构在数据库中的名字

    resultClasses属性声明这个存储过程返回的结果集的类型

    parameters属性声明这个存储结构的参数

    (如果存储过程返回的是一个临时表,那么resultClasses对应的临时表的字段要与数据库中的字段匹配,匹配不意味着完全相等而是:下划线->驼峰,因为它使用的是jpa的规范)

    @Entity注解的作用是声明这是一个实体类

    下面三个注解是插件lombok的方法

    @Data 生成getter and setter方法

    @NoArgsConstructor 生成无参的构造函数

    @AllArgsConstructor 生成全参的构造函数

    使用lombok插件的方法很简单:

    先添加依赖(使用Maven构建项目)

    org.projectlombok

    lombok

    然后在IDEA的 setting -> Plugins 搜索lombok点击安装

    最后重启IDEA

    @Id与@GeneratedValue是JPA的注解,意思是声明id字段是主键,且设置自增

    调用:

    package com.zhang.demo;

    import org.springframework.web.bind.annotation.*;

    import javax.persistence.EntityManager;

    import javax.persistence.PersistenceContext;

    import javax.persistence.StoredProcedureQuery;

    import java.util.List;

    /**

    * Created by mrzhang on 2018/11/2.

    */

    @RestController

    public class StudentController {

    @PersistenceContext

    private EntityManager entityManager;

    @GetMapping("/getStudent")

    @ResponseBody

    public JsonResult findStudentByAgeAndGrade(){

    StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("GetStudent");

    store.setParameter("ageMin", 10);

    store.setParameter("gradeMin", 10);

    List students = store.getResultList();

    return JsonResult.success(students);

    }

    }

    因为是demo所以就粗糙一点没有使用service层,直接在Controller中调用

    获取spring容器中的EntityManager

    @PersistenceContext

    private EntityManager entityManager;

    createNamedStoredProcedureQuery()方法创建一个查询对象

    setParameter()来设置参数的值

    getResultList()方法来获取结果集

    展开全文
  • hugegraph如何自定义扩展存储后端 以增加一个顶点为例,讲解数据写入流程 本篇文章适合人群:架构师、技术专家、对知识图谱与图数据库感兴趣的高级工程师 本次分析基于hugegraph 0.11.2进行。 1. 如何扩展存储...

    随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,亟需一种支持海量复杂数据关系运算的数据库即图数据库。本系列文章是学习知识图谱以及图数据库相关的知识梳理与总结

    本文会包含如下内容:

    • hugegraph如何自定义扩展存储后端
    • 以增加一个顶点为例,讲解数据写入流程

    本篇文章适合人群:架构师、技术专家、对知识图谱与图数据库感兴趣的高级工程师

    本次分析基于hugegraph 0.11.2进行。

    1. 如何扩展存储后端

    HugeGraph百度开源的是一款易用、高效、通用的图数据库系统,通过插件的方式支持多种后端存储,目前内置的存储后端支持:cassandra, scylladb, rocksdb, mysql, palo, hbase, postgresql

    在hugegraph中,每个图相当于一个数据库,图的点、边、shema则对应到不同的表

    扩展自定义存储后端,需要实现2个接口

           1. 实现BackendStoreProvider接口或继承AbstractBackendStoreProvider抽象类,提供针对图的管理,如图的打开、关闭、初始化、clear、truncate、注册或注销监听事件、读写快照等。

    展开全文
  • k8s 的进程到这里我们已经完成了 Namespace、Pod、PodController 几种资源的使用方式,已经过大半了哦~这篇文章我们就继续来了解一下在k8s 中怎么进行数据存储! kubernetes的最小控制单元,容器都是运行在 po
  • 在Flink中提供了StateBackend(状态后端)来存储和管理Checkpoint过程中的状态数据。StateBackend分为三种。 1. MemoryStateBackend 1.1 概念 1.2 特点及使用场景 MemoryStateBackend存储有如下特点:
  • Java项目——后端笔记

    千次阅读 2021-03-09 22:38:40
    接手第一个后端任务就是一个接口(根据课程id和学年学期查询教师信息),以供别的界面使用,对于代码还不熟,也有些看不懂的我来说让我改这个接口其实还是有难度的!刚开始有些不知所措,后来女神告诉我“就看一条线...
  • Java后端多级缓存写法

    2021-02-28 13:39:13
    该楼层疑似违规已被系统折叠隐藏此楼查看此楼1、前言在我们开发项目的过程中经常会遇到一些读多少的接口,在这些接口中会有很大批量的查询操作,如果我们这些查询操作都需要查询数据库的话,会造成数据库承受不了...
  • 判断是否有待爬URL,如果有待爬URL,通过调度器进行传递给下载器,下载URL内容,并通过调度器传送给解析器,解析URL内容,并将价值数据和新URL列表通过调度器传递给应用程序,并输出价值信息的过程。 Python爬虫常用...
  • 概述学习AJAX的过程中,发现自己之前存在着很多的不足,于是花了些时间,总结了一些知识,现在和大家分享一下。前端和后端,前台和后台前端和后端指的是客户端和服务器端;前台和后台指的都是客户端上浏览者浏览界面...
  • 好久没有技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么才合适。最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类。结合实际工作中碰到的问题,以寻找答案的方式来剖解...
  • 上面是前段和后端的一些开发语言和知识,前段用于给用户展示信息,并且提交一些查询的信息,前段通过网络将需要查询信息发送给后端后端进行编程逻辑处理,去数据库查询我们需要的信息,后端查询到需要的信息,又...
  • 存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。--------------------基本语法--------------------一.创建存储过程create procedure sp_name()begin.........end二....
  • 文章目录前言一:ZStack云平台后端存储对接1.1:本地存储1.2:ceph存储1.3:san存储1.4:NFS1.5:ZStack云平台后端存储对接总结谢谢赏阅,如有疑问可以评论区交流! 前言 一:ZStack云平台后端存储对接 1.1:本地...
  • PostgreSQL存储过程中可能有python代码。例如:CREATE FUNCTION someProc()RETURNS void AS $$# Some Python3 code...$$ LANGUAGE plpython3u;但是如何从代码中包含一个python文件呢?PostgreSQL中运行的python的...
  • mysql 高级语句一、存储过程1.什么是存储过程:就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能。ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,...
  • 确定需求:后端的需求从产品经理来,在确定产品需求的过程中,后端工程师必须确定产品需求是否存在逻辑问题,并有一套实现方案。当然,一般情况下产品需求是没问题的,只是实现的难易程度不同而已。但不排除产品经理...
  • shopee后端开发面经

    2021-10-26 11:40:42
    shopee后端开发面试题 一面:前提,我是java转go,所以基本上没有问和java相关的问题。 TCP和UDP的不同? 连接 TCP是面向连接的传输层协议,传输数据前先要建立连接。 UDP是不需要连接的,即刻传输数据。 服务...
  • 后端框架flask学习小记

    千次阅读 2021-12-09 11:10:39
    1. 在前面 最近在和几个伙伴尝试搭建一个新闻...对于一个算法工程师来讲,后端这块虽然不必详细弄清楚原理,但学习一些开发相关知识还是有好处的,因为在实际工作中经常会调试线上的代码调用策略或者模型,我们至少
  • Java Web属于前端还是后端

    千次阅读 2021-02-26 14:40:46
    Java Web属于前端还是后端发布时间:2020-06-15 13:39:15来源:亿速云阅读:325作者:鸽子Java Web 是前端还是后端?Java Web是属于后端,Java Web就是用Java技术开发的Web应用,而Java是一种可以编写跨平台应用软件...
  • node.js后端开发

    2021-03-07 16:26:41
    单独以json形式存储并且跟模板文件放到同级目录 {  "1": "设计是一个发现问题的过程,而不是发现解决方案的过程——Leslie Chicoine", "2": "一个好的程序员应该是那种过单行线都要往两边看的人——Doug Linder...
  • Python后端设计模式

    2021-02-10 03:23:11
    你能更精确地定义“后端”吗?通常,在web开发中,我遵循MVC的结构,其中我的“前端”、html/css/js和处理显示的代码都与我的“后端”模型(业务对象和数据持久性;即数据库)紧密耦合。在我喜欢Django的模型/视图/...
  • 今天继续我们的SQL菜鸟教程...存储过程简介存储过程(Stored Procedure)是数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数...
  • c++ 教程 (7) 后端开发

    2021-01-12 16:32:33
    最重要的是能有出业务级逻辑的方式。而对于 apache, tomcat, nginx这类web 服务器来说,面临的主要挑战是并行;和数以千计的用户同时保持连接(高并发);能够在一定时间内传送大量数据(吞吐量)。虽然Django这类...
  • Ceph 的演进过程其实是合理的,我们在刚开始构建系统时希望尽可能利用现有的工具减少我们的工作量,只有当现有的工具不再趁手时,才应该考虑从零构建复杂的系统,如果 Ceph 从立项开始就从零构建存储后端,可能 Ceph...
  • 滴滴后端面试

    2021-06-17 20:51:51
    记录一次滴滴出行后端面试 文章目录 一面 1.排序算法了解哪些,快排,快排复杂度,优化,堆排序,建堆过程 2.反射了解么,原理是什么 3.treemap和linkdedhashmap区别,实现原理 4.jvm类加载的过程讲讲,符号引用...
  • 后端系统,后端系统是什么意思“后端系统”从宽泛的角度上讲是指向用户提供数据的服务器、超级服务器、群集系统、中程系统以及大型机。这些服务所在的位置通常称为服务器场或数据中心。客户机/服务器中的服务器称为...
  • 后端实现中用到的物理单元进行介绍,包括tap cell,dcap cell等。
  • 布雷恩科技(后端开发):唯实大厦上的一家小游戏公司,笔试没通过,感觉压根也就没想招人,笔试题中除了数据库的一道题不会做,其他六道算法题(包括两道附加题)都做了,应该正确率还可以。但是后来给舍友发短信说...
  • 前后端分离开发——登录页面制作(后端部分)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,464
精华内容 63,785
关键字:

后端不会写存储过程