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

浙公网安备 33010602011771号