概要
データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。
当記事では、JdbcTemplateのSELECT処理であるqueryメソッドの使い方について紹介する。
前提
以下の記事の続きとなる。
概要 データアクセスフレームワークであるSpring JDBCを使用して、H2DBにアクセスする方法についてまとめた。 当記事ではSpring JDBCの特徴と、H2DBにアクセスするための準備方法について紹介する。 […]
概要 データアクセスフレームワークであるSpring JDBCを使用する方法についてまとめた。 当記事ではDAOの作成と、DBアクセスの動確を行う方法について紹介する。 ※尚、DAOパターンとは何かについての説明は割愛する &n[…]
特徴
JdbcTemplate.queryメソッドは、SELECT文を実行してDBから値を取得するために使用する。
基本的に複数レコードを取得する際に使用する。
尚、SQLクエリの結果が0行の場合、スローされず空のリストを返却する。
使い方
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の処理の流れは以下を参照。
概要 データアクセスフレームワークである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[…]