Spring JDBCの書き方をいっつも忘れるのでメモしておく


JPAとかORMに不慣れで結局SpringJDBCを趣味でも実務でも使うことが多いのですが、ちょっと離れているとすぐ忘れてしまうので簡単にまとめます。

1.NamedParameterJDBCTemplateをインジェクションする

@Repository
public class AwesomeDao {

	@Autowired
	private NamedParameterJdbcTemplate template;

}

2.Read系クエリ発行のためのRowMapperを定義

クエリを発行して取得したResultSetの値をオブジェクトにマッピングする方法を定義します。
Dao内にstaticのラムダ式として定義する方法があります。

	private static final RowMapper<ArticleDto> ROW_MAPPER = (rs, i) -> {
		AwesomeDto dto = new AwesomeDto();
		dto.setId(rs.getInt("id"));
		dto.setUserId(rs.getString("user_id"));
		dto.setContents(rs.getString("contents"));
		dto.setPostDate(rs.getTimestamp("post_date"));
		return dto;
	};

3.SQLを定義

当然ですが、SQLがないと何もできません。
個人的に、ORM使うより「発行するSQLを直接書ける」と安心感があります。
後は、何らかの事情で(テーブル名がどうしても規約に沿っていないとか)ORMがうまく使えない場合、SpringJDBCを使うことになります。


	private static final String CREATE_SQL = "INSERT INTO awesome (user_id,contents) values (:userId,:contents)";
	private static final String SELECT_SQL = "SELECT id,user_id,contents,post_date from awesome order by post_date desc";
	private static final String DELETE_SQL = "DELETE FROM article where id=:id";
	private static final String UPDATE_SQL = "UPDATE awesome set contents=:contents where id=:id";

4.MapSqlParameterSourceで、SQLに値をバインド

SQL文の中で、「:hoge」と書いているところに値を埋め込むには、MapSqlParameterSourceを使います。

	@Override
	public void create(AwesomeDto dto) {
		SqlParameterSource param = new MapSqlParameterSource().addValue("id", dto.getId()).addValue("contents",
				dto.getContents());
		template.update(CREATE_SQL, param);
	}

5.発行は、Readはtemplate.query()、CUDはtemplate.update()

「一件だけ取得」する場合には、queryForObject()なども使えます。
ただし、queryForObjectは、検索結果が0件のときにエラーを返すので注意してください。

データベースに変更を加えるupdate、delete、insertは全部update()メソッドがやってくれます。便利ですね。

	@Override
	public List<AwesomeDto> getAll() {
		return template.query(SELECT_SQL, ROW_MAPPER);
	}
	@Override
	public void delete(int id) {
		SqlParameterSource param = new MapSqlParameterSource().addValue("id", id);
		template.update(DELETE_SQL, param);
	}

以上です。
とりあえず上記の手順を覚えてしまえばだいたいの操作ができます。
これで間に合わない部分は各自リファレンスを読むなりなんなりしていく感じですね。