JdbcTemplateでIN句に毎回異なる数の値をセットして、
複数のレコードを取得する場合は、「NamedParameterJdbcTemplate」で取得することができます。
目次
コード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// NamedParameterJdbcTemplateのインスタンスを取得 @Autowired NamedParameterJdbcTemplate namedJdbcTemplate; public List<History> getMany(Integer[] params) throws DataAccessException { // Query String sql = "SELECT * FROM t_history WHERE id IN(:ids)"; // Params Set<Integer> ids = new HashSet<>(); for(Integer i: params) { ids.add(i); } MapSqlParameterSource parameters = new MapSqlParameterSource(); parameters.addValue("ids", ids); // Mapper(Case1) RowMapper<History> beanRowMapper = new BeanPropertyRowMapper<History>(History.class); List<History> beanResult = namedJdbcTemplate.query(sql, parameters, beanRowMapper); // Mapper(Case2) RowMapper<History> rowMapper = new HistoryRowMapper(); List<History> result = namedJdbcTemplate.query(sql, parameters, rowMapper); return result; } |
解説
各コメント欄に対応して解説してきます。
Query
IN句の中に「:ids」というような、名称を定義します。
Params
HashSetでIN句に格納する値を準備します。
MapSqlParameterSource型の変数を作成し、addValueメソッドで追加します。
「”ids”」は、Queryで指定した「:ids」に対応しています。
Mapper
(Case1)
BeanPropertyRowMapperを使うケースです。
BeanPropertyRowMapperはBeanを用意する必要がありません。
(Case2)
独自Mapper(HistoryRowMapper)を使うケースです。
どちらの場合も、以下の形式なります。
1 |
namedJdbcTemplate.query(sql, parameters, rowMapper); |
参考
独自Mapper(今回で言うHistoryRowMapper)で実装する場合、
以下のようにMapperとBeanを用意します。
HistoryRowMapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper; public class HistoryRowMapper implements RowMapper<History> { @Override public History mapRow(ResultSet rs, int rowNum) throws SQLException { History history = new History( rs.getInt("id") ,rs.getString("content") ); return history; } } |
History
1 2 3 4 5 6 7 8 9 10 11 12 |
import lombok.Getter; @Getter public class History { private int _id; private String _content; History(int id, String content){ _id = id; _content = content; } } |
コメント