![Spring+Spring MVC+MyBatis从零开始学](https://wfqqreader-1252317822.image.myqcloud.com/cover/785/26542785/b_26542785.jpg)
4.2 Spring JdbcTemplate的常用方法
在JdbcTemplate类中提供了大量更新和查询数据库的方法,我们就是使用这些方法来操作数据库的。本节将介绍这些方法的使用。
4.2.1 execute()——执行SQL语句
execute(String sql)方法能够完成执行SQL语句的功能。
【示例4-1】下面以创建数据表的SQL语句为例演示此方法的使用,具体步骤如下。
步骤01 在MySQL中创建一个名为db_spring的数据库,如图4.1所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P53_7245.jpg?sign=1739350823-AHAogU6tOWvekmB6Z3e1ZiYuzmivqMLx-0-e91132f23db72c0cf2a4b2e230862580)
图4.1 创建数据库
在图4.1中,首先使用SQL语句创建了数据库db_spring,然后选择使用db_spring。为了便于后续验证数据表是通过execute( String sql)方法执行创建的,这里使用了show tables语句查看数据库中的表,其结果显示为空。
步骤02 在Eclipse中创建一个名为chapter04的Web项目,将运行Spring框架所需的5个基础JAR包、MySOL数据库的驱动JAR包、Spring JDBC的JAR包以及Spring事务处理的JAR包复制到项目的lib目录,并发布到类路径中。项目中所添加的JAR包如图4.2所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P53_7257.jpg?sign=1739350823-UmrxGaAIzXYYFdFNY9VrbzG4swB4M1s2-0-a4743cc786f3389667cd9dcdc025612c)
图4.2 Spring JDBC操作相关的JAR包
步骤03 在src目录下创建配置文件applicationContext.xml,在该文件中配置id为dataSource的数据源Bean和id为jdbcTemplate的JDBC模板Bean,并将数据源注入JDBC模板中,如文件4.1所示。
文件4.1 applicationContext.xml
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P53_45943.jpg?sign=1739350823-3PC3aX5XSOxeOgRILK4hVeH9YixeXylf-0-7acc77e983087298d4050b14b9c90ed8)
步骤04 在src目录下创建一个com.ssm.jdbc包,在该包中创建测试类JdbcTemplateTest。在该类的main()方法中通过Spring容器获取在配置文件中定义的JdbcTemplate实例,然后使用实例的execute(String s)方法执行创建数据表的SQL语句,如文件4.2所示。
文件4.2 JdbcTemplateTest.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P54_45947.jpg?sign=1739350823-niluX3NyszQaetCiDhfKP3Qt9fxPxjb4-0-f4c381647db724b2f82d2207cf14e209)
成功运行程序后,再次查询db_spring数据库,其结果如图4.3所示。从中可以看出,程序使用execute(String sql)方法执行的SQL语句已成功创建了数据表user。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P55_7560.jpg?sign=1739350823-8oLe9KkVg5GXzWq1xv89MP0KhzlKzjYo-0-48c99ca1930fabde359fc308ff17d2b3)
图4.3 db_spring数据库中的表
4.2.2 update()——更新数据
update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中提供了一系列update()方法,其常用格式如表4.3所示。
表4.3 JdbcTemplate类中常用的update()方法
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-T55_45952.jpg?sign=1739350823-YGuFzLwGU3LE4gOJhGJIHJI8F8cVVhGh-0-3cd71d0cd4e03a0accfbb3a59d7a7b8d)
【示例4-2】通过一个用户管理的案例来演示update()方法的使用,具体步骤如下。
步骤01 在chapter04项目的com.ssm.jdbc包中创建User类,在该类中定义id、username和password属性,以及其对应的getter()/ setter()方法,如文件4.3所示。
文件4.3 User.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P55_45951.jpg?sign=1739350823-wBQIDBAwGAZVfHv5665CzgWAESPEUp9n-0-5e1f856c3fb3714bbd673d52ec2415c2)
步骤02 在com.ssm.jdbc包中创建接口UserDao,并在接口中定义添加、更新和删除用户的方法,如文件4.4所示。
文件4.4 UserDao.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P56_45956.jpg?sign=1739350823-T5Jdu0oD22Q05VkhxfMCMPWuRkPdh7m8-0-9fd206b03df9f359678a892776203ac9)
步骤03 在com.ssm.jdbc包中创建UserDao接口的实现类UserDaoImpl,并在类中实现添加、更新和删除账户的方法,编辑后如文件4.5所示。
文件4.5 UserDaoImpl.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P56_45957.jpg?sign=1739350823-vcdQqwxJrXv1dlxBnKv2dL7kWz0skovi-0-c3dae153b3f16113c2a58e34d13c3eb0)
从上述3种操作的代码可以看出,添加、更新和删除操作的实现步骤类似,只是定义的SQL语句有所不同。
步骤04 在applicationContext.xml中定义一个id为userDao的Bean,该Bean用于将jdbcTemplate注入userDao实例中,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P57_45961.jpg?sign=1739350823-t9w3vzP8tW4Wsm4SaQtQe3P06t5WdJv8-0-35c0d90d3cc5543044b6a3a3f0573096)
步骤05 在测试类JdbcTemplateTest中添加一个测试方法addUserTest()。该方法主要用于添加用户信息,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P57_45962.jpg?sign=1739350823-1y320euXzz7N5whwstCXk7WGz9Oa5MqB-0-391790206c553455d397f5ee347397b5)
在上述代码中,获取UserDao的实例后又创建了User对象,并向User对象中添加了属性值。然后调用UserDao对象的addUser()方法向数据表中添加一条数据。最后,通过返回的受影响的行数来判断数据是否插入成功。
使用JUnit4测试运行后,控制台的输出结果如图4.4所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P58_8287.jpg?sign=1739350823-N6xURJD20AjVXTEUjiVrCPJxX5PagPvE-0-edec081d5f4a4f7b092b92b3a47cac3c)
图4.4 运行结果
此时再次查询数据库中的user表,其结果如图4.5所示。从中可以看出,使用JdbcTemplate的update()方法已成功地向数据表中插入了一条数据。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P58_8291.jpg?sign=1739350823-Yhy8QQ1bIoRQ8YL04c2AhbxtSksKFQrJ-0-efa2a0cb75fb359d117d2f9cab58de1c)
图4.5 运行结果
步骤06 执行完插入操作后,接下来使用JdbcTemplate类的update()方法执行更新操作。在测试类JdbcTemplateTest中添加一个测试方法updateUser Test(),其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P59_45964.jpg?sign=1739350823-wh81eg1KXxVfkAlG4371XLOvbQTTKjQQ-0-c900a1194139d62b6571420beb08d6a9)
与addUserTest()方法相比,更新操作的代码增加了id属性值的设置,并在将用户名和密码修改后调用了UserDao对象中的updateUser()方法执行对数据表的更新操作。使用JUnit4运行方法后,再次查询数据库中的user表,其结果如图4.6所示。从中可以看出,使用update()方法已成功更新了user表中id为1的用户的用户名和密码。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P59_8407.jpg?sign=1739350823-7ypXoCj59ty3ZbLrov3s2wpd1Xxsj7P5-0-2c97bd90b51da612c09e172f397b63af)
图4.6 运行结果
步骤07 在测试类JdbcTemplateTest中添加一个测试方法deleteUserTest()来执行删除操作,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P59_45965.jpg?sign=1739350823-mJTvSqpBWb3gCd2C7v4yOrK0dGwixtZm-0-534bdcd224c8571465d8a857f6d7436b)
在上述代码中,获取了UserDao的实例后,执行实例中的deleteUser()方法来删除id为1的数据。
使用JUnit4测试运行方法后,查询user表中的数据,其结果如图4.7所示。从中可以看出,已成功通过deleteUser()方法删除了id为1的数据。由于user表中只有一条数据,因此删除后表中数据为空。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P60_8500.jpg?sign=1739350823-Dnn4GaNOZXygCwBs7TxUqZ8rYjbkQ2hU-0-8a90ac54eae642419405acb8a7c728cb)
图4.7 运行结果
4.2.3 query()——查询数据
JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中常用的几个query()方法格式如表4.4所示。
表4.4 JdbcTemplate中常用的query()方法
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-T60_45967.jpg?sign=1739350823-zv2nPe1VZAS5bBM6bIZ90UeDoVYcliNz-0-e47fabcbd15bcd08c862fc7e0a1d2618)
【示例4-3】通过一个具体的案例演示query()方法的使用,其实现步骤如下。
步骤01 向数据表user中插入几条数据,插入后user表中的数据如图4.8所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P61_8596.jpg?sign=1739350823-yHYKJQgN8trIFsiQdhwNQrA2ap97qAGJ-0-532c617d229905b89c17eecc4b5ea142)
图4.8 运行结果
步骤02 在UserDao中分别创建一个通过id查询单个用户和查询所有用户的方法,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P61_46989.jpg?sign=1739350823-mgC8oQRZHRV7BqQw0SMKLyKJT2Nhkr5B-0-ca78b67405b38464259b375c4cbb6d53)
步骤03 在UserDao接口的实现类UserDaoImpl中实现接口中的方法,并使用query()方法分别进行查询,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P61_45970.jpg?sign=1739350823-ZESuNA2GguwMmKu8n3a0Lgd7iWTt8yGn-0-7df9f9f28ba3d6a697976a990cbe5f02)
在上面两个方法代码中,BeanPropertyRowMapper是RowMapper接口的实现类,可以自动地将数据表中的数据映射到用户自定义的类中(前提是用户自定义类中的字段要与数据表中的字段相对应)。创建完BeanPropertyRowMapper对象后,在findUserById()方法中通过queryForObject()方法返回了一个Object类型的单行记录,而在findAllUser()方法中通过query()方法返回了一个结果集合。
步骤04 在测试类 JdbcTemplateTest中添加一个测试方法findUserByIdTest()来测试条件查询,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P61_45971.jpg?sign=1739350823-wJOC7G5D6aiBSDDY8R6KpLoBsz1XgUqd-0-e7b84ce395f82267a3c494ccb1ad366b)
上述代码通过执行findUserById()方法获取了id为1的对象信息,并通过输出语句输出。使用JUnit4测试运行后,控制台的输出结果如图4.9所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P62_8779.jpg?sign=1739350823-lyIR5Edf90leE2x8E3Ix1vr3YRtgNf8T-0-31d2f508083b4dd8949e6173c6e3d6f6)
图4.9 运行结果
步骤05 在测试类JdbcTemplateTest中添加一个测试方法findAllUserTest()来测试所有用户信息,其代码如下所示。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P62_45973.jpg?sign=1739350823-pK2Ng7Td9lwxYIGKPda0Nhvhq1Jb0Upq-0-f131204887ae966954d9d4f6ca2cc918)
在上述代码中,调用了UserDao对象的findAllUser()方法查询所有用户账户信息,并通过for循环输出查询结果。
使用JUnit4成功运行findAllUser()方法后,控制台的显示信息如图4.10所示。从中可以看出,数据表user中的4条记录都已经被查询出来。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P62_8863.jpg?sign=1739350823-47oxCCR61VHZojHfd9VteHshJujsCbId-0-999238bf4a485bcebee5b4ce975d96e4)
图4.10 运行结果