Spring JdbcTemplate

Spring JDBC是spring所提供的持久层技术,它的主要目的是降低JDBC API的使用难度,以一种更直接、更简洁的方式使用 JDBC API。

spring中的JDBC模块负责数据库资源管理,可以省去连接和关闭数据库的代码,简化了对数据库的操作,使得开发人员无需在数据库操作上花更多精力,可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑中。

定义 JdbcTemplate时,需要将dataSource注入到JdbcTemplate中,而其他需要使用JdbcTemplate的Bean,也需要将JdbcTemplate注入到该Bean中。(通常注入到数据访问层Dao类中,在Dao类中进行与数据库的相关操作)

dataSource的配置是JDBC连接数据库时所需要的四个属性(driverClassName,url,username,password)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         https://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/context
 8         https://www.springframework.org/schema/context/spring-context.xsd">
 9   
10 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
11     <property name="driverClassName" value="${jdbc.driverClassName}"/>
12     <property name="url" value="${jdbc.url}"/>
13     <property name="username" value="${jdbc.username}"/>
14     <property name="password" value="${jdbc.password}"/>
15 </bean> 
16   
17   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
18       <property name="dataSource" ref="dataSource"></property>
19   </bean>
20   
23   <context:property-placeholder location="classpath:db.properties"/>
24    <context:component-scan base-package="com.ssm" />
25 </beans>
jdbc.username=root
jdbc.password=
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
initPoolSize=5
maxPoolSize=10


JdbcTemplate主要提供4种方法:

  1. call()方法: 用于执行存储过程、存储函数
  2. execute()方法: 可以执行任何SQL语句, 一般用于DDL语句
  3. update()和batchUpdate()方法: 分别对应单个更新、批量更新的语句执行
  4. query()和queryForXXX()方法: 用于单查、列表查询

单个更新(JdbcTemplate的大部分方法都是, 参数列表的最右边经常是一个可变参

    @Test
    public void insert() {
        String sql = "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)";
        jdbcTemplate.update(sql, "张三丰", 18, "male", Instant.now().toEpochMilli(), Instant.now().toEpochMilli(), Instant.now().toEpochMilli());
    }

批量更新

 @Test
    public void batchInsert() {
        String sql = "insert into pass_user (name,age,gender,birthday,create_time,update_time) values (?,?,?,?,?,?)";
        List<Object[]> args = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            args.add(new Object[]{"张三丰", 18, "male", Instant.now().toEpochMilli(), Instant.now().toEpochMilli(), Instant.now().toEpochMilli()});
        }
        jdbcTemplate.batchUpdate(sql, args);
    }

获取单个记录的所有列值

通过RowMapper映射, 我们可以通过 queryForObject() 方法获取单个记录的所有列值, 映射方法有两种。

第一种方式是实体类不用实现RowMapper接口, 但是实体类的属性名必须和表中的列名符合驼峰命名匹配,能一一对应起来, 如果两者不一致,则需要在sql语句中给对应的列取一个别名。

RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);

第二种方式需要实体类实现RowMapper接口,覆写 mapRow() 方法

原文地址:https://www.cnblogs.com/kjitboy/p/12170241.html