函数 | 场景说明 |
---|---|
update(String sql, @Nullable Object… args) | 增,删,改 |
queryForObject(sql, Integer.class) | 查询返回某个值 |
queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1) | 查询返回的是某个对象、BeanPropertyRowMapper返回自定义对象 |
query(sql, new BeanPropertyRowMapper<>(User.class)) | 查询返回的是某个集合 |
queryForMap(sql) | 查询返回的是map |
业务开发中输出sql日志
logging:
level:
org.springframework.jdbc.core.JdbcTemplate: debug
1、查询记录条数
String sql = "select count(*) from tb_user";
int count = jdbcTemplate.queryForObject(sql, Integer.class);
2、按条件查询记录条数,通过?
参数绑定
String sql = "select count(*) from tb_user where username = ?";
int count = jdbcTemplate.queryForObject(sql, Integer.class, "Tom");
或者
String sql = "select count(*) from tb_user where username = ?";
Object[] params = new Object[]{"Tom"};
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);
3、查询多个字段,返回一个Map
String sql = "select user_id, username, age from tb_user where user_id = ?";
Object[] params = new Object[]{"46a8247fbffc46c3a591961351fa3277"};
Map<String, Object> resultMap = jdbcTemplate.queryForMap(sql, params);
4、查询多条数据,每条数据都以Map
形式返回,整个结果是List
String sql = "select user_id, username, age from tb_user where age = ?";
Object[] params = new Object[]{25};
List<Map<String, Object>> resultMapList = jdbcTemplate.queryForList(sql, params);
5、查询多条数据,返回实体类集合List
BeanPropertyRowMapper
自动映射实体属性
String querySQL = "select * from customer where id = ?";
List<Customer> customers = jdbcTemplate.query(querySQL, new BeanPropertyRowMapper<>(Customer.class), 10001);
new BeanPropertyRowMapper<>(Customer.class)
可以自动映射实体属性,但是实体属性必须驼峰命名。可以使用BeanPropertyRowMapper.newInstance
静态方法创建
String querySQL = "select * from customer where id = ?";
List<Customer> customers = jdbcTemplate.query(querySQL, BeanPropertyRowMapper.newInstance(Customer.class), 10001);
6、查询单条数据,返回实体类对象,通过BeanPropertyRowMapper
自动映射实体属性
String querySQL = "select * from customer where id = ?";
List<Customer> customers = jdbcTemplate.queryForObject(querySQL, new BeanPropertyRowMapper<>(Customer.class), 10001);
7、查询单条数据并通过RowMapper
手动映射成实体对象
String sql = "select user_id, username, mobile, create_time from tb_user where user_id = ?";
Object[] params = new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"};
User user = jdbcTemplate.queryForObject(sql, params,
new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
// 在这里做字段到实体的映射
User u = new User();
u.setUserId(rs.getString("user_id"));
u.setUsername(rs.getString("username"));
u.setMobile(rs.getString("mobile"));
u.setCreateTime(rs.getTimestamp("create_time"));
return u;
}
});
8、查询对象集合
String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
Object[] params = new Object[]{"相同的用户名"};
List<User> users = jdbcTemplate.query(sql, params,
new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User u = new User();
u.setUserId(rs.getString("user_id"));
u.setUsername(rs.getString("username"));
u.setMobile(rs.getString("mobile"));
u.setCreateTime(rs.getTimestamp("create_time"));
return u;
}
});
9、将字段到实体映射抽出来单独维护
通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的User
映射可以单独抽出来成为一个UserRowMapper
类:
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User u = new User();
u.setUserId(rs.getString("user_id"));
u.setUsername(rs.getString("username"));
u.setMobile(rs.getString("mobile"));
u.setCreateTime(rs.getTimestamp("create_time"));
return u;
}
}
然后在使用的时候创建就行了:
String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
List<User> users = jdbcTemplate.query(sql, new Object[]{"相同的用户名"}, new UserRowMapper());
10、插入数据并返回生成的uuid
主键
String sql = "insert into tb_user (username, mobile, create_time, age) values(?, ?, ?, ?)";
// KeyHolder保存返回的数据,可以指定返回的列
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
// 指定返回的属性列名为user_id
PreparedStatement ps = con.prepareStatement(sql, new String[]{"user_id"});
// 插入的数据
ps.setString(1, "新用户");
ps.setString(2,"12345678");
ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
ps.setInt(4, 28);
return ps;
}
}, keyHolder);
// 输出生成的uuid
System.out.println(keyHolder.getKeys().get("user_id"));
在JdbcTemplate
中,数据的插入、更新、删除操作都是通过update(...)
来完成的。
String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
Object[] params = new Object[]{uuid(), "新用户", "134578546", new Date()};
int successCount = jdbcTemplate.update(sql, params);
或者使用预编译对象插入
String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(1,1001);
ps.setString(2,"百里宣策");
ps.setLong(3,123123123);
ps.setDate(4, new java.sql.Date(2023));
}
});
String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{uuid(), "新用户1", "134578546", new Date()});
params.add(new Object[]{uuid(), "新用户2", "134578546", new Date()});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);
String sql = "update tb_user set username = ? where user_id = ?";
Object[] params = new Object[]{"更新用户名", "a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);
String sql = "update tb_user set username = ? where user_id = ?";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{"更新用户名1", "0ff5771760c1483abaefa7a3e530ea6d"});
params.add(new Object[]{"更新用户名2", "4e88b38660324334be61f0c9b2edd7f6"});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);
String sql = "delete from tb_user where user_id = ?";
Object[] params = new Object[]{"a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);
public void removeByIds(String[] rids, Integer year) {
String deleteSQL = "delete from nt_budget_income_plan where ADMDIV_CODE = ? and year = ? and ID = ?";
// 设置预编译参数
jdbcTemplate.batchUpdate(deleteSQL, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
String rid = rids[i];
ps.setString(1, SessionUtil.getSession().getAdmdivCode());
ps.setInt(2, year);
ps.setLong(3, Long.parseLong(rid));
}
@Override
public int getBatchSize() {
return rids.length;
}
});
}
可以通过execute(..)
执行任何SQL
,一般用来执行DDL
语句
String sql = "create table new_table (id varchar(32), name varchar(100))";
jdbcTemplate.execute(sql);
在使用JdbcTemplate
的时候,如果要使用参数,那么需要通过在SQL
中使用?
做占位符。
NamedParameterJdbcTemplate
提供了一个更加直观的方式来定义SQL
中的占位符,即通过:变量名
的形式。
可以通过Map或者BeanPropertySqlParameterSource传递参数值:
Map直接设置参数值;
String sql = "select count(*) from tb_user where username = :username and age = :age";
Map<String, Object> params = new HashMap<>(2);
params.put("username", "Michael");
params.put("age", 25);
Integer count = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);
其他方法同JdbcTemplate类似
public void deleteByIds(List<Long> ids) {
String sql = "delete from nt_current_fund_apply where ID in (:ids)";
Map<String, Object> params = new HashMap<>(4);
params.put("ids", ids);
namedJdbcTemplate.update(sql, params);
};