1. 程式人生 > >JdbcTemplate查詢與批量更新

JdbcTemplate查詢與批量更新

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是執行緒安全的,在多執行緒環境下都可以共用,哪怕多個執行緒同時操作同一張表