zoukankan      html  css  js  c++  java
  • 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();
    }

      


  • 相关阅读:
    结果偏见 (行为经济学)
    天下没有免费的午餐
    双环学习
    信息对称、网络效应
    为什么说盲维是认知升级的重要概念?
    给思维找一个支点
    风险是一种商品
    认知方法论第一课
    A*算法深入
    A*算法入门
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106727.html
Copyright © 2011-2022 走看看