【Spring MVC】Spring JDBCを使ったDBアクセス(batchUpdateの使い方)

概要

データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。
当記事では、JdbcTemplateの複数更新処理であるbatchUpdateメソッドの使い方について紹介する。

 

前提

以下の記事の続きとなる。

JdbcTemplateを使用するための準備

概要 データアクセスフレームワークであるSpring JDBCを使用して、H2DBにアクセスする方法についてまとめた。 当記事ではSpring JDBCの特徴と、H2DBにアクセスするための準備方法について紹介する。  […]

【Spring MVC】Spring JDBCを使ったDBアクセス(準備)
DAOの作成方法

概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事ではDAOの作成と、DBアクセスの動確を行う方法について紹介する。 ※尚、DAOパターンとは何かについての説明は割愛する &n[…]

【Spring MVC】Spring JDBCを使ったDBアクセス(DAOの作成と動確方法)

 

特徴

複数の更新(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);
}

 

var params = new ArrayList<Object[]>();
for (TestPoint test : tests) {

引数で取得したtests(INSERTするテスト情報リスト)をループして、Object[]配列に格納する。
作成したObject[]配列を、List<new Object[]>に格納すればパラメータの準備完了。

 

return jdbcTemplate.batchUpdate(sql, params);

上記のように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();
		}

	});
}

 

return jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {

batchUpdateの引数に、直接BatchPreparedStatementSetterの匿名クラスを実装して渡している。
BatchPreparedStatementSetterの実装には、2つのメソッドをオーバーライドして定義する必要がある

 

@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {

リストi番目のPreparedStatementをどのように実装するかを定義する。

 

@Override
public int getBatchSize() {

バッチ処理で実行するべき全体の操作数を返却する。

基本的にリストの要素数だけ実行することになる
上記で返却した回数分、setValuesメソッドが内部で呼ばれる。

 

NamedParameterJdbcTemplateの場合

NamedParameterJdbcTemplate.batchUpdateを使用した複数データ更新処理について紹介する。

あわせて読みたい

概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事では、NamedParameterJdbcTemplateの使い方について紹介する。   前提 以下の記事の続きと[…]

【Spring MVC】Spring JDBCを使ったDBアクセス(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);
}

 

var parameterSources = new ArrayList<MapSqlParameterSource>();
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[] params = SqlParameterSourceUtils.createBatch(tests.toArray());

テスト情報リストからSqlParameterSource配列に変換する。

batchUpdateの使用方法の紹介については以上となる。

スポンサーリンク