1 前言
JdbcTemplate 对 jdbc 进行了封装,是一个小型的轻量级持久层框架,其操作数据库的方法主要有:
//查询
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) //原生SQL语句查询一条数
public <T> T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper) //查询一条数据
public <T> List<T> query(String sql, RowMapper<T> rowMapper) //查询多条数据
public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) //查询多条数据
public <T> T queryForObject(String sql, Class<T> requiredType) //常用于查询聚合函数值
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) //常用于查询聚合函数值或查询某个属性
//增删改
public int update(final String sql) //原生SQL语句进行增删改操作,返回作用的行数
public int update(String sql, Object... args) //sql中通过?号占位,args对应sql中的?号,返回作用的行数
public int[] batchUpdate(String sql, List<Object[]> batchArgs) //常用于批量增添记录
注意:args 表示待传入参数,用于替换 sql 中的占位符(?),当 args 中有字符串类型变量,在替换 sql 中占位符时,会自动在该字符串值的两边加单引号,如下2种写法需要特别注意:
(1)批量删除
//错误写法
jdbcTemplate.update("delete from students where sid in (?)","1,2,3");
//正确写法
String del_sid="1,2,3";
String sql="delete from students where sid in ("+del_sid+")";
jdbcTemplate.update(sql);
(2) 模糊查询
RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射
//错误写法
List<Student> students=jdbcTemplate.query("select * from students where sname like '%?%')", new Object[] {"a"}, rowMapper);
//正确写法
List<Student> students=jdbcTemplate.query("select * from students where sname like concat('%',?,'%')", new Object[] {"a"}, rowMapper);
需要导入的 jar 包如下,其中最后三个包是 JdbcTemplate 所需的 jar 包。
2 案例
2.1 配置
首先在 MySQL 中创建数据库:users,再在此数据库中创建表:students,包含sid(int)、sname(varchar) 2个字段,其中,sid 设置了自增,students 表中数据如下:
Student.java
package com.jdbc;
public class Student {
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
}
db.properties
# K = V
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/users
jdbc.username=root
jdbc.password=0.
jdbc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 引入属性文件 -->
<context:property-placeholder location="db.properties"/>
<!-- 创建数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 通过数据源配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
注意:需要导入 context 命名空间
2.2 查询
(1)查询一条记录
Test.java
package com.jdbc;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("jdbc.xml");
JdbcTemplate jdbcTemplate=ac.getBean("jdbcTemplate",JdbcTemplate.class);
RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射
Student student=jdbcTemplate.queryForObject("select * from students where sid=?", new Object[] {"1003"}, rowMapper);
System.out.println(student);
}
}
运行结果:
Student [sid=1003, sname=王五]
(2)查询多条记录
RowMapper<Student> rowMapper=new BeanPropertyRowMapper<>(Student.class); //将列名和属性名映射
List<Student> students=jdbcTemplate.query("select * from students where sid>=? and sid <?",new Object[] {1002,1005}, rowMapper);
System.out.println(students);
运行结果:
[Student [sid=1002, sname=李四], Student [sid=1003, sname=王五], Student [sid=1004, sname=zhaoliu]]
(3)查询聚合函数值
Integer count=jdbcTemplate.queryForObject("select count(*) from students where sid<=?", new Object[] {1005}, Integer.class);
System.out.println(count); //输出:5
(4)查询一条记录的一个属性
String sname=jdbcTemplate.queryForObject("select sname from students where sid=?",new Object[] {1001}, String.class);
System.out.println(sname); //输出:张三
2.3 增删改
本节仅介绍插入操作,对于删除和修改,与插入操作类似。
(1)插入一条记录
int count=jdbcTemplate.update("insert into students values(?,?)", null, "abc");
System.out.println(count); //输出:1
(2)插入多条记录
List<Object[]> list=new ArrayList<>();
list.add(new Object[] {null,"xyz"});
list.add(new Object[] {null,"efg"});
int[] count=jdbcTemplate.batchUpdate("insert into students values(?,?)",list);
System.out.println(count[0]+" "+count[1]); //输出:1 1