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种方法:
- call()方法: 用于执行存储过程、存储函数
- execute()方法: 可以执行任何SQL语句, 一般用于DDL语句
- update()和batchUpdate()方法: 分别对应单个更新、批量更新的语句执行
- 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() 方法