天天看點

Java如何使用Spring JdbcTemplate向in語句中傳遞參數

目錄

一、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類來實作。