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

概要

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

 

前提

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

JdbcTemplateを使用するための準備

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

DAOの作成方法

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

 

特徴

JdbcTemplate.queryメソッドは、SELECT文を実行してDBから値を取得するために使用する。
基本的に複数レコードを取得する際に使用する。

尚、SQLクエリの結果が0行の場合、スローされず空のリストを返却する

 

使い方

JdbcTemplate.queryメソッドは以下のように使用する。

JdbcTemplate.query(
SQL文字列,
パラメータ ※省略可,
戻り値の型 ※RowMapperの実装など
)

 

使用例

実際にJdbcTemplate.queryメソッドの使用例について紹介する。

全レコード検索

すべての生徒情報を取得する。

インターフェース

StudentDao.java


/** 全生徒情報を取得 */
List<Student> findAllStudens();

 

実装

RowMapperの定義

JdbcStudentDao.java


/** Studentクラスに変換するRowMapper */	
private final RowMapper<Student> studentRowMapper = (rs, i) -> {
	var student = new Student();
	student.setId(rs.getInt("id"));
	student.setName(rs.getString("name"));
	student.setGrade(rs.getInt("grade"));
	student.setClassName(rs.getString("class_name"));
	student.setMemo(rs.getString("memo"));
	return student;
};	

RowMapperの処理の流れは以下を参照。

RowMapperの使い方

概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事では、JdbcTemplateのSELECT処理であるqueryForObjectメソッドの使い方について紹介する。  […]

 

queryの実装

JdbcStudentDao.java


@Override	
public List<Student> findAllStudens() {
	var sql = "SELECT id, grade, name, class_name, memo FROM student";
	return jdbcTemplate.query(sql, studentRowMapper);
}

 

使用結果

FooMain.java


// 全生徒情報を取得	
List<Student> studentList = studentDao.findAllStudens();
studentList.forEach(s -> System.out.println(s));
// ------------------------
// コンソール
// ------------------------
// Student(id=1, grade=1, name=山田太郎, className=1-A, memo=良好な成績, tests=null)
// Student(id=2, grade=2, name=佐藤花子, className=2-B, memo=スポーツ万能, tests=null)
// Student(id=3, grade=3, name=鈴木一郎, className=3-C, memo=芸術に秀でる, tests=null)

 

生徒情報を取得

queryForObjectの記事にて生徒情報を取得する方法を解説した。
当記事では、テスト情報リストを生徒情報に紐づける方法も紹介する。

既に作成済みの生徒情報取得メソッドに、テスト情報取得処理を加える

インターフェース

StudentDao.java


/** 生徒情報を取得 */
Student findStudentById(int id);

 

実装

RowMapperの定義

JdbcStudentDao.java


/** TestPointクラスに変換するRowMapper */
private final RowMapper<TestPoint> testRowMapper = (rs, i) -> {
	var test = new TestPoint();
	test.setId(rs.getInt("id"));
	test.setJapanese(rs.getInt("japanese"));
	test.setMathematics(rs.getInt("mathematics"));
	test.setEvaluation(rs.getString("evaluation"));
	test.setTestDate(rs.getDate("test_date"));
	test.setStudentId(rs.getInt("student_id"));
	return test;
};	

 

queryの実装

JdbcStudentDao.java


@Override
public Student findStudentById(int id) {
	// 生徒情報取得
	var sql = "SELECT id, grade, name, class_name, memo FROM student WHERE id = ?";
	var student = jdbcTemplate.queryForObject(sql, new Object[] { id }, studentRowMapper);
	// 生徒に紐づくテスト情報取得
	var testSql = "SELECT id, japanese, mathematics, evaluation, test_date, student_id From test_point WHERE student_id = ?";
	List<TestPoint> testList = jdbcTemplate.query(testSql, new Object[] { id }, testRowMapper);
	
	// テスト情報の紐づけ
	student.setTests(testList);
	
	return student;
}

 

// 生徒に紐づくテスト情報取得
var testSql = “SELECT id, japanese, mathematics, evaluation, test_date, student_id From test_point WHERE student_id = ?”;
List<TestPoint> testList = jdbcTemplate.query(testSql, new Object[] { id }, testRowMapper);

生徒IDに紐づくテスト情報を、test_pointテーブルからリストで取得する。

 

// テスト情報の紐づけ
student.setTests(testList);

生徒情報に、取得したテストリストを設定する。

 

使用結果

FooMain.java


// 生徒情報の取得
var student = studentDao.findStudentById(3);
System.out.println(student);
// ------------------------
// コンソール
// ------------------------
// Student(id=3, grade=3, name=鈴木一郎, className=3-C, memo=芸術に秀でる, tests=[TestPoint(id=3, japanese=75, mathematics=85, evaluation=可, testDate=2023-05-22, studentId=3), TestPoint(id=6, japanese=85, mathematics=90, evaluation=非常に良い, testDate=2023-09-30, studentId=3)])

 

補足

複数テーブルからデータを取得する際には、RowMapperを使用してシンプルにデータを取得することができる。
しかし、テーブルの数だけSQLを発行することでパフォーマンスに影響を与える可能性もある。

RowMapperの代わりに、ResultSetExtractorを使用することで、一度のSQLの発行で複数テーブルのデータを取得できる。

あわせて読みたい

概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事では、JdbcTemplateのqueryメソッドと共に使用するResultSetExtractorについて紹介する。 Resu[…]

スポンサーリンク