Spring Boot 3.x Data(二)-JdbcTemplate详解

系列文章目录

系列文章:Spring Boot 3.x 系列教程



前言

本节将介绍如何使用JDBC核心类来控制基本的JDBC处理,包括错误处理。

数据库准备

本文已mysql5.7数据库为例:

DROP TABLE IF EXISTS `tb_student`;
CREATE TABLE `tb_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性别',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `grade` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '年级',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `tb_student` VALUES (1, '张三', 1, 14, '初中');
INSERT INTO `tb_student` VALUES (2, '李四', 1, 16, '高中');

引入依赖

        <!--jdbctemplate 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

配置数据源

spring:
  datasource:
    #数据库驱动完整类名
    driver-class-name: com.mysql.jdbc.Driver
    #数据库连接url
    url: jdbc:mysql://127.0.0.1:3306/spring-boot-data-learn
    #数据库用户名
    username: root
    #数据库密码
    password: 123456
  jdbc:
    template:
      fetch-size: -1
      max-rows: -1
      #查询超时。默认是使用JDBC驱动程序的默认配置。如果没有指定持续时间后缀,则使用seconds。
      query-timeout:

spring.jdbc.template.max-rows: 将此 Statement 对象生成的所有 ResultSet 对象可以包含的最大行数限制设置为给定数。最大以后的数据会被丢掉,设置这个参数虽然可以避免报内存错误,不过此方法局限性比较大,一般情况下是需要获取所有符合条件的数据。这个方法和limit类似。默认值-1,使用JDBC驱动程序的默认配置。

spring.jdbc.template.fetch-size:为 JDBC 驱动程序提供一个提示,它提示此 Statement 生成的 ResultSet 对象需要更多行时应该从数据库获取的行数。Spring Boot中默认值-1,使用JDBC驱动程序的默认配置(默认值为0一次性获取数据),在自动提交模式下无效,需设置autocommitfalse

jdbc fetch-size实现原理:
1、先在服务端执行查询后将数据缓存在服务端。
2、java端获取数据时,利用服务端游标进行指针跳动,如果fetchSize为1000,则一次性跳动1000条,返回给java端缓存起来。(耗时较短,跳动次数为N/1000)
3、在调用next函数时,优先从缓存中取数

JdbcTemplate自动配置

Spring的JdbcTemplateNamedParameterJdbcTemplate类在Spring Boot中自动配置的,你可以直接将它们@Autowire到你自己的bean中。

@Component
public class StudentDao {

    private final JdbcTemplate jdbcTemplate;

    public StudentDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void select(){
        this.jdbcTemplate.queryForList("select * from tb_student");
    }
}

执行SQL打印配置

logging:
  level:
    org.springframework.jdbc.core.JdbcTemplate: DEBUG

JdbcTemplate使用

JdbcTemplateJDBC核心包中的中心类,它处理资源的创建和释放,这有助于避免常见错误,比如忘记关闭连接。它执行核心JDBC工作流的基本任务(如语句创建和执行),而让应用程序代码提供SQL并提取结果。

JdbcTemplate类功能如下:

  • 运行SQL查询
  • update语句和存储过程调用
  • ResultSet实例进行迭代并提取返回的参数值。
  • 捕获JDBC异常并将其转换为泛型, 异常层次结构定义在org.springframework.dao包中。

查询(select)

下面的查询获取行数:

 public Integer count() {
       return this.jdbcTemplate.queryForObject("select count(*) from tb_student", Integer.class);
    }

下面的查询使用了一个绑定变量:

 public Integer countByName(String name) {
        return this.jdbcTemplate.queryForObject("select count(*) from tb_student where name=?", Integer.class, name);
    }
    @Test
    void daoTest() {
        Integer count = studentDao.countByName("张三");
    }
SQL statement [select count(*) from tb_student where name='张三']

下面的查询查找一个字符串:

 public String selectName(Integer id) {
        return this.jdbcTemplate.queryForObject("select name from tb_student where id=?", String.class, id);
    }
 @Test
    void daoTest() {
        studentDao.selectName(1);
    }
SQL statement [select name from tb_student where id=1]

查询并填充单个对象:

新建实体对象:

public class Student implements Serializable {
    private Integer id;
    private String name;
    private Integer sex;
    private Integer age;
    private String grade;
    //get set
}

新建查询:

  public Student selectById(Integer id) {
        return this.jdbcTemplate.queryForObject("select * from tb_student where id=?", (resultSet, rowNum) -> {
            Student student = new Student();
            student.setId(resultSet.getInt("id"));
            student.setName(resultSet.getString("name"));
            student.setSex(resultSet.getInt("sex"));
            student.setAge(resultSet.getInt("age"));
            student.setGrade(resultSet.getString("grade"));
            return student;
        }, id);
    }

测试:

 Student student=studentDao.selectById(1);
Student{id=1, name='张三', sex=1, age=14, grade='初中'}

查询并填充List对象:

  public List<Student> list() {
        return this.jdbcTemplate.query("select * form tb_student", (resultSet, rowNum) -> {
            Student student = new Student();
            student.setId(resultSet.getInt("id"));
            student.setName(resultSet.getString("name"));
            student.setSex(resultSet.getInt("sex"));
            student.setAge(resultSet.getInt("age"));
            student.setGrade(resultSet.getString("grade"));
            return student;
        });
    }

上面填充单个对象和List对象,有重复的代码,删除两个RowMapper lambda表达式中出现的重复,并将它们提取到一个字段中,然后根据需要由DAO方法引用,这样做是有意义的。

private final RowMapper<Student> studentRowMapper = (resultSet, rowNum) -> {
        Student student = new Student();
        student.setId(resultSet.getInt("id"));
        student.setName(resultSet.getString("name"));
        student.setSex(resultSet.getInt("sex"));
        student.setAge(resultSet.getInt("age"));
        student.setGrade(resultSet.getString("grade"));
        return student;
    };

public List<Student> list() {
        return this.jdbcTemplate.query("select * from tb_student", studentRowMapper);
    }

Update(INSERT, UPDATE, DELETE)

可以使用update(..)方法执行插入更新删除操作。

插入数据:

public void insert(Student student) {
        this.jdbcTemplate.update("insert into tb_student (name,sex,age,grade) value (?,?,?,?)",
                student.getName(), student.getSex(), student.getSex(), student.getGrade());
    }

测试

  @Test
    void daoTest() {
        Student student = new Student();
        student.setName("王五");
        student.setSex(1);
        student.setAge(20);
        student.setGrade("大学");
        studentDao.insert(student);
        }
SQL statement [insert into tb_student (name,sex,age,grade) value ('王五',1,20,'大学')]

更新数据

this.jdbcTemplate.update(
        "update tb_student set grade = ? where id = ?",
        "大学", 2);

删除数据

this.jdbcTemplate.update(
        "delete from tb_student  where id = ?",
       2);

其它操作

可以使用execute(..)方法运行任意SQL。因此,该方法经常用于DDL语句。

this.jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");

下面的例子调用了一个存储过程:

this.jdbcTemplate.update(
        "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
        Long.valueOf(unionId));

批量更新:

public void batchUpdate(List<Student> students) {
        this.jdbcTemplate.batchUpdate("insert into tb_student (name,sex,age,grade) value (?,?,?,?)", new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                ps.setString(1, students.get(i).getName());
                ps.setInt(2, students.get(2).getSex());
            }

            @Override
            public int getBatchSize() {
                return students.size();
            }
        });
    }

总结

以上把JdbcTemplate常见的操作实践了一遍,详细的细节可以参考官方文档。jdbc-core

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: org.springframework.jdbc.core.JdbcTemplateSpring框架中的一个核心类,它提供了一种简单的方式来执行SQL语句并处理结果集。它封装了JDBC API,使得开发人员可以更加方便地使用JDBC来访问数据库。JdbcTemplate提供了许多便捷的方法,如查询、更新、批量更新等,可以大大简化开发人员的工作。 ### 回答2: org.springframework.jdbc.core.JdbcTemplateSpring框架中提供的一个用于简化JDBC操作的工具类。它是Spring对JDBC API的一个封装,提供了一系列方法来完成JDBC操作,例如执行SQL语句、查询数据、处理结果集等。它可以让开发人员更方便、更高效地访问数据库,降低开发难度和重复工作。 JdbcTemplate的主要特点如下: 1. 简化JDBC编码:JdbcTemplate封装了JDBC API,使用JdbcTemplate可以在不编写复杂的JDBC代码的情况下访问数据库。 2. 抽象出通用的DAO方法:JdbcTemplate提供了一些通用的数据库操作方法,例如更新、删除、插入数据等,这些方法可以被用作DAO对象的通用方法。 3. 参数绑定:JdbcTemplate支持参数绑定,使用SQL语句预编译,从而避免了SQL注入等安全问题。 4. 结果集处理:JdbcTemplate提供了ResultSetExtractor和RowMapper接口,用于将结果集转换为Java对象,使数据访问更加方便。 JdbcTemplate的使用步骤如下: 1. 配置数据源:在Spring配置文件中配置数据源,例如使用DriverManagerDataSource、JNDIDataSource等。 2. 创建JdbcTemplate:在业务类中创建JdbcTemplate对象,并注入数据源。 3. 编写SQL语句:根据业务需求编写SQL语句。 4. 执行SQL语句:使用JdbcTemplate执行SQL语句,并处理结果集。 5. 处理结果集:根据业务需求对结果集进行处理,例如将结果集转换为Java对象。 总的来说,JdbcTemplateSpring框架中的一个重要组件,它的简单使用和强大功能为数据访问层开发者提供了方便和支持。它可以降低JDBC编码难度和重复性,提高开发效率,使我们更专注于业务实现。 ### 回答3: org.springframework.jdbc.core.JdbcTemplateSpring Framework的核心模块中包含的一个DAO(数据访问对象)框架中的JDBC模块的重要类。这个类提供了一种容易使用的方式来处理JDBC的工作。jdbc.core.JdbcTemplate丰富了JDBC API并简化了JDBC代码的编写,它提供了一个可以执行SQL操作的简单环境。 org.springframework.jdbc.core.JdbcTemplate 提供了一些方法,具体如下: 1. update(String sql,Object... args):更新操作 2. queryForObject(String sql,Class<T> requiredType,Object... args):执行查询返回单个结果对象。 3. queryForList(String sql,Object... args): 执行查询返回一个集合。 4. batchUpdate(String sql,List<Object[]> batchArgs):执行批量更新操作。 5. query(String sql, RowMapper<T> rowMapper, Object... args): 执行查询操作并将返回结果映射到Java对象。 6. query(String sql, ResultSetExtractor<T> rse, Object... args):执行查询并使用应用程序指定的ResultSetExtractor处理结果。 7. execute(String sql):执行给定的SQL操作,无需返回结果。 8. call(CallableStatementCreator csc, List<SqlParameter> declaredParameters):执行从CallableStatementCreator传递的Call方法。 org.springframework.jdbc.core.JdbcTemplate优势如下: 1.不需要抽象模型层的用户必须实现持久层接口,这就更加简介。 2.用不同技术可以确保某些结构。例如,使用jdbcTemplate.getDataSource().getConnection()进行getConnection()操作可以确保代码可以使用任何连接池来创建数据源连接。 3.它完全面向面向对象编程,并提供了特殊的函数来处理大量对象。 totalElements来自jdbcTemplate对padded set的数目的快速计算。 4.可以使用PreparedStatement对象。 综上所述,org.springframework.jdbc.core.JdbcTemplate是一种重要的JDBC工具,它优化了手动处理错误和异常,还提供了令人愉快的映射选项。对于想要使用JDBC可靠性和灵活性的开发人员来说,org.springframework.jdbc.core.JdbcTemplate是一个非常强大的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

laopeng301

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

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

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

打赏作者

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

抵扣说明:

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

余额充值