Spring JdbcTemplate 两种方法的区别

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();
}

  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值