文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊 Spring 数据库开发

2024-12-02 18:43

关注

1. Spring JDBC

Spring JDBC模块有什么作用?

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

Spring JdbcTemplate的解析

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

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

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

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

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

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

Spring JDBC的配置

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

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

  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.   
  18.  -- 2配置JDBC模板 --> 
  19.  "jdbcTemplate"  
  20.      class="org.springframework.jdbc.core.JdbcTemplate"
  21.   -- 默认必须使用数据源 --> 
  22.   name="dataSource" ref="dataSource" /> 
  23.   
  24.   
  25.  --定义id为accountDao的Bean--> 
  26.  "accountDao" class="com.nateshao.jdbc.AccountDaoImpl"
  27.   -- 将jdbcTemplate注入到accountDao实例中 --> 
  28.   name="jdbcTemplate" ref="jdbcTemplate" /> 
  29.   
  30.   
  31.  

 

 

 

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

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

2. Spring JdbcTemplate的常用方法

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

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

execute()

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

Spring.sql

  1. CREATE DATABASE  IF NOT EXISTS `spring` ; 
  2.  
  3. USE `spring`; 
  4.  
  5.  
  6.  
  7. DROP TABLE IF EXISTS `account`; 
  8.  
  9. CREATE TABLE `account` ( 
  10.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  11.   `username` varchar(50) DEFAULT NULL
  12.   `balance` double DEFAULT NULL
  13.   PRIMARY KEY (`id`) 
  14. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 
  15.  
  16.  
  17.  
  18. insert  into `account`(`id`,`username`,`balance`) values (2,'shaotongjie',2222),(3,'1',2222),(4,'a',2022),(5,'b',2322); 

Account.java

  1. package com.nateshao.jdbc; 
  2.  
  3.  
  4. @Data 
  5. public class Account { 
  6.     private Integer id;       // 账户id 
  7.     private String username; // 用户名 
  8.     private Double balance;  // 账户余额 

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.     
  18.    -- 2配置JDBC模板 --> 
  19.    "jdbcTemplate"  
  20.          class="org.springframework.jdbc.core.JdbcTemplate"
  21.       -- 默认必须使用数据源 --> 
  22.       name="dataSource" ref="dataSource" /> 
  23.     
  24.     
  25.    --定义id为accountDao的Bean--> 
  26.    "accountDao" class="com.nateshao.jdbc.AccountDaoImpl"
  27.       -- 将jdbcTemplate注入到accountDao实例中 --> 
  28.       name="jdbcTemplate" ref="jdbcTemplate" /> 
  29.     
  30.     
  31.  

AccountDao.java

  1. package com.nateshao.jdbc; 
  2.  
  3. import java.util.List; 
  4.  
  5.  
  6. public interface AccountDao { 
  7.     // 添加 
  8.     public int addAccount(Account account); 
  9.  
  10.     // 更新 
  11.     public int updateAccount(Account account); 
  12.  
  13.     // 删除 
  14.     public int deleteAccount(int id); 
  15.  
  16.     // 通过id查询 
  17.     public int queryAccountById(int id); 
  18.     // 查询所有账户 
  19.     public List findAllAccount(); 
  20.  
  21.     Account findAccountById(int i); 

AccountDaoImpl.java

  1. package com.nateshao.jdbc; 
  2.  
  3. import org.springframework.jdbc.core.BeanPropertyRowMapper; 
  4. import org.springframework.jdbc.core.JdbcTemplate; 
  5. import org.springframework.jdbc.core.RowMapper; 
  6. import java.util.List; 
  7.  
  8.  
  9. public class AccountDaoImpl implements AccountDao { 
  10.     // 声明JdbcTemplate属性及其setter方法 
  11.     private JdbcTemplate jdbcTemplate; 
  12.  
  13.     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
  14.         this.jdbcTemplate = jdbcTemplate; 
  15.     } 
  16.  
  17.      
  18.     public int addAccount(Account account) { 
  19.         // 定义SQL 
  20.         String sql = "insert into account(username,balance) value(?,?)"
  21.         // 定义数组来存放SQL语句中的参数 
  22.         Object[] obj = new Object[]{ 
  23.                 account.getUsername(), 
  24.                 account.getBalance() 
  25.         }; 
  26.         // 执行添加操作,返回的是受SQL语句影响的记录条数 
  27.         int num = this.jdbcTemplate.update(sql, obj); 
  28.         return num; 
  29.     } 
  30.  
  31.      
  32.     public int updateAccount(Account account) { 
  33.         // 定义SQL 
  34.         String sql = "update account set username=?,balance=? where id = ?"
  35.         // 定义数组来存放SQL语句中的参数 
  36.         Object[] params = new Object[]{ 
  37.                 account.getUsername(), 
  38.                 account.getBalance(), 
  39.                 account.getId() 
  40.         }; 
  41.         // 执行添加操作,返回的是受SQL语句影响的记录条数 
  42.         int num = this.jdbcTemplate.update(sql, params); 
  43.         return num; 
  44.     } 
  45.  
  46.      
  47.     public int deleteAccount(int id) { 
  48.         // 定义SQL 
  49.         String sql = "delete  from account where id = ? "
  50.         // 执行添加操作,返回的是受SQL语句影响的记录条数 
  51.         int num = this.jdbcTemplate.update(sql, id); 
  52.         return num; 
  53.     } 
  54.  
  55.     @Override 
  56.     public int queryAccountById(int id) { 
  57.         return 0; 
  58.     } 
  59.  
  60.      
  61.     public Account findAccountById(int id) { 
  62.         //定义SQL语句 
  63.         String sql = "select * from account where id = ?"
  64.         // 创建一个新的BeanPropertyRowMapper对象 
  65.         RowMapper rowMapper = 
  66.                 new BeanPropertyRowMapper(Account.class); 
  67.         // 将id绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录 
  68.         return this.jdbcTemplate.queryForObject(sql, rowMapper, id); 
  69.     } 
  70.  
  71.      
  72.     public List findAllAccount() { 
  73.         // 定义SQL语句 
  74.         String sql = "select * from account"
  75.         // 创建一个新的BeanPropertyRowMapper对象 
  76.         RowMapper rowMapper = 
  77.                 new BeanPropertyRowMapper(Account.class); 
  78.         // 执行静态的SQL查询,并通过RowMapper返回结果 
  79.         return this.jdbcTemplate.query(sql, rowMapper); 
  80.     } 
  81.  

测试类JdbcTemplateTest.java

  1. package com.nateshao.jdbc; 
  2.  
  3. import org.junit.jupiter.api.Test; 
  4. import org.springframework.context.ApplicationContext; 
  5. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  6. import org.springframework.jdbc.core.JdbcTemplate; 
  7. import java.util.List; 
  8.  
  9.  
  10. public class JdbcTemplateTest { 
  11.      
  12. // public static void main(String[] args) { 
  13. //    // 加载配置文件 
  14. //    ApplicationContext applicationContext = 
  15. //       new ClassPathXmlApplicationContext("applicationContext.xml"); 
  16. //    // 获取JdbcTemplate实例 
  17. //    JdbcTemplate jdTemplate = 
  18. //          (JdbcTemplate) applicationContext.getBean("jdbcTemplate"); 
  19. //    // 使用execute()方法执行SQL语句,创建用户账户管理表account 
  20. //    jdTemplate.execute("create table account(" + 
  21. //                      "id int primary key auto_increment," + 
  22. //                      "username varchar(50)," + 
  23. //                      "balance double)"); 
  24. //    System.out.println("账户表account创建成功!"); 
  25. // } 
  26.     @Test 
  27.     public void mainTest() { 
  28.         // 加载配置文件 
  29.         ApplicationContext applicationContext = 
  30.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  31.         // 获取JdbcTemplate实例 
  32.         JdbcTemplate jdTemplate = 
  33.                 (JdbcTemplate) applicationContext.getBean("jdbcTemplate"); 
  34.         // 使用execute()方法执行SQL语句,创建用户账户管理表account 
  35.         jdTemplate.execute("create table account(" + 
  36.                 "id int primary key auto_increment," + 
  37.                 "username varchar(50)," + 
  38.                 "balance double)"); 
  39.         System.out.println("账户表account创建成功!"); 
  40.     } 
  41.  
  42.     @Test 
  43.     public void addAccountTest() { 
  44.         // 加载配置文件 
  45.         ApplicationContext applicationContext = 
  46.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  47.         // 获取AccountDao实例 
  48.         AccountDao accountDao = 
  49.                 (AccountDao) applicationContext.getBean("accountDao"); 
  50.         // 创建Account对象,并向Account对象中添加数据 
  51.         Account account = new Account(); 
  52.         account.setUsername("千羽"); 
  53.         account.setBalance(1000.00); 
  54.         // 执行addAccount()方法,并获取返回结果 
  55.         int num = accountDao.addAccount(account); 
  56.         if (num > 0) { 
  57.             System.out.println("成功插入了" + num + "条数据!"); 
  58.         } else { 
  59.             System.out.println("插入操作执行失败!"); 
  60.         } 
  61.     } 
  62.  
  63.     @Test 
  64.     public void updateAccountTest() { 
  65.         // 加载配置文件 
  66.         ApplicationContext applicationContext = 
  67.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  68.         // 获取AccountDao实例 
  69.         AccountDao accountDao = 
  70.                 (AccountDao) applicationContext.getBean("accountDao"); 
  71.         // 创建Account对象,并向Account对象中添加数据 
  72.         Account account = new Account(); 
  73.         account.setId(1); 
  74.         account.setUsername("tom"); 
  75.         account.setBalance(2000.00); 
  76.         // 执行updateAccount()方法,并获取返回结果 
  77.         int num = accountDao.updateAccount(account); 
  78.         if (num > 0) { 
  79.             System.out.println("成功修改了" + num + "条数据!"); 
  80.         } else { 
  81.             System.out.println("修改操作执行失败!"); 
  82.         } 
  83.     } 
  84.  
  85.     @Test 
  86.     public void deleteAccountTest() { 
  87.         // 加载配置文件 
  88.         ApplicationContext applicationContext = 
  89.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  90.         // 获取AccountDao实例 
  91.         AccountDao accountDao = 
  92.                 (AccountDao) applicationContext.getBean("accountDao"); 
  93.         // 执行deleteAccount()方法,并获取返回结果 
  94.         int num = accountDao.deleteAccount(1); 
  95.         if (num > 0) { 
  96.             System.out.println("成功删除了" + num + "条数据!"); 
  97.         } else { 
  98.             System.out.println("删除操作执行失败!"); 
  99.         } 
  100.     } 
  101.  
  102.     @Test 
  103.     public void findAccountByIdTest() { 
  104.         // 加载配置文件 
  105.         ApplicationContext applicationContext = 
  106.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  107.         // 获取AccountDao实例 
  108.         AccountDao accountDao = 
  109.                 (AccountDao) applicationContext.getBean("accountDao"); 
  110.         // 执行findAccountById()方法 
  111.         Account account = accountDao.findAccountById(1); 
  112.         System.out.println(account); 
  113.     } 
  114.  
  115.     @Test 
  116.     public void findAllAccountTest() { 
  117.         // 加载配置文件 
  118.         ApplicationContext applicationContext = 
  119.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  120.         // 获取AccountDao实例 
  121.         AccountDao accountDao = 
  122.                 (AccountDao) applicationContext.getBean("accountDao"); 
  123.         // 执行findAllAccount()方法,获取Account对象的集合 
  124.         List account = accountDao.findAllAccount(); 
  125.         // 循环输出集合中的对象 
  126.         for (Account act : account) { 
  127.             System.out.println(act); 
  128.         } 
  129.     } 

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

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

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

update()

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

 

query()

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

总结

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

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

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

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

 

来源:程序员千羽内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯