概要
データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。
当記事では、JdbcTemplateの複数更新処理であるbatchUpdateメソッドの使い方について紹介する。
前提
以下の記事の続きとなる。
概要 データアクセスフレームワークであるSpring JDBCを使用して、H2DBにアクセスする方法についてまとめた。 当記事ではSpring JDBCの特徴と、H2DBにアクセスするための準備方法について紹介する。 […]
概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事ではDAOの作成と、DBアクセスの動確を行う方法について紹介する。 ※尚、DAOパターンとは何かについての説明は割愛する &n[…]
特徴
複数の更新(INSERTやUPDATEなど)処理を行う際に使用する。
1回ずつupdateメソッドで更新するより、batchUpdateメソッドを使用する方が性能がよくなる。
使用例
さまざまな記述方法でbatchUpdate処理を実装できるので、その一部を紹介する。
以下は複数のテスト情報をbatchUpdateを使用してINSERTする例になる。
前提
以下のインターフェースをJdbcTemplateまたはNamedParameterJdbcTemplateで実装する。
尚、処理結果はいずれも同じで複数テスト情報のINSERTとなる。
インターフェース
StudentDao.java
/** テスト情報リストの作成 */
int[] batchInsertTestPoints(List<TestPoint> tests) ;
JdbcTemplateの場合
JdbcTemplate.batchUpdateを使用した複数データ更新処理について紹介する。
Object配列リスト
テスト情報をObject配列のリストに変換してbatchUpdateに渡す。
実装
JdbcStudentDao.java
public int[] batchInsertTestPoints(List<TestPoint> tests) {
var sql = "INSERT INTO test_point (japanese, mathematics, evaluation, test_date, student_id) VALUES (?, ?, ?, ?, ?)";
var params = new ArrayList<Object[]>();
for (TestPoint test : tests) {
var param = new Object[]{
test.getJapanese(),
test.getMathematics(),
test.getEvaluation(),
new java.sql.Date(test.getTestDate().getTime()),
test.getStudentId()
};
params.add(param);
}
return jdbcTemplate.batchUpdate(sql, params);
}
for (TestPoint test : tests) {
引数で取得したtests(INSERTするテスト情報リスト)をループして、Object[]配列に格納する。
作成したObject[]配列を、List<new Object[]>に格納すればパラメータの準備完了。
上記のようにbatchUpdateにSQL文字列とパラメータを渡すことで、テスト情報リストの複数INSERTが完了する。
戻り値はint[]配列となり、更新されたレコードを返却する。
更新数を確認したい際には、配列の長さを保持するlengthプロパティで確認できる。
※INSERTの例しか用意していないが、更新系であればUPDATEでもDELETEでも実行可能
BatchPreparedStatementSetter
テスト情報を利用したBatchPreparedStatementSetterを実装してbatchUpdateに渡す。
実装
JdbcStudentDao.java
public int[] batchInsertTestPoints(List<TestPoint> tests) {
var sql = "INSERT INTO test_point (japanese, mathematics, evaluation, test_date, student_id) VALUES (?, ?, ?, ?, ?)";
return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
var test = tests.get(i);
ps.setInt(1, test.getJapanese());
ps.setInt(2, test.getMathematics());
ps.setString(3, test.getEvaluation());
ps.setDate(4, new java.sql.Date(test.getTestDate().getTime()));
ps.setInt(5, test.getStudentId());
}
@Override
public int getBatchSize() {
return tests.size();
}
});
}
batchUpdateの引数に、直接BatchPreparedStatementSetterの匿名クラスを実装して渡している。
BatchPreparedStatementSetterの実装には、2つのメソッドをオーバーライドして定義する必要がある。
public void setValues(PreparedStatement ps, int i) throws SQLException {
リストi番目のPreparedStatementをどのように実装するかを定義する。
public int getBatchSize() {
バッチ処理で実行するべき全体の操作数を返却する。
基本的にリストの要素数だけ実行することになる。
上記で返却した回数分、setValuesメソッドが内部で呼ばれる。
NamedParameterJdbcTemplateの場合
NamedParameterJdbcTemplate.batchUpdateを使用した複数データ更新処理について紹介する。
概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事では、NamedParameterJdbcTemplateの使い方について紹介する。 前提 以下の記事の続きと[…]
MapSqlParameterSourceリスト
テスト情報をMapSqlParameterSource配列に変換してbatchUpdateに渡す。
実装
JdbcStudentDao.java
public int[] batchInsertTestPoints(List<TestPoint> tests) {
var sql = "INSERT INTO test_point (japanese, mathematics, evaluation, test_date, student_id) VALUES (:japanese, :mathematics, :evaluation, :testDate, :studentId)";
var parameterSources = new ArrayList<MapSqlParameterSource>();
for (TestPoint test : tests) {
var param = new MapSqlParameterSource()
.addValue("japanese", test.getJapanese())
.addValue("mathematics", test.getMathematics())
.addValue("evaluation", test.getEvaluation())
.addValue("testDate", test.getTestDate())
.addValue("studentId", test.getStudentId());
parameterSources.add(param);
}
MapSqlParameterSource[] params = parameterSources.toArray(new MapSqlParameterSource[0]);
return namedParameterJdbcTemplate.batchUpdate(sql, params);
}
for (TestPoint test : tests) {
SqlParameterSourceUtils
テスト情報をSqlParameterSourceして配列に変換してbatchUpdateに渡す。
実装
JdbcStudentDao.java
public int[] batchInsertTestPoints(List<TestPoint> tests) {
var sql = "INSERT INTO test_point (japanese, mathematics, evaluation, test_date, student_id) VALUES (:japanese, :mathematics, :evaluation, :testDate, :studentId)";
SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(tests.toArray());
return namedParameterJdbcTemplate.batchUpdate(sql, params);
}
テスト情報リストからSqlParameterSource配列に変換する。
batchUpdateの使用方法の紹介については以上となる。