原生JDBC(mysql)
- 加载com.mysql.jdbc.Driver连接驱动
- 获取连接池对象
- 获取PreparedStatement或Statement对象
- 设置sql语句
- 依次设置入参值
- 获取操作结果ResultSet
- 手动解析ResultSet
示例
1、配置java包
2、定义Mysql表结构
3、配置数据库链接信息jdbc.properties
4、配置Spring扫描和加载properties文件
5、定义Pojo(接下来例子中,我们会用到lombok,无需设置pojo的setter,getter方法,在项目中引入lombok.jar即可。)
6、编写jdbc操作工具类
7、配置单元测试用例
8、运行结果
spring-jdbc.jar封装
- JdbcTemplate类是JDBC核心软件包的核心类,主要提供五种方法
- execute方法,可以用于执行任何sql,一般主要用于DDL
- update(sql,args)方法,一般用于增、删、改sql语句
- batchUpdate方法,执行批处理sql
- query即queryForXX方法,查询sql(需要注意的是,queryForObject,如果查询结果为null,spring将会抛出异常提示。)
- call方法,用于执行存储过程,函数等相关sql语句
- 对前面原生JDBC代码进行改造,支持Spring JDBC操作方案。
- 1、修改xml配置
在spring.xml中配置数据源信息,并且将数据源交给spring管理
2、由于JdbcTemplate中queryForObject方法,如果获取数据库结果集为空,会抛出异常,因此我们用queryForList方法执行数据库查询操作。然后queryForList中返回参数是List<Map<String, Object>>
,因此我们在pojo中定义List<Map<String, Object>>
转Object的方法。
3、定义UserDao及其实现类(关于UserDaoImpl类中JdbcTemplate自动装配:xml配置,因为需要dataSource对象,所以初始化在dataSourc之后)
4、执行单元测试用例
5、控制台输出如下
不足
- queryForObject方法,如果查询的结果为空,Spring JDBC将会抛出EmptyResultDataAccessException异常
- queryForList方法,Spring JDBC直接返回
List<Map<String, Object>>
,需要我们手动关联映射到实体类对象。 - 解决:可以通过JAVA反射机制封装公共方法来将queryForList的方法结果ORM映射到实体类
储存过程
- 优势
- 重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量
- 减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
- 安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
- SimpleJdbcInsert-快速插入数据
- 1、定义UserSimpleJdbcInsert数据库操作类
-
- 2、运行单眼测试用例
储存过程
- SimpleJdbcCall 类支持被用于调用一个包含 IN 和 OUT 参数的存储过程。
假设我们有一个业务场景,需要获取数据库中,指定年龄以上最小年龄和最大年龄值。一般遇到这种业务,我们都是通过两次数据库操作来获取
- 获取指定年龄以上的最小值
- 获取指定年龄以上的最大值
示例
1、定义储存过程
2、UserSimpleJdbcCall使用(使用SimpleJdbcCall调用刚刚创建的存储过程getAgeInfo
)
3、在数据库中插入一些数据后,数据库内容如图所示:
4、编写单元测试用例,指定获取age=25以上的最大值和最小值