4.2 Spring JDBC Template常用方法介绍【execute()、update()、query()】
本篇文章我们将通过一个学生管理综合案例来介绍一下Jdbc Template类中的常用方法。
一、项目基本文件创建
1、按照我们1.2节的方法创建一个Maven项目,并在pom.xml中导入以下依赖:
2、在资源文件夹下创建applicationContext.xml,在里面添加上我们4.1节中介绍的JDBC配置的XML文件:

完整的文件如下:
这里需要注意我们4.1节中提到的几点,时区、驱动包名称、SSL协议等是否按照要求配置好。
设置数据库用户名、密码(自己数据库的,这里作者的用户名和密码均为root)
注意这里的JDBC模板的配置:
配置JDBC模板,首先引入dataSource数据源,接着给Dao实现类中的私有属性JDBCtemplate注入jdbctemplate值(注意:对象的注入使用ref属性)。
3、创建数据库:
数据库SQL语句:
4、创建实体类Student
创建实体类Student,并为其设置4个私有属性,id、name、sex、born。

分别创建他们的含参、无参构造方法,getter、setter方法、toString方法。

完整代码如下:
5、创建StudentDao接口类,定义对存储在数据库的数据的操作方法。
这里我们为了每一种Jdbc Template类中的方法都照顾到,我会定义较多的数据库操作方法来使用Template类中的方法。
在StudentDao中定义findAllStudent()、addStudent(Student student)、updateStudent(Student student)、deleteStudent(int id)、findStudentById(int id)
除此之外,为了介绍execute()方法,我还会单独创建一个测试类,用于execute()方法的运用。

完整代码如下:
6、创建实现类StudentDaoImpl
该实现类用于实现StudentDao中为实现的方法。
首先我们需要先定义一个私有属性JdbcTemplate,用该属性来调用update方法。
代码如下:
实现接口中为实现的方法,StudentDaoImpl就创建完成了。
之后再创建测试类,对StudentDaoImpl中的方法进行测试即可。
二、update()、query()、execute()方法介绍(实现StudentDao中未实现的方法)
接下来编写的update()、query()的代码将编写在StudentDaoImpl.java.中
1、Update()方法
在 Spring Jdbc中,update()方法可以完成插入、更新和删除数据的操作。其中几个常用的update方法的重载如下介绍。

这里最为常用的就是第三个和第四个(一些简单的查询也会使用到第一个和第二个)
接下来,我们实现一下使用update方法的数据库操作方法。
1》addStudent()
首先我们想一下向数据库里面添加数据的SQL语句:insert into course(id,name,sex,born) values(1001,'zhangsan',男,2001-1-2);
这里面需要的参数是非常多的,尤其是表项比较多的时候。参数多的话,可以使用我们上面表中提到的 int update(String sql,Object..args)方法,它可以将多个SQL语句中使用到的参数以一个数组的形式封装起来,整体进行参数传递。它返回的int值是受影响的行数,并且需要注意的是,参数数组不能为空。
这样思路就会很清晰,根据方法需要的参数,我们肯定需要一个SQL语句,并且需要将SQL语句中的参数用数组进行封装整体传入,这样问题就解决了。
代码如下:
首先定义SQL语句,用到的参数使用“?”进行占位,然后定义一个对象类型数组将SQL语句中使用到的参数保存于此。这里使用的是 int update(String sql,Object..args)方法,该方法有两个参数,一个是SQL语句,另一个是SQL语句需要的所有参数。这里要求SQL语句所需要的参数不能为空,否则或报错。
2》updateStudent()
首先我们想一下向数据库里面添加数据的SQL语句:UPDATE student SET name=“zhangsan”,sex=”男“,born=2003-09-08 WHERE id=1
这里也需要向SQL语句传递很多参数,所以思路和上面添加学的生方法是一样的思路,这里就直接给出代码来了:
3》deleteStudent(int id)
首先我们来想一下删除一个学生的SQL语句:DELETE FROM student WHERE id =1
这里SQL语句中只含有一个参数,并不是有很多参数,所以我们可以使用表中的第三个方法
update(String sql ,PreparedStatementSetter pss),这里的参数就是一个了。
所以本次的代码就很简单了,参数值不在需要使用getter方法进行获取,而是直接作为一个形式参数传到函数中。
代码直接给大家了:
2、query()方法
该方法主要用于处理数据库表的各种查询操作。具体介绍如下表:

我们实现一下使用query方法的数据库操作方法。
1》findAllStudent()
首先我们来想一下查找一个数据表中所有表项的SQL语句:select * from student 。
在该条语句中,没有任何的参数进行传递,因此我们可以选用表项中的第一个方法List query(sql,rowMapper),该方法共有两个参数,其中一个是要被执行的SQL语句,另一个是一个rowMapper对象,用于将结果包装成一个rowMapper对象,该对象的结果会与数据库表项属性一一对应,最终该方法会返回一个List结果。
这里思路非常清晰,我们直接定义一个SQL语句,把他传给query方法,query再返回一个list结果集,这就是我们想要i的。
直接代码奉上:

这里先定义一个SQL语句,用于查找所有学生,再创建一个RowMapper对象,用于存储返回的查询结果。
2》findStudentById(int id)
老规矩,我们还是先想一下根据id查询表项的SQL语句:SELECT * FROM student WHERE id=1 .可以看到,这里使用到了一个参数,就是id值。而且我们再细心观察一下,通过id值找到的表项是单行记录(id是唯一值)。因此我们使用的query函数必须可以传递SQL语句中的值,还得返回单行记录才能实现该功能。所以我们可以使用表格中第四个方法 queryForObject(sql,rowMapper,id),该方法有三个参数,第一个是要被执行的SQL语句,第二个是以List形式返回结果的rowMapper对象参数,第三个是SQL语句所需要的参数值。
国际惯例,这里直接将代码给到大家,大家可以理一下思路:

3、execute()方法
首先我们来看一下该方法的语法格式:execute(SQL语句),该方法中只存在一个参数,由此我们可以得出该方法的作用就是执行SQL语句,至于SQL语句的参数需要我们直接写在SQL语句中。由于该方法与sqlyog或者navicat中执行SQL语句的方法非常像,这里就举一个简单的例子给大家了解一下该方法的使用方法。
例子:插入学生信息:
从这里我们可以看到使用execute方法只需要i在测试类中初始化spring容器、在spring容器中获取JdbcTemplate实例用于调用execute方法,在其中插入SQL语句就可以执行。
三、编写测试类,对上述方法进行逐一验证
1、addStudent()
编写addStudentTest
运行测试类:

数据库:

2、updateStudent()
创建Student_Update_Test.java
运行测试类:

数据库:

3、deleteStudent(int id)
创建测试类Student_Delete_Test()
运行结果:

数据库:

4、findAllStudent()
创建测试类Student_Find_All_Test.java
运行测试类:

5、findStudentById(int id)
创建测试类Student_Find_By_Id_Test().java
运行测试类:

查询成功。
到这里,我们对于三种常用方法的介绍就告一段落了,接下来我会介绍一下我在项目中遇到的一些问题。
四、代码调试(DeBug)
1、查询结果中,生日这一属性为null。

我这里的错误原因是因为实体类的属性名和数据库的字段名称没有一一对应,简单来说就是Student类里面写的是birthday,而数据库中写的确是born。
这里我将他们改成一致的名称就可以了。

运行结果:

2、参数传递错误:
错误截图:

错误信息:
关键性信息翻译:
可以看到,某一个函数的形参有两个,但是传参的时候第二个参数是空的。
根据提示信息可以看到是(StudentDaoImpl.java:45)文件的45行出现了问题。
问题锁定:

就是这个update方法第二参数为空,我尝试输出该属组对象,只能输出其地址,于是我仔细检查了一下,发现是典型的语法错误:

数组在定义时,没有加上大括号,导致数组构建失败,从而使得第二个参数为空导致错误。

修改完成后再次运行

五、知识拓展
1、常用SQL语句格式
2、JDBC驱动配置小细节:
JDBC驱动配置小细节:较新版本的Java需要使用的JDBC的驱动为:com.mysql.cj.jdbc.Driver。并且需要设置时区serverTimezone=GMT%2B8
3、BeanPropertyRowMapper 的用法
将数据库查询结果转换为Java类对象。 常应用于使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应。
以上就是本篇文章的所有内容,感谢你能看到这里。欢迎大家关注,一起学习Spring,一起进步。