2023年7月24日发(作者:)
iBatis中Like%iBatis%的写法实现模糊查询
iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启⽤ name 查询条件在映射⽂件 中的配置为1.
2. select id as id,name as name,passwd as passwd from person
3.
4.
5. (name like #name#)
6.
7.
8.
(name like #name#)
再⽤如下的代码调⽤1. Person person = new Person();
2. e("unmi");
3. List list = orList("getPersonsByName", person);
Person person = new Person(); e("unmi"); List list = orList("getPersonsByName",person);
执⾏效果翻译成 sql 语句就是1. select * from person where name like 'unmi'
select * from person where name like 'unmi'
这实际上是⼀个完全匹配的查询,与⽤等号写成如下语句是⼀致的1. select * from person where name = 'unmi'
select * from person where name = 'unmi'
我们之所以要⽤ like 谓词,⼀般都想实现模糊查询,⽐如说 name 以 'unmi' 开始、结束或包含 'unmi' 的记录,如下1. select * from person where name like 'unmi%';
2. select * from person where name like '%unmi';
3. select * from person where name like '%unmi%'; select * from person where name like 'unmi%'; select * from person where name like '%unmi'; select * from person wherename like '%unmi%';
也就是如上的 like 语义在 中应该怎么表述呢?我曾经是想当然的尝试把(name like #name#) 写成 (name like '%#name#%') 或 (name like %#name#%) ,都没法通过,分别报错eption: Invalid argument in JDBC call: parameter index out of range: 1和eption: Unexpected token: % in statement [ 那么正确的写法是什么呢?在⽹上找到⼀个解答 ,⽅法有两种1. 是把上⾯ (name like '%#name#%') 的 # 换成 $, 也就是 (name like '%$name$%')2. 是⽤ || 连接字符串的⽅式,写成 (name like '%' || #name# || '%')但却不能写成 (name like '%'||$name$||'%') ,不能⼜要出错eption: Column not found: UNMI in statement [总结⼀下,在 iBatis 中⽤ like 的模糊查询的配置如下(两种⽅式)1.
2. select id as id,name as name,passwd as passwd from person
3.
4.
5. (name like '%$name$%')
6.
7.
8.
9.
不知细⼼的诸位注意到没有,这同时也是我在组织上⾯⽂字时产⽣的疑问:1. 写成 (name like '%'||$name$||'%') 为什就不⾏呢?# 和 $ 有什么区别呢?2. 还有明明是写成的 unmi,为什么报错的时候⼜是全⼤写的 UNMI 呢?具体的异同我们可能还需从源代码中找,简单的只要知道,$name$ 是字⾯意义的替换,这种形式要注意 SQL 注⼊的漏洞;#name# 是带类型的替换。⾄于unmi被转换成⼤写,还需再研究研究,对于以上两个疑问必要时还可以发挥⼀下。也要权衡⼀下花那个时间值不值。参考资料: 1.
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690193254a312415.html
评论列表(0条)