https://zhidao.baidu.com/question/534000210.html
方法一
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});
方法二
final String id = user.getId();
final String name = user.getName();
final String sex = user.getSex() + "";
final int age = user.getAge();
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, id);
ps.setString(2, name);
ps.setString(3, sex);
ps.setInt(4, age);
}
});
这两种方法执行效率有区别么?我看帖子说JDBC推荐使用PreparedStatement,那也就是第二种方式,但是真心不知道能有啥区别啊
效率上基本没有区别,因为你这里的方法一最终还是要掉方法二来进行实现,只不过你在方法一传的参数数组进去,方法一会帮你构造一个PreparedStatementSetter,然后调用方法二进行执行,所以有中间这个构造过程,你如果对效率要求特别高,那就用方法二了
方法一源码:
public int update(String sql, Object... args) throws DataAccessException {
return update(sql, newArgPreparedStatementSetter(args));//这个被调用的方法就是你提问中的方法二了
}
protected PreparedStatementSetter newArgPreparedStatementSetter(Object[] args) {
return new ArgPreparedStatementSetter(args);
附录:
spring JdbcTemplate批量插入以及单个插入时获取id
1. 批量更新插入
jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs)
Object[]数组的长度为每条记录的参数个数(也就是sql语句中"?"的个数)
List: 总共插入多少条记录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/** *
批量插入订单详情 * */ public void addBatch(List<OrderDetail>
orderDetails) { List<Object[]>
params = new ArrayList<>(); for (OrderDetail
orderDetail : orderDetails) { params.add( new Object[]{orderDetail.getProductName(),
orderDetail.getProductPrice(), orderDetail.getProductCount(),
orderDetail.getParentid()}); } final String
sql = "insert
into order_detail(pro_name,pro_price,pro_count,parent_id) values(?,?,?,?)" ; jdbcTemplate.batchUpdate(sql,
params); } |
2. 单条记录插入获取主键id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** *
插入并获取主键 */ public int addAndGetId(Order
order) { final String
sql = "insert
into orders(name, address,createtime,totalprice,status) values(?,?,?,?,?)" ; KeyHolder
keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update( new PreparedStatementCreator()
{ @Override public PreparedStatement
createPreparedStatement(Connection connection) throws SQLException
{ PreparedStatement
ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setObject( 1 ,
order.getName()); ps.setObject( 2 ,
order.getAddress()); ps.setObject( 3 ,
order.getCreateTime()); ps.setObject( 4 ,
order.getTotalPrice()); ps.setObject( 5 ,
order.getStatus()); return ps; } },
keyHolder); return keyHolder.getKey().intValue(); } |