Spring JDBC

1. Spring JDBC 的概念

Spring 为了提供对 JDBC 的支持,在 JDBC 的基础上封装了一套实现,以此建立了一个 JDBC 存取框架,就是 Spring JDBC。

2. Spring JDBC 的作用

使用传统的 JDBC 实现中,JDBC 操作会有很多重复的代码,而 Spring JDBC 提供了一个 JdbcTemplate 对象来简化 JDBC 的操作

3. Spring JDBC 的使用步骤

  1. 导入 Spring JDBC 的 jar 包,右键 Add as Library

    • commons-logging-1.2.jar
    • spring-beans-5.0.0.RELEASE.jar
    • spring-core-5.0.0.RELEASE.jar
    • spring-jdbc-5.0.0.RELEASE.jar
    • spring-tx-5.0.0.RELEASE.jar
  2. 创建 JdbcTemplate 对象(需要传入 DataSource 对象)

    JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
    
  3. 调用 JdbcTemplate 的方法

    • int update(String sql, Object… args)

      • 功能:执行DML语句(增、删、改)
    • Map<String, Object> queryForMap(String sql, Object… args)

      • 功能:查询结果并将结果集封装为 map 集合,将列名作为 key,将值作为 value

      • 注意:这个方法只能查询一条记录,结果集长度只能为 1

    • List<Map<String, Object>> queryForList(String sql, Object… args)

      • 功能:查询结果并将结果集封装为 list 集合

      • 注意:这个方法将每一条记录封装为一个 Map 集合,再将 Map 集合装载到 List 集合中

    • List query(String sql, RowMapper rowMapper)

      • 功能:查询结果,将结果封装为 JavaBean 对象

      • 注意:RowMapper 是一个接口,用来将数据自动封装到 JavaBean 中。一般我们使用 BeanPropertyRowMapper 的对象作为 RowMapper 类型的参数。(BeanPropertyRowMapper 类是 RowMapper 接口的实现类)

        new BeanPropertyRowMapper<类型>(类型.class)
        
    • T queryForObject(String sql, Class class, Object… args)

      • 功能:查询结果,将结果封装为对象

4. Spring JDBC 的练习

  1. 需求

    1. 修改张三的年龄为 21 岁
    2. 添加一条记录:小明 19岁 2班
    3. 删除刚才添加的记录
    4. 查询 id 为 1 的记录,将其封装为 Map 集合
    5. 查询所有记录,将其封装为 List 集合
    6. 查询所有记录,将其封装为 Student 对象的 List 集合
    7. 查询总记录数
  2. 编码实现

    1. 创建 Student 类

      package com.zt.datasource.domain;
      
      public class Student {
          // 注意这里定义的是包装类,而不是基本数据类型,因为基本数据类型不能为 null
          private Integer id;
          private String name;
          private Integer age;
          private Integer class_id;
      
          public Student() {
          }
      
          public Student(Integer id, String name, Integer age, Integer class_id) {
              this.id = id;
              this.name = name;
              this.age = age;
              this.class_id = class_id;
          }
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public Integer getAge() {
              return age;
          }
      
          public void setAge(Integer age) {
              this.age = age;
          }
      
          public Integer getClass_id() {
              return class_id;
          }
      
          public void setClass_id(Integer class_id) {
              this.class_id = class_id;
          }
      
          @Override
          public String toString() {
              return "Student{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", age=" + age +
                      ", class_id=" + class_id +
                      '}';
          }
      }
      
      
    2. 创建测试类

      package com.zt.datasource.jdbctemplate;
      
      import com.zt.datasource.domain.Student;
      import com.zt.datasource.utils.JDBCUtils;
      import org.junit.Test;
      import org.springframework.jdbc.core.BeanPropertyRowMapper;
      import org.springframework.jdbc.core.JdbcTemplate;
      
      import java.util.List;
      import java.util.Map;
      
      
      public class JDBCTemplateDemo2 {
          // 创建 JdbcTemplate 对象
          private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
      
          /**
           * 修改张三的年龄为 21 岁
           */
          @Test
          public void test1(){
              String sql = "update stu set age = 21 where name = ?";
              jdbcTemplate.update(sql,"张三");
          }
      
          /**
           * 添加一条记录:小明 19岁 2班
           */
          @Test
          public void test2(){
              String sql = "insert into stu values(?,?,?,?)";
              jdbcTemplate.update(sql,null,"小明",19,2);
          }
      
          /**
           * 删除刚才添加的记录
           */
          @Test
          public void test3(){
              String sql = "delete from stu where name = ?";
              jdbcTemplate.update(sql,"小明");
          }
      
          /**
           * 查询 id 为 1 的记录,将其封装为 Map 集合
           */
          @Test
          public void test4(){
              String sql = "select * from stu where id = ?";
              Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql, 1);
              for (String s : stringObjectMap.keySet()) {
                  System.out.println(s+":"+stringObjectMap.get(s));
              }
          }
      
          /**
           * 查询所有记录,将其封装为 List 集合
           */
          @Test
          public void test5(){
              String sql = "select * from stu";
              List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
              for (Map<String, Object> map : maps) {
                  System.out.println(map);
              }
          }
      
          /**
           * 查询所有记录,将其封装为 Student 对象的 List 集合
           */
          @Test
          public void test6(){
              String sql = "select * from stu";
              List<Student> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
              for (Student student : query) {
                  System.out.println(student);
              }
          }
      
          /**
           * 查询总记录数
           */
          @Test
          public void test7(){
              String sql = "select count(id) from stu";
              Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
              System.out.println(integer);
          }
      
      
      }
      
### Spring JDBC 使用教程 #### JdbcTemplate 类介绍 Spring框架简化了Java数据库连接(JDBC)编程,创建了一个名为`JdbcTemplate`的模板类 `org.springframework.jdbc.core.JdbcTemplate`[^2]。此模板类封装了许多繁琐的任务,比如资源获取和释放、异常处理以及执行SQL语句。 #### 配置 JdbcTemplate 实例 为了使用`JdbcTemplate`, 开发者需先定义一个数据源(`DataSource`)并将其注入到`JdbcTemplate`实例中: ```xml <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> ``` 这段XML配置文件片段展示了如何声明一个`JdbcTemplate` bean, 并通过属性设置关联的数据源对象[^1]。 #### 执行查询操作 利用`JdbcTemplate`可以方便地执行各种类型的SQL命令,包括但不限于SELECT查询: ```java List<Map<String, Object>> rows = jdbcTemplate.queryForList("SELECT * FROM users"); for (Map<String, Object> row : rows){ System.out.println(row); } ``` 上述代码演示了怎样调用`queryForList()`方法来运行一条简单的全表扫描查询,并打印每一行记录的结果集。 ### 常见问题解决方案 当遇到与Spring JDBC有关的问题时,可以从以下几个方面着手排查: - **无法找到驱动程序**: 如果应用程序抛出了类似于“找不到合适的Driver”的错误,则可能是由于缺少必要的JDBC驱动库造成的。确保已将相应的jar包加入classpath路径下。 - **事务管理失败**: 当尝试提交或回滚事务却未达到预期效果时,应检查是否正确设置了传播行为(propagation behavior),并且确认所有的DAO层方法都处于同一个事务上下文中工作[^3]. - **性能优化不足**: 对于大规模读取场景下的低效表现,考虑采用分页加载策略或者批量更新方式提升效率;另外还可以评估一下是否有更好的索引结构可用以加速特定模式下的检索速度[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bm1998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值