参考:官方教程
1 JdbcTemplate基本用法
1.1 查询
1.1.1 查询记录条数
String sql = "select count(*) from tb_user";
int count = jdbcTemplate.queryForObject(sql, Integer.class);
1.1.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);
1.1.3 同理,查询一个String
字段的值
String sql = "select username from tb_user where user_id = ?";
Object[] params = new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"};
String username = jdbcTemplate.queryForObject(sql, params, String.class);
1.1.4 查询多个字段,返回一个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);
1.1.5 查询多条数据,每条数据都以Map
形式返回,整个结果是List<Map<String, Object>>
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);
1.1.6 查询单条数据并通过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;
}
});
1.1.7 查询对象集合
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;
}
});
1.1.8 将字段到实体映射抽出来单独维护
通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的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());
1.1.9 插入数据并返回生成的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"));
1.2 插入、更新、删除
在JdbcTemplate
中,数据的插入、更新、删除操作都是通过update(...)
来完成的。
1.2.1 插入单条数据
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);
1.2.2 批量插入
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);
1.2.3 更新单条数据
String sql = "update tb_user set username = ? where user_id = ?";
Object[] params = new Object[]{"更新用户名", "a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);
1.2.4 批量更新
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);
1.2.5 删除单条数据
String sql = "delete from tb_user where user_id = ?";
Object[] params = new Object[]{"a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);
1.2.6 批量删除
String sql = "delete from tb_user where user_id = ?";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"});
params.add(new Object[]{"4e88b38660324334be61f0c9b2edd7f6"});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);
1.3 通过execute(..)
执行任意的SQL
可以通过execute(..)
执行任何SQL
,一般用来执行DDL
语句。
例如,创建表:
String sql = "create table new_table (id varchar(32), name varchar(100))";
jdbcTemplate.execute(sql);
2 使用NamedParameterJdbcTemplate
在使用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);
BeanPropertySqlParameterSource
可以将实体对象转换成参数值,注意参数变量名要和实体对象中的属性名对应。
例如:
String sql = "select count(*) from tb_user where username = :username and age = :age";
User query = new User();
query.setUsername("Michael");
query.setAge(25);
SqlParameterSource param = new BeanPropertySqlParameterSource(query);
Integer count = namedParameterJdbcTemplate.queryForObject(sql, param, Integer.class);
2.1 查询
2.1.1 查询记录条数
String sql = "select count(*) from tb_user";
int count = namedParameterJdbcTemplate.queryForObject(sql, new HashMap<>(0), Integer.class);
2.1.2 按条件查询记录条数,通过:参数名
参数绑定
String sql = "select count(*) from tb_user where username = :username and age = :age";
Map<String, Object> params = new HashMap<>();
params.put("username", "Michael");
params.put("age", 25);
int count = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);
2.1.3 同理,查询一个String
字段的值
String sql = "select username from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
String username = namedParameterJdbcTemplate.queryForObject(sql, params, String.class);
2.1.4 查询多个字段,返回一个Map
String sql = "select user_id, username, age from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
Map<String, Object> resultMap = namedParameterJdbcTemplate.queryForMap(sql, params);
2.1.5 查询多条数据,每条数据都以Map
形式返回,整个结果是List<Map<String, Object>>
String sql = "select user_id, username, age from tb_user where age = :age";
Map<String, Object> params = Collections.singletonMap("age", 25);
List<Map<String, Object>> resultMapList = namedParameterJdbcTemplate.queryForList(sql, params);
2.1.6 查询单条数据并通过RowMapper
映射成实体对象
String sql = "select user_id, username, age, mobile, create_time from tb_user where user_id = :userId";
Map<String, Object> params = Collections.singletonMap("userId", "46a8247fbffc46c3a591961351fa3277");
User user = namedParameterJdbcTemplate.queryForObject(sql, params, new UserRowMapper());
2.1.7 查询对象集合
String sql = "select user_id, username, age, mobile, create_time from tb_user where username = :userName";
Map<String, Object> params = Collections.singletonMap("userName", "相同的用户名");
List<User> users = namedParameterJdbcTemplate.query(sql, params, new UserRowMapper());
2.1.8 插入数据并返回生成的uuid
主键
String sql = "insert into tb_user (username, mobile, create_time, age) "
+ "values(:username, :mobile, :createTime, :age)";
// 添加的数据
User user = User.builder()
.username("新用户")
.mobile("12345678")
.createTime(new Date())
.age(25)
.build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
// KeyHolder保存返回的信息
KeyHolder keyHolder = new GeneratedKeyHolder();
// 可以指定一个或多个返回的列名称
namedParameterJdbcTemplate.update(sql, params, keyHolder, new String[]{"user_id"});
// 输出生成的uuid主键
System.out.println(keyHolder.getKeys().get("user_id"));
2.2 插入、更新、删除
在JdbcTemplate
中,数据的插入、更新、删除操作都是通过update(...)
来完成的。
2.2.1 插入单条数据
String sql = "insert into tb_user(user_id, username, mobile, age, create_time) values (:userId, :username, :mobile, :age, :createTime)";
User query = User.builder()
.userId(uuid())
.username("新用户A")
.mobile("1234567")
.age(28)
.createTime(new Date())
.build();
SqlParameterSource params = new BeanPropertySqlParameterSource(query);
int successCount = namedParameterJdbcTemplate.update(sql, params);
2.2.2 批量插入
String sql = "insert into tb_user(user_id, username, mobile, age, create_time) values (:userId, :username, :mobile, :age, :createTime)";
List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId(uuid())
.username("新用户A")
.mobile("1234567")
.age(28)
.createTime(new Date())
.build();
User user2 = builder.userId(uuid())
.username("新用户B")
.build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));
int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));
2.2.3 更新单条数据
String sql = "update tb_user set username = :username where user_id = :userId";
User user = User.builder()
.userId("46a8247fbffc46c3a591961351fa3277")
.username("更新用户名")
.build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
int successCount = namedParameterJdbcTemplate.update(sql, params);
2.2.4 批量更新
String sql = "update tb_user set username = :username where user_id = :userId";
List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId("9a4359932b4f48f391962b17ee9b9a75")
.username("更新用户A")
.build();
User user2 = builder.userId("0cd3d79c619c455e932e7723c0e8f355")
.username("更新用户B")
.build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));
int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));
2.2.5 删除单条数据
String sql = "delete from tb_user where user_id = :userId";
User user = User.builder()
.userId("ad6aaa9e4f654ab683d455fa31437b88")
.build();
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
int successCount = namedParameterJdbcTemplate.update(sql, params);
2.2.6 批量删除
String sql = "delete from tb_user where user_id = :userId";
List<SqlParameterSource> params = new ArrayList<>();
User.UserBuilder builder = User.builder();
User user1 = builder.userId("3e2c95c1538b4456bf4038c37ded5001").build();
User user2 = builder.userId("46a8247fbffc46c3a591961351fa3277").build();
params.add(new BeanPropertySqlParameterSource(user1));
params.add(new BeanPropertySqlParameterSource(user2));
int[] successCounts = namedParameterJdbcTemplate.batchUpdate(sql, params.toArray(new SqlParameterSource[]{}));