Zer*_*One 19 java spring spring-jdbc jdbctemplate
我有一个带有Foos的MySQL表.每个Foo都有一个数字非唯一代码和一个名称.现在我需要查找是否有任何具有某些代码的Foo恰好具有以给定字符串开头的名称.在普通的SQL中,这将是微不足道的:
select * from FOO where CODE in (2,3,5) and NAME like 'bar%';
Run Code Online (Sandbox Code Playgroud)
但是我现在如何在Spring中正确地做到这一点?如果不需要'like'运算符,我会这样做:
public List<Foo> getByName(List<Integer> codes, String namePart) {
String sql = "select * from FOO where CODE in (:codes) and NAME=:name"
Map<String,Object> params = new HashMap<String,Object>();
params.put("codes", codes);
params.put("name", namePart);
return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}
Run Code Online (Sandbox Code Playgroud)
然而,与"喜欢"似乎没有任何工作:NAME like :name%,NAME like ':name%'或NAME like ?%使用占位符代替命名参数时.
我可能是残酷的并且输入它
String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";`
Run Code Online (Sandbox Code Playgroud)
但是很明显,如果Spring能够正确地清理输入参数等,那就太好了,你知道......
你会认为Spring会以某种方式支持它,但我无法弄明白.
Zer*_*One 31
等等,当然我必须"再试一次",然后再称它为一天,并且看,我所有的单位测试突然通过了:
public List<Foo> getByName(List<Integer> codes, String namePart) {
String sql = "select * from FOO where CODE in (:codes) and NAME like :name"
Map<String,Object> params = new HashMap<String,Object>();
params.put("codes", codes);
params.put("name", namePart+"%");
return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}
Run Code Online (Sandbox Code Playgroud)
我没想到在参数中输入"%",我确信Spring会自动逃脱它.我想知道我做得对吗?
要使命名参数起作用,您需要使用NamedParameterJdbcTemplate
params.put("name", "Joe%");
jdbcTemplate.query("select * from FOO where CODE in (:codes) and NAME like :name"
Run Code Online (Sandbox Code Playgroud)