博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring JdbcTemplate 两种方法的区别
阅读量:4081 次
发布时间:2019-05-25

本文共 2490 字,大约阅读时间需要 8 分钟。

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

附录:

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

  

转载地址:http://kntni.baihongyu.com/

你可能感兴趣的文章
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>