LoginSignup
4
4

More than 5 years have passed since last update.

spring bootのjdbcTemplateでSQLをプロパティファイルに切り出す

Posted at

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アノテーションでファイルを指定するだけです。
フィールド名が定数っぽいのは、前回のソースコードをそのまま動かすためです。

FileInfoRepository.java
// ... 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
}
src/main/resources/sql/FileInfoRepository.properties
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でメリット、デメリットを考慮した方がいいでしょう。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4