spring全家桶学习-spring-jdbc 相关操作

通过对于 spring-jdbc jar 中的目录进行分析 

  • config : 配置类以及部分工具类
  • core :  JdbcTemplate 等相关核心接口和类 
  • datasource : 数据源相关辅助类
  • object : jdbc操作相关object定义
  • support : 错误码定义以及相关辅助类

 

对于 spring-jdbc 同样也提供了丰富的api支持sql操作

JdbcTemplate 类中 一些常用的api

  • query(java.lang.String, org.springframework.jdbc.core.RowMapper<T>): query 实际提供了大量的重载方法, 对于当前方法可以利用 "org.springframework.jdbc.core.RowMapper#mapRow" lambda语法解析 每行数据ResultSet,关于ResultSet的相关get方法支持传递column name 或 column index, 对于 index特别需要注意的一点在于 其index 是从 1 开始的;
  • org.springframework.jdbc.core.JdbcTemplate#queryForObject(java.lang.String, java.lang.Class<T>) : 当前方法最多只返回1条数据,如果查询结果数据量超过1,则会抛出 IncorrectResultSizeDataAccessException ;对于查询到的数据会转换为指定的类型
  • org.springframework.jdbc.core.JdbcTemplate#queryForList(java.lang.String, java.lang.Class<T>) : 当前方法支持返回指定类型的列表数据
  • update api 支持 insert/update/delete 等写操作
  • execute api 支持任何类型的sql 操作

对于 insert  相关操作需要获取数据库自增操作生成的主键, 可以通过 org.springframework.jdbc.core.simple.SimpleJdbcInsertOperations 中相关*ReturnKey来获取相关数据

 

批量操作

  • org.springframework.jdbc.core.JdbcTemplate#batchUpdate(java.lang.String, org.springframework.jdbc.core.BatchPreparedStatementSetter)  对于 BatchPreparedStatementSetter 通过getBatchSize手动限定要插入数据的数量,以及通过 setValues 来预处理数据,占位符处理方式和单条数据一致 
       // 返回 每行执行语句影响行数
            int[] ints = jdbcTemplate.batchUpdate("insert into FOO (ID,BAR) values(?,?)", new BatchPreparedStatementSetter() {
                /**
                 * 预处理数据
                 *
                 * @param ps 数据预处理
                 * @param i 插入数据计数器
                 * @throws SQLException
                 */
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    // 插入指定的数据
                    ps.setInt(1, 2 + i); // 处理第一个占位符
                    ps.setString(2, "batch-" + i); // 处理第二个占位符
                }
    
                /**
                 *
                 * @return 当前要插入的数据总数据量
                 */
                @Override
                public int getBatchSize() {
                    // 设置要插入的数量
                    return 2;
                }
            });

     

  • org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations#batchUpdate(java.lang.String, org.springframework.jdbc.core.namedparam.SqlParameterSource[]) 当前操作支持通过指定属性名称操作
        /**
         * 使用 {@link org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate} 实现自定义批量插入
         *
         * @author guoxing
         * @date 2020-12-15 3:33 PM
         * @since
         */
        public void nameParameterBatchInsert() {
            // 通过提交map数组实现批量操作
            ArrayList<Foo> foos = new ArrayList<>();
            Foo foo = new Foo();
            foo.setBar("name-batch-1");
            foos.add(foo);
            // NamedParameterJdbcTemplate  可以使用 ":{属性名}"的形式来指定 实体中的属性名
    //        int[] ints = namedParameterJdbcTemplate.batchUpdate("insert into FOO (BAR) values(:bar)", SqlParameterSourceUtils.createBatch(foos));
            // 虽然 :属性名 和 :{属性名}两种方式都支持, 使用 :{属性名} 这种方式相对来讲性能会更高效一点
            /**
             * {@link NamedParameterUtils#parseSqlStatement(java.lang.String)}
             * 对于 // :{x} style parameter 这种模式的相对而言解析更快捷
             */
            int[] ints = namedParameterJdbcTemplate.batchUpdate("insert into FOO (BAR) values(:{bar})", SqlParameterSourceUtils.createBatch(foos));
            Arrays.stream(ints)
                    .forEach(System.out::println);
            List<String> fooList = jdbcTemplate.queryForList("select BAR from FOO", String.class);
            fooList.forEach(System.out::println);
        }

     

本文中相关演示代码地址:https://github.com/mengyan183/spring-family/tree/main/spring-jdbc-operate

 

posted @ 2020-12-20 11:49  郭星  阅读(343)  评论(0)    收藏  举报