目錄
一、Jdbctemplate方式
二、NamedParameterJdbcTemplate方式
三、總結
一、Jdbctemplate方式
傳統的Jdbctemplate類無法直接向in語句傳遞參數,需要通過字元串拼接的方式來實作。例如:
1.常見的通過占位符查詢結果方式(無法适用in語句)
//查詢id等于123的使用者資訊
String sql = "select * from user where id = ?";
Map<String, Object> args = new HashMap<>();
args.put("id", 123);
jdbcTemplate.queryForList(sql, args , User.class )
2.如果使用上述方式向in語句中傳遞參數
//查詢id為1,2,3的使用者資訊
String sql = "select * from user where id in (?)";
Map<String, Object> args = new HashMap<>();
int[] ids = {1,2,3}
args.put("id", ids);
jdbcTemplate.queryForList(sql, args , User.class );
這裡查詢語句被替換後如下,執行時會報錯
//不符合sql語句規範
select * from user where id in ([1,2,3])
3.解決方案:使用字元串拼接
String ids = "1,2,3";
String sql = "select * from user where id in (" + ids +")";
如果入參是字元串,要用兩個單引号' 内容'引起來,這樣就滿足SQL的文法,例如:
String ids = "'1','2','3'";
String sql = "select * from user where id in (" + ids +")";
二、NamedParameterJdbcTemplate方式
Jdbctemplate是比較底層的類,是以功能比較有局限性。NamedParameterJdbcTemplate是對Jdbctemplate的再次封裝,它可以使用具名參數來綁定Sql參數。一系列具名參數組成一個map傳入,這樣傳參的順序就沒有限制了。
使用NamedParameterJdbcTemplate實作in語句的傳參非常簡單,如下:
String sql = "select * from user where name in (:names)";
String[] arr = {"張三","李四","王五"};
ArrayList<String> names = new ArrayList<String>(Arrays.asList(arr));
Map<String, Obeject> args = new HashMap<String,Object>();
args.put("names", names);
NamedParameterJdbcTemplate jdbcTmeplate = new NameParameterJdbcTemplate(jdbctemplate);
jdbcTemplate.queryForList(sql,args);
三、總結
使用Jdbctemplate傳遞給in語句參數時,如果參數是固定的,那麼拼接成字元串很簡單。但是如果參數不固定,是通過數組或清單給出的。那麼在進行字元串拼接時,就會比較複雜麻煩,需要将數組的值轉換成字元串,每個元素用逗号分隔并用單引号括起來。綜合比較,給in語句傳遞參數推薦使用NamedParameterJdbcTemplate類來實作。