JdbcTemplate查詢與批量更新
阿新 • • 發佈:2018-11-09
1.定義
JdbcTemplate是將spring與jdbc進行了整合,可以簡化資料庫操作,相比Hibernate、Mybatis感覺配置少很多,用起來有點像springboot的JPA,但是會比它臃腫一些。
2.應用
2.1 配置
採用資料庫連線池
<bean id="dataSourceMeta" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClassName}" /> <property name="jdbcUrl" value="${url}" /> <property name="user" value="${user_name}" /> <property name="password" value="${password}" /> <!-- 初始化連線大小 --> <property name="initialPoolSize" value="${initialSize}"></property> <property name="maxPoolSize" value="${maxActive}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" scope="prototype"> <property name="dataSource" ref="dataSource"></property> </bean>
這樣在類中就可以直接@Autowired注入這個物件,注意該類必須也通過註解方式new
2.2 使用
1)查詢
String sql = "select count(*) ncount from t where 1=1 and t.managerid=" + managerid;
int ncount = jdbcTemplate.queryForObject(sql, Integer.class);
queryForObject進行資料庫查詢無資料時會丟擲如下異常提示息
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 或者 org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 2
為了避免出現以上的異常,最好還是使用query查出list,取第一個元素就行
List<String> taaccountids = jdbcTemplate.query(sb.toString(), new RowMapper<String>() {
@Override
public String mapRow(ResultSet resultSet, int i) throws SQLException {
return resultSet.getString("taaccountid");
}
});
2)批量操作
jdbcTemplate.batchUpdate(delSql, new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement preparedStatement, int i) throws SQLException { Customer cust= CustomerList.get(i); preparedStatement.setString(1, cust.getTaaccountid()); preparedStatement.setString(2, "0000"); } @Override public int getBatchSize() { return custRiskViewParamList.size(); } });
這裡會有個問題,例如當我CustomerList比較大,有5W條,分批次提交就需要自己用for迴圈,因為batchUpdate它的方法getBatchSize()預設就是提交整個list的大小。所以我們可以擷取list,每一萬條提交一下,不然等5W一批次會存在記憶體溢位等問題。
3.安全性
jdbcTemplate是執行緒安全的,在多執行緒環境下都可以共用,哪怕多個執行緒同時操作同一張表