服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 聊聊 Spring 数据库开发

聊聊 Spring 数据库开发

2021-10-29 22:51程序员千羽 Java教程

Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。

聊聊 Spring 数据库开发

  • 1. Spring JDBC
  • Spring JDBC的配置
  • 2. Spring JdbcTemplate的常用方法
    • execute()
  • 总结

GitHub:https://github.com/nateshao/ssm/tree/master/104-spring-jdbc

聊聊 Spring 数据库开发

1. Spring JDBC

Spring JDBC模块有什么作用?

Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。

Spring JdbcTemplate的解析

针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,JdbcTemplate类是Spring JDBC的核心类。

JdbcTemplate类的继承结构具体如下图所示:

聊聊 Spring 数据库开发

从JdbcTemplate的继承关系图可以看出,JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性。

DataSource:其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。

SQLExceptionTranslator:该接口负责对SQLException进行转译工作。通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate在需要处理SQLException时,委托SQLExceptionTranslator的实现类来完成相关的转译工作。

而JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。

Spring JDBC的配置

Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包)。

聊聊 Spring 数据库开发

从上表可以看出,Spring对数据库的操作都封装在了这几个包中,而想要使用Spring JDBC,就需要对其进行配置。

聊聊 Spring 数据库开发

  1. "1.0"encoding="UTF-8"?>
  2. "http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
  6. --1配置数据源-->
  7. "dataSource"class=
  8. "org.springframework.jdbc.datasource.DriverManagerDataSource">
  9. --数据库驱动-->
  10. name="driverClassName"value="com.mysql.jdbc.Driver"/>
  11. --连接数据库的url-->
  12. name="url"value="jdbc:mysql://localhost:3306/spring"/>
  13. --连接数据库的用户名-->
  14. name="username"value="root"/>
  15. --连接数据库的密码-->
  16. name="password"value="123456"/>
  17. --2配置JDBC模板-->
  18. "jdbcTemplate"
  19. class="org.springframework.jdbc.core.JdbcTemplate">
  20. --默认必须使用数据源-->
  21. name="dataSource"ref="dataSource"/>
  22. --定义id为accountDao的Bean-->
  23. "accountDao"class="com.nateshao.jdbc.AccountDaoImpl">
  24. --将jdbcTemplate注入到accountDao实例中-->
  25. name="jdbcTemplate"ref="jdbcTemplate"/>



关于上述示例dataSource配置中的4个属性说明,如下表所示:

聊聊 Spring 数据库开发

注意:上表中的属性值在实际配置时,需要根据数据库类型和设置进行相应配置。

2. Spring JdbcTemplate的常用方法

“在JdbcTemplate核心类中,提供了大量的更新和查询数据库的方法,我们就是使用的这些方法来操作数据库的。

execute( ):execute(String sql)方法可用于执行sql语句update():update())用于执行插入、更新和删除操作query():query()用于执行数据查询操作

execute()

使用execute(String sql)方法执行建表的案例实现步骤如下:

  • 在MySQL中创建一个名为spring的数据库;
  • 创建Web项目,导入相关maven包;
  • 创建Spring配置文件,配置数据源和JDBC模板;
  • 创建测试类,
  • 测试程序。

Spring.sql

  1. CREATEDATABASEIFNOTEXISTS`spring`;
  2. USE`spring`;
  3. /*Tablestructurefortable`account`*/
  4. DROPTABLEIFEXISTS`account`;
  5. CREATETABLE`account`(
  6. `id`int(11)NOTNULLAUTO_INCREMENT,
  7. `username`varchar(50)DEFAULTNULL,
  8. `balance`doubleDEFAULTNULL,
  9. PRIMARYKEY(`id`)
  10. )ENGINE=InnoDBAUTO_INCREMENT=6DEFAULTCHARSET=utf8;
  11. /*Dataforthetable`account`*/
  12. insertinto`account`(`id`,`username`,`balance`)values(2,'shaotongjie',2222),(3,'1',2222),(4,'a',2022),(5,'b',2322);

Account.java

  1. packagecom.nateshao.jdbc;
  2. /**
  3. *@dateCreatedby邵桐杰on2021/10/1515:50
  4. *@微信公众号程序员千羽
  5. *@个人网站www.nateshao.cn
  6. *@博客https://nateshao.gitee.io
  7. *@GitHubhttps://github.com/nateshao
  8. *@Giteehttps://gitee.com/nateshao
  9. *Description:
  10. */
  11. @Data
  12. publicclassAccount{
  13. privateIntegerid;//账户id
  14. privateStringusername;//用户名
  15. privateDoublebalance;//账户余额
  16. }

applicationContext.xml

  1. "1.0"encoding="UTF-8"?>
  2. "http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
  6. --1配置数据源-->
  7. "dataSource"class=
  8. "org.springframework.jdbc.datasource.DriverManagerDataSource">
  9. --数据库驱动-->
  10. name="driverClassName"value="com.mysql.jdbc.Driver"/>
  11. --连接数据库的url-->
  12. name="url"value="jdbc:mysql://localhost:3306/spring?useSSL=false"/>
  13. --连接数据库的用户名-->
  14. name="username"value="root"/>
  15. --连接数据库的密码-->
  16. name="password"value="123456"/>
  17. --2配置JDBC模板-->
  18. "jdbcTemplate"
  19. class="org.springframework.jdbc.core.JdbcTemplate">
  20. --默认必须使用数据源-->
  21. name="dataSource"ref="dataSource"/>
  22. --定义id为accountDao的Bean-->
  23. "accountDao"class="com.nateshao.jdbc.AccountDaoImpl">
  24. --将jdbcTemplate注入到accountDao实例中-->
  25. name="jdbcTemplate"ref="jdbcTemplate"/>

AccountDao.java

  1. packagecom.nateshao.jdbc;
  2. importjava.util.List;
  3. /**
  4. *@dateCreatedby邵桐杰on2021/10/1515:50
  5. *@微信公众号程序员千羽
  6. *@个人网站www.nateshao.cn
  7. *@博客https://nateshao.gitee.io
  8. *@GitHubhttps://github.com/nateshao
  9. *@Giteehttps://gitee.com/nateshao
  10. *Description:
  11. */
  12. publicinterfaceAccountDao{
  13. //添加
  14. publicintaddAccount(Accountaccount);
  15. //更新
  16. publicintupdateAccount(Accountaccount);
  17. //删除
  18. publicintdeleteAccount(intid);
  19. //通过id查询
  20. publicintqueryAccountById(intid);
  21. //查询所有账户
  22. publicListfindAllAccount();
  23. AccountfindAccountById(inti);
  24. }

AccountDaoImpl.java

  1. packagecom.nateshao.jdbc;
  2. importorg.springframework.jdbc.core.BeanPropertyRowMapper;
  3. importorg.springframework.jdbc.core.JdbcTemplate;
  4. importorg.springframework.jdbc.core.RowMapper;
  5. importjava.util.List;
  6. /**
  7. *@dateCreatedby邵桐杰on2021/10/1515:55
  8. *@微信公众号程序员千羽
  9. *@个人网站www.nateshao.cn
  10. *@博客https://nateshao.gitee.io
  11. *@GitHubhttps://github.com/nateshao
  12. *@Giteehttps://gitee.com/nateshao
  13. *Description:
  14. */
  15. publicclassAccountDaoImplimplementsAccountDao{
  16. //声明JdbcTemplate属性及其setter方法
  17. privateJdbcTemplatejdbcTemplate;
  18. publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){
  19. this.jdbcTemplate=jdbcTemplate;
  20. }
  21. /**
  22. *添加账户
  23. *@paramaccount
  24. *@return
  25. */
  26. publicintaddAccount(Accountaccount){
  27. //定义SQL
  28. Stringsql="insertintoaccount(username,balance)value(?,?)";
  29. //定义数组来存放SQL语句中的参数
  30. Object[]obj=newObject[]{
  31. account.getUsername(),
  32. account.getBalance()
  33. };
  34. //执行添加操作,返回的是受SQL语句影响的记录条数
  35. intnum=this.jdbcTemplate.update(sql,obj);
  36. returnnum;
  37. }
  38. /**
  39. *更新账户
  40. *@paramaccount
  41. *@return
  42. */
  43. publicintupdateAccount(Accountaccount){
  44. //定义SQL
  45. Stringsql="updateaccountsetusername=?,balance=?whereid=?";
  46. //定义数组来存放SQL语句中的参数
  47. Object[]params=newObject[]{
  48. account.getUsername(),
  49. account.getBalance(),
  50. account.getId()
  51. };
  52. //执行添加操作,返回的是受SQL语句影响的记录条数
  53. intnum=this.jdbcTemplate.update(sql,params);
  54. returnnum;
  55. }
  56. /**
  57. *删除账户
  58. *@paramid
  59. *@return
  60. */
  61. publicintdeleteAccount(intid){
  62. //定义SQL
  63. Stringsql="deletefromaccountwhereid=?";
  64. //执行添加操作,返回的是受SQL语句影响的记录条数
  65. intnum=this.jdbcTemplate.update(sql,id);
  66. returnnum;
  67. }
  68. @Override
  69. publicintqueryAccountById(intid){
  70. return0;
  71. }
  72. /**
  73. *通过id查询账户数据信息
  74. *@paramid
  75. *@return
  76. */
  77. publicAccountfindAccountById(intid){
  78. //定义SQL语句
  79. Stringsql="select*fromaccountwhereid=?";
  80. //创建一个新的BeanPropertyRowMapper对象
  81. RowMapperrowMapper=
  82. newBeanPropertyRowMapper(Account.class);
  83. //将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录
  84. returnthis.jdbcTemplate.queryForObject(sql,rowMapper,id);
  85. }
  86. /**
  87. *查询所有账户信息
  88. *@return
  89. */
  90. publicListfindAllAccount(){
  91. //定义SQL语句
  92. Stringsql="select*fromaccount";
  93. //创建一个新的BeanPropertyRowMapper对象
  94. RowMapperrowMapper=
  95. newBeanPropertyRowMapper(Account.class);
  96. //执行静态的SQL查询,并通过RowMapper返回结果
  97. returnthis.jdbcTemplate.query(sql,rowMapper);
  98. }
  99. }

测试类JdbcTemplateTest.java

  1. packagecom.nateshao.jdbc;
  2. importorg.junit.jupiter.api.Test;
  3. importorg.springframework.context.ApplicationContext;
  4. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  5. importorg.springframework.jdbc.core.JdbcTemplate;
  6. importjava.util.List;
  7. /**
  8. *@dateCreatedby邵桐杰on2021/10/1515:57
  9. *@微信公众号程序员千羽
  10. *@个人网站www.nateshao.cn
  11. *@博客https://nateshao.gitee.io
  12. *@GitHubhttps://github.com/nateshao
  13. *@Giteehttps://gitee.com/nateshao
  14. *Description:
  15. */
  16. publicclassJdbcTemplateTest{
  17. /**
  18. *使用execute()方法建表
  19. */
  20. //publicstaticvoidmain(String[]args){
  21. ////加载配置文件
  22. //ApplicationContextapplicationContext=
  23. //newClassPathXmlApplicationContext("applicationContext.xml");
  24. ////获取JdbcTemplate实例
  25. //JdbcTemplatejdTemplate=
  26. //(JdbcTemplate)applicationContext.getBean("jdbcTemplate");
  27. ////使用execute()方法执行SQL语句,创建用户账户管理表account
  28. //jdTemplate.execute("createtableaccount("+
  29. //"idintprimarykeyauto_increment,"+
  30. //"usernamevarchar(50),"+
  31. //"balancedouble)");
  32. //System.out.println("账户表account创建成功!");
  33. //}
  34. @Test
  35. publicvoidmainTest(){
  36. //加载配置文件
  37. ApplicationContextapplicationContext=
  38. newClassPathXmlApplicationContext("applicationContext.xml");
  39. //获取JdbcTemplate实例
  40. JdbcTemplatejdTemplate=
  41. (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
  42. //使用execute()方法执行SQL语句,创建用户账户管理表account
  43. jdTemplate.execute("createtableaccount("+
  44. "idintprimarykeyauto_increment,"+
  45. "usernamevarchar(50),"+
  46. "balancedouble)");
  47. System.out.println("账户表account创建成功!");
  48. }
  49. @Test
  50. publicvoidaddAccountTest(){
  51. //加载配置文件
  52. ApplicationContextapplicationContext=
  53. newClassPathXmlApplicationContext("applicationContext.xml");
  54. //获取AccountDao实例
  55. AccountDaoaccountDao=
  56. (AccountDao)applicationContext.getBean("accountDao");
  57. //创建Account对象,并向Account对象中添加数据
  58. Accountaccount=newAccount();
  59. account.setUsername("千羽");
  60. account.setBalance(1000.00);
  61. //执行addAccount()方法,并获取返回结果
  62. intnum=accountDao.addAccount(account);
  63. if(num>0){
  64. System.out.println("成功插入了"+num+"条数据!");
  65. }else{
  66. System.out.println("插入操作执行失败!");
  67. }
  68. }
  69. @Test
  70. publicvoidupdateAccountTest(){
  71. //加载配置文件
  72. ApplicationContextapplicationContext=
  73. newClassPathXmlApplicationContext("applicationContext.xml");
  74. //获取AccountDao实例
  75. AccountDaoaccountDao=
  76. (AccountDao)applicationContext.getBean("accountDao");
  77. //创建Account对象,并向Account对象中添加数据
  78. Accountaccount=newAccount();
  79. account.setId(1);
  80. account.setUsername("tom");
  81. account.setBalance(2000.00);
  82. //执行updateAccount()方法,并获取返回结果
  83. intnum=accountDao.updateAccount(account);
  84. if(num>0){
  85. System.out.println("成功修改了"+num+"条数据!");
  86. }else{
  87. System.out.println("修改操作执行失败!");
  88. }
  89. }
  90. @Test
  91. publicvoiddeleteAccountTest(){
  92. //加载配置文件
  93. ApplicationContextapplicationContext=
  94. newClassPathXmlApplicationContext("applicationContext.xml");
  95. //获取AccountDao实例
  96. AccountDaoaccountDao=
  97. (AccountDao)applicationContext.getBean("accountDao");
  98. //执行deleteAccount()方法,并获取返回结果
  99. intnum=accountDao.deleteAccount(1);
  100. if(num>0){
  101. System.out.println("成功删除了"+num+"条数据!");
  102. }else{
  103. System.out.println("删除操作执行失败!");
  104. }
  105. }
  106. @Test
  107. publicvoidfindAccountByIdTest(){
  108. //加载配置文件
  109. ApplicationContextapplicationContext=
  110. newClassPathXmlApplicationContext("applicationContext.xml");
  111. //获取AccountDao实例
  112. AccountDaoaccountDao=
  113. (AccountDao)applicationContext.getBean("accountDao");
  114. //执行findAccountById()方法
  115. Accountaccount=accountDao.findAccountById(1);
  116. System.out.println(account);
  117. }
  118. @Test
  119. publicvoidfindAllAccountTest(){
  120. //加载配置文件
  121. ApplicationContextapplicationContext=
  122. newClassPathXmlApplicationContext("applicationContext.xml");
  123. //获取AccountDao实例
  124. AccountDaoaccountDao=
  125. (AccountDao)applicationContext.getBean("accountDao");
  126. //执行findAllAccount()方法,获取Account对象的集合
  127. Listaccount=accountDao.findAllAccount();
  128. //循环输出集合中的对象
  129. for(Accountact:account){
  130. System.out.println(act);
  131. }
  132. }
  133. }

聊聊 Spring 数据库开发

聊聊 Spring 数据库开发

多学一招:使用JUnit单元测试

在进行接口开发完成后,一般是写个单元测试or采用PostMan去测试,或者前端项目对接,一起调试。

在开发过程中,需要有相应的测试工作。依据测试目的不同,可以将软件测试分为单元测试、集成测试、确认测试和系统测试等。其中单元测试在软件开发阶段是最底层的测试,它易于及时发现并解决问题。JUnit就是一个进行单元测试的开源框架,下面以上个示例,来学习单元测试框架JUnit4的使用。

update()

update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中,提供了一系列的update()方法,其常用方法下表所示:

聊聊 Spring 数据库开发

query()

“JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中,常用的几个query()方法如下表所示:

聊聊 Spring 数据库开发

总结

这篇文章主要是对Spring框架中,使用JDBC进行数据操作的知识进行了详细讲解。

首先讲解了Spring JDBC中的核心类以及如何在Spring中配置JDBC,

然后通过案例讲解了Spring JDBC核心类JdbcTemplate中常用方法的使用。

通过这篇文章的学习,能够学会如何使用Spring框架进行数据库开发,并能深切的体会到Spring框架的强大。

原文链接:https://mp.weixin.qq.com/s/BvOzzcc2L9PUb4oXl4mxkw

延伸 · 阅读

精彩推荐