Spring框架也支持对SQL存储过程的调用,SQL存储过程是一组预先定义好的SQL语句,并存储到数据库管理系统中,外部程序可以直接调用执行。本课主要讨论在Spring框架中应用程序如何调用MySQL存储过程。通过本课的学习,可以达到如下目标。

● 认识和理解SQL存储过程

● 在Spring框架中调用SQL存储过程

1、 认识SQL存储过程

类似于编程语言中的函数,SQL存储过程是SQL语言中的函数。开发者可以把查询、更新、插入等SQL语句按照一的规范写成存储过程,存储到数据库管理系统中,外部应用程序可以直接调用。

使用SQL存储过程,可以提高SQL语句的执行效率。一是SQL语句都是编译后再执行,而SQL存储过程已经预先在数据库管理系统编译通过,省略了编译环节;二是存储过程执行后,数据库管理系统会对存储过程进行缓存,下次执行该存储过程时,会直接从缓存中调用,执行速度要高于普通的SQL语句。

使用SQL存储过程,提高了SQL代码的可维护性。一般来说,普通SQL代码会分布在系统中各个模块,当需要修改SQL代码时,就需要到各个模块中修改,代码维护工作量大。如果把相同的SQL代码写成一个存储过程,由各个模块统一调用,当需要修改SQL代码时,只需要修改存储过程就可以了。

使用SQL存储过程,也提高了数据库的安全性,可以有效防止SQL注入对数据库的攻击。

下面以课程案例mooc数据库为例,说明SQL存储过程的创建和使用方法。在mooc数据库中创建一个名为get_coursename_number的存储过程,该存储过程使用course表的number字段,查询相对应的课程,并返回课程名称。进入MySQL命令行窗口,输入下面的命令,创建get_coursename_number存储过程。

存储过程创建成功后,在MySQL命令行窗口,可以执行存储过程。在MySQL命令行窗口,输入下面的命令。

call为调用存储过程的命令,call后面为存储过程名称。括号内为存储过程要传入和输出的参数。输出的参数@name可以通过select命令查看。如下图所示。

2、在Spring框架中调用SQL存储过程

Spring框架提供了JDBC封装类SimpleJdbcCall,SimpleJdbcCall主要用于调用SQL存储过程或存储函数,该类简化了Java调用存储过程的复杂机制,利用SqlParameterSource类管理存储过程传入的参数,利用Map数据类型接收存储过程返回的参数。使用SimpleJdbcCall调用存储过程的代码如下。

getCoureName方法执行已定义的get_coursename_number存储过程,并返回课程名称。get_coursename_number存储过程要求传入课程编号,并根据课程编号查询课程,返回课程名称字段,具体执行的SQL语句已在get_coursename_number存储过程中定义。SqlParameterSource管理存储过程传入的参数,使用其addValue方法将参数添加到SqlParameterSource,并作为SimpleJdbcCall类execute方法的传入参数,execute方法负责执行存储过程,并以Map方式返回存储过程的执行结果。

下面给出具体执行存储过程的案例程序。案例程序的数据源采用mooc数据库,mooc数据库的结构以及本案例中没有列出的代码详见《Spring使用JDBC访问MySQL数据库》一文。

(1)创建数据访问对象(DAO)

在《Spring使用JDBC访问MySQL数据库》一文中,已经创建了基于JdbcTemplate的数据访问DAO类。本文创建基于SimpleJdbcCall过程调用的数据访问DAO类。

(2)创建Spring配置文件

创建procedure.xml配置文件,配置文件定义了数据源和DAO类。

(3)编写测试程序

测试程序首先读取procedure.xml配置文件,初始化配置文件中定义的DAO类和数据源,并返回上下文环境context。然后,调用context的getBean方法获取DAO类的实例,获得DAO实例后,再调用DAO实例的listCourse()方法查询所有记录,最后迭代listCourse()返回的结果集,在迭代过程中,调用DAO实例的getCoureName方法执行已定义的存储过程,获取课程名称。

课程小结

(1)SQL存储过程是将一些频繁调用的SQL语句按照一定规则编写,并存储到服务器端的数据库管理系统中,外部应用程序可以直接调用存储过程并接收存储过程返回的结果集。

(2)Spring框架提供了JDBC封装类SimpleJdbcCall,用于开发者便捷调用SQL存储过程或存储函数,SimpleJdbcCall类execute方法负责调用存储过程,该方法需要传入SqlParameterSource类型的参数。SqlParameterSource管理存储过程传入的参数,使用其addValue方法将参数添加到SqlParameterSource,execute方法以Map方式返回存储过程的执行结果。

在Spring框架中使用SQL存储过程相关推荐

  1. Spring框架中的设计模式(一)

    设计模式有助于遵循良好的编程实践.作为最流行的Web框架之一的Spring框架也使用其中的一些. 本文将介绍Spring Framework中使用的设计模式.这是5篇专题文章的第一部分.这次我们将发现 ...

  2. 在Spring 框架中如何更有效的使用JDBC?

    使用Spring JDBC 框架,资源管理以及错误处理的代价都会减轻.开发人员只需通过statements 和queries 语句从数据库中存取数据.Spring 框架中通过使用模板类能更有效的使用J ...

  3. 理解Spring框架中Bean的作用域

    本篇介绍Spring Bean实例的作用范围,Spring Bean实例的作用范围由配置项scope限定.通过本篇的学习,可以达成如下目标. ● 应用scope配置项配置Bean的作用域 ● 应用单例 ...

  4. Spring框架中的控制反转和依赖注入

    控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...

  5. Spring框架中提取list集合类型属性注入

    提取list集合类型属性注入 前言 引入名称空间 编写`xml`配置文件 运行结果 前言 对于某一个类型属性通用性较高的情况下,可以单独的提取出来,给需要的bean进行引用. 有关类的创建见<S ...

  6. Spring框架中集合属性为对象的注入方法

    Spring框架中集合属性为对象的注入方法 前言 创建基础类 创建`Course`类 编写XML配置文件 创建测试类 执行结果 前言 在集合的属性注入中,如果注入属性为普通类型(String.int) ...

  7. Spring框架中XML配置文件注入集合(数组、LIST、MAP、SET)属性

    Spring框架中XML配置文件注入集合属性 前言 创建测试类与属性 配置XML配置文件 建立调用类 调用结果 前言 某些类的属性是可能是集合,包括:数组.LIST.MAP.SET等集合,在Sprin ...

  8. Spring框架中级联赋值(外部属性注入)以及内部属性注入

    Spring框架中级联赋值(外部属性注入)以及内部属性注入 前言 级联赋值 1.对上述外部`Bean`配置文件进行修改: 2.级联赋值第二种写法 内部`bean`属性注入 前言 Spring框架中存在 ...

  9. Spring框架中XML配置特殊属性注入

    Spring框架中XML配置特殊属性注入 前言 创建测试类 其他类型属性 前言 Spring框架中,在通过set方式进行属性注入时,可能会遇到某些特殊字符的注入,例如:null和某些标签字符" ...

最新文章

  1. 死磕算法!35 篇算法设计实例+6 本必读书打包送你
  2. 【缩点】解题报告:luogu P2746 [USACO5.3]校园网Network of Schools(有向图、强连通分量、缩点)
  3. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)
  4. 权威专家首次回应宠物能否传播新型肺炎:接触到疫情需要监控
  5. EfficientNetV2 笔记
  6. smartforms不输出0
  7. 【渝粤题库】广东开放大学 现代服务学概论 形成性考核 (2)
  8. java 输出字符集合里的字_Java基础 -- 字符串(格式化输出、正则表达式)(示例代码)...
  9. c语言判断字符串中是否包含非数字,【新手】【求思路】如何判断用户输入的字符串中是否含有非数字?...
  10. php基础语法了解,PHP基础语法
  11. tpc1061ti使用说明_昆仑通态连打印机样例说明
  12. MLA格式应该如何正确引用?
  13. 惠普找不到远程服务器,找不到网络打印机是怎么回事?
  14. 如何调用common.js
  15. 论基础理论知识的重要性
  16. SQL注入点判断及万能密码
  17. Vulkan学习(八): Hello Triangle 重构
  18. Web项目之购物网站
  19. fMRI处理:基于spm的dparsf
  20. android10原生动态壁纸,三星S10手机原生壁纸下载

热门文章

  1. Dubbo源码分析:ThreadPool
  2. Linux系统isosize指令用法
  3. 软件设计师--文件索引
  4. openstack Nova日志相关
  5. [读书笔记] 敏捷软件开发:原则、模式与实践
  6. Hexo+GitHub 快速搭建个人博客(一)---- 基本部署
  7. 用windows api 计算文件的md5值
  8. c++利用windows api遍历指定文件夹及其子文件夹中的文件
  9. mysql order by按照汉字拼音进行排序
  10. mysql的学习要点_MySQL中的联合索引的学习要点总结