1. はじめに
前回の記事「spring bootの組み込みh2dbにjdbcTemplateでアクセスする」でSQLを「@Value
で外出しするのも可能」と書きました。
そうしたらそのやり方を教えてほしいと言われたので、今回記事にしました。
spring bootはデフォルトでsrc/main/application.properties(.yml)
ファイルを読み込んで@Value
で参照することができます。
しかし、このメインのプロパティファイルに、定義が増えそうなSQLを書くのは好ましくありません。
そこで今回はjdbcTemplateのSQL専用のプロパティファイルを定義する方法について説明したいと思います。
2. 実装
SQLを外部ファイルに切り出すところに関係する内容だけ記載します。
jdbcTemplateの説明については前回の記事を参照ねがいます。
ポイントは@org.springframework.context.annotation.PropertySource
アノテーションでファイルを指定するだけです。
フィールド名が定数っぽいのは、前回のソースコードをそのまま動かすためです。
// ... omitted
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
// ... omitted
// ★ポイント
@PropertySource(value = "classpath:sql/FileInfoRepository.properties")
@Repository
public class FileInfoRepository {
private static final Logger LOGGER = LoggerFactory.getLogger(FileInfoRepository.class);
// ★ポイント
@Value("${FileInfoReppsitory.INSERT_SQL}")
String INSERT_SQL;
@Value("${FileInfoReppsitory.DELETE_BY_KEY_SQL}")
String DELETE_BY_KEY_SQL;
@Value("${FileInfoReppsitory.UPDATE_BY_KEY_SQL}")
String UPDATE_BY_KEY_SQL;
@Value("${FileInfoReppsitory.FIND_ONE_SQL}")
String FIND_ONE_SQL;
@Value("${FileInfoReppsitory.FIND_ALL_SQL}")
String FIND_ALL_SQL;
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
// omitted
}
FileInfoReppsitory.INSERT_SQL=INSERT INTO file_info (file_id, file_type, file_name, file_path, content_type, content_length, registered_date) values (:fileId, :fileType, :fileName, :filePath, :contentType, :contentLength, :registeredDate)
FileInfoReppsitory.DELETE_BY_KEY_SQL=DELETE FROM file_info WHERE file_id = :fileId
FileInfoReppsitory.UPDATE_BY_KEY_SQL=UPDATE file_info SET file_type = :fileType, file_name = :fileName, file_path = :filePath, content_type = :contentType, content_length = :contentLength, registered_date = :registeredDate WHERE file_id = :fileId
FileInfoReppsitory.FIND_ONE_SQL=SELECT file_id, file_type, file_name, file_path, content_type, content_length, registered_date FROM file_info WHERE file_id = :fileId
FileInfoReppsitory.FIND_ALL_SQL=SELECT file_id, file_type, file_name, file_path, content_type, content_length, registered_date FROM file_info ORDER BY file_type, registered_date
(注意)
プロパティファイルなので1行で記載する必要があります。
長いSQLでも途中で改行することができないので注意してください。
ちなみにymlにしたところでSQLを記載する値のところで改行できないため、やっぱり見づらいです。
FileInfoReppsitory:
INSERT_SQL:
INSERT INTO file_info (file_id, file_type, file_name, file_path, content_type, content_length, registered_date) values (:fileId, :fileType, :fileName, :filePath, :contentType, :contentLength, :registeredDate)
3. さいごに
今回はjdbcTemplateのSQL専用のプロパティファイルを定義する方法について説明しました。
結果を見れば分かりますが、可読性はよくありません。
jdbcTemplateのメリットはさくっと簡単に使えるシンプル性だと思いますが、このメリットが失われてしまいます。
代わりにJavaファイルにSQLを記載するという気持ち悪さは解消されます。
SQLを外部ファイル化する際は各PJでメリット、デメリットを考慮した方がいいでしょう。