JdbcTemplate是Spring框架中的一个核心模块,用于简化JDBC编程,提供了一种简单的方式来访问数据库、执行SQL语句和处理ResultSet结果集。
在使用JdbcTemplate之前,我们需要在项目中引入相关的依赖包,可以使用Maven进行管理,例如:
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.3.10version>
dependency>
在引入依赖包之后,我们需要在Spring配置文件中配置数据源和JdbcTemplate,例如:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
bean>
JdbcTemplate提供了一系列基础的操作方法,包括查询、更新、批量操作等。这些操作方法都是通过JdbcTemplate类提供的API来实现的。下面是一些常用的基础操作方法:
查询操作
public List<Map<String, Object>> queryForList(String sql, Object... args)
public List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)
public T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
queryForList
:执行SQL查询并返回一个List对象,每个元素为一个Map对象,表示一行记录。query
:执行SQL查询并返回一个List对象,每个元素为一个JavaBean对象。queryForObject
:执行SQL查询并返回一个单一的结果对象,通常用于查询单条记录。更新操作
public int update(String sql, Object... args)
public int[] batchUpdate(String... sql)
update
:执行SQL更新操作,返回受影响的行数。batchUpdate
:批量执行SQL更新操作,返回一个int数组,其中每个元素表示对应SQL语句所影响的行数。批量操作
public <T> void execute(String sql, BatchPreparedStatementSetter pss)
public int[] batchUpdate(String sql, BatchPreparedStatementSetter pss)
execute
:执行批量更新操作,需要一个BatchPreparedStatementSetter对象作为参数,用于设置批量更新的参数。batchUpdate
:批量执行SQL更新操作,需要一个BatchPreparedStatementSetter对象作为参数,用于设置批量更新的参数。返回一个int数组,其中每个元素表示对应SQL语句所影响的行数。PreparedStatement操作
public <T> T execute(PreparedStatementCreator psc, PreparedStatementCallback<T> action)
public <T> T execute(String sql, PreparedStatementCallback<T> action)
execute
:执行指定的PreparedStatementCreator,用于生成预编译的SQL语句,然后执行PreparedStatementCallback回调函数来实现数据库的操作。execute
:执行指定的SQL语句,然后执行PreparedStatementCallback回调函数来实现数据库的操作。JdbcTemplate提供了丰富的查询操作方法,包括基于Map、JavaBean或ResultSet结果集的查询方式。下面是一些常用的查询操作方法:
// 按照主键值查询单条记录
String sql = "SELECT * FROM user WHERE id = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{1}, new BeanPropertyRowMapper<>(User.class));
// 按照条件查询单条记录
String sql = "SELECT * FROM user WHERE username = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{"Tom"}, new BeanPropertyRowMapper<>(User.class));
// 查询所有记录
String sql = "SELECT * FROM user";
List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
// 根据条件查询多条记录
String sql = "SELECT * FROM user WHERE age > ?";
List<User> userList = jdbcTemplate.query(sql, new Object[]{18}, new BeanPropertyRowMapper<>(User.class));
// 查询某个字段的值
String sql = "SELECT COUNT(*) FROM user";
Long count = jdbcTemplate.queryForObject(sql, Long.class);
// 根据条件查询某个字段的值
String sql = "SELECT AVG(age) FROM user WHERE sex = ?";
Double avgAge = jdbcTemplate.queryForObject(sql, new Object[]{"male"}, Double.class);
// 查询记录总数
String sql = "SELECT COUNT(*) FROM user WHERE age > ?";
Long totalCount = jdbcTemplate.queryForObject(sql, new Object[]{18}, Long.class);
// 分页查询记录
String sql = "SELECT * FROM user WHERE age > ? LIMIT ?, ?";
List<User> userList = jdbcTemplate.query(sql, new Object[]{18, start, pageSize}, new BeanPropertyRowMapper<>(User.class));
JdbcTemplate提供了多种方式来执行SQL更新操作,包括INSERT、UPDATE和DELETE三种类型的SQL语句。
// 插入单条记录
String sql = "INSERT INTO user (username, password, age, sex) VALUES (?, ?, ?, ?)";
int result = jdbcTemplate.update(sql, new Object[]{"Tom", "123456", 20, "male"});
// 插入多条记录
String sql = "INSERT INTO user (username, password, age, sex) VALUES (?, ?, ?, ?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"Tom", "123456", 20, "male"});
batchArgs.add(new Object[]{"Lucy", "654321", 18, "female"});
int[] result = jdbcTemplate.batchUpdate(sql, batchArgs);
// 更新单条记录
String sql = "UPDATE user SET age = ? WHERE id = ?";
int result = jdbcTemplate.update(sql, new Object[]{21, 1});
// 更新多条记录
String sql = "UPDATE user SET age = ? WHERE sex = ?";
int[] result = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, 21);
ps.setString(2, "male");
}
@Override
public int getBatchSize() {
return 2;
}
});
// 删除单条记录
String sql = "DELETE FROM user WHERE id = ?";
int result = jdbcTemplate.update(sql, new Object[]{1});
// 删除多条记录
String sql = "DELETE FROM user WHERE sex = ?";
int[] result = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, "male");
}
@Override
public int getBatchSize() {
return 2;
}
});
JdbcTemplate提供了批量操作的功能,可以实现批量插入、批量更新和批量删除等多种操作。
// 插入多条记录
String sql = "INSERT INTO user (username, password, age, sex) VALUES (?, ?, ?, ?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"Tom", "123456", 20, "male"});
batchArgs.add(new Object[]{"Lucy", "654321", 18, "female"});
int[] result = jdbcTemplate.batchUpdate(sql, batchArgs);
// 更新多条记录
String sql = "UPDATE user SET age = ? WHERE sex = ?";
int[] result = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, 21);
ps.setString(2, "male");
}
@Override
public int getBatchSize() {
return 2;
}
});
// 删除多条记录
String sql = "DELETE FROM user WHERE sex = ?";
int[] result = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, "male");
}
@Override
public int getBatchSize() {
return 2;
}
});
JdbcTemplate提供了PreparedStatement操作的API,可以通过PreparedStatementCreator接口创建预编译的SQL语句,然后使用PreparedStatementCallback回调函数实现对数据库的操作。
// 创建预编译的SQL语句
String sql = "INSERT INTO user (username, password, age, sex) VALUES (?, ?, ?, ?)";
PreparedStatementCreator psc = con -> {
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "Tom");
ps.setString(2, "123456");
ps.setInt(3, 20);
ps.setString(4, "male");
return ps;
};
// 执行预编译的SQL语句
jdbcTemplate.execute(psc, PreparedStatement::execute);