iBatis 中 Like '%iBatis%' 的写法实现模糊查询
2007-07-26 15:06
iBatis 开发指南告诉我们,当 Person 对象的 name 属性不为 null 时启用 name 查询条件在映射文件 person.xml 中的配置为
1. <select id="getPersonsByName" resultClass="com.unmi.Person">
2. select id as id,name as name,passwd as passwd from person
3. <dynamic prepend="WHERE">
4. <isNotNull prepend="AND" property="name">
5. (name like #name#)
6. </isNotNull>
7. </dynamic>
8. </select>
<select id="getPersonsByName" resultClass="com.unmi.Person"> select id as id,name as name,passwd as passwd from person <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="name"> (name like #name#) </isNotNull> </dynamic> </select>
再用如下的代码调用
1. Person person = new Person();
2. person.setName("unmi");
3. List list = sqlMap.queryForList("getPersonsByName", person);
Person person = new Person(); person.setName("unmi"); List list = sqlMap.queryForList("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 where name like '%unmi%';
也就是如上的 like 语义在 person.xml中应该怎么表述呢?我曾经是想当然的尝试把
(name like #name#) 写成 (name like '%#name#%') 或 (name like %#name#%) ,都没法通过,分别报错
java.sql.SQLException: Invalid argument in JDBC call: parameter index out of range: 1
和
java.sql.SQLException: Unexpected token: % in statement [ select id......
那么正确的写法是什么呢?在网上找到一个解答 How do I use LIKE in my queries,方法有两种
1. 是把上面 (name like '%#name#%') 的 # 换成 $, 也就是 (name like '%$name$%')
2. 是用 || 连接字符串的方式,写成 (name like '%' || #name# || '%')
但却不能写成 (name like '%'||$name$||'%') ,不能又要出错
java.sql.SQLException: Column not found: UNMI in statement [select id......
总结一下,在 iBatis 中用 like 的模糊查询的配置如下(两种方式)
1. <select id="getPersonsByName" resultClass="com.unmi.Person">
2. select id as id,name as name,passwd as passwd from person
3. <dynamic prepend="WHERE">
4. <isNotNull prepend="AND" property="name">
5.
(name like '%$name$%')
6. <!-- (name like '%'||#name#||'%') -->
7. </isNotNull>
8. </dynamic>
9. </select>
<select id="getPersonsByName" resultClass="com.unmi.Person"> select id as id,name as name,passwd as passwd from person <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="name"> (name like '%$name$%') <!-- (name like '%'||#name#||'%') --> </isNotNull> </dynamic> </select>
不知细心的诸位注意到没有,这同时也是我在组织上面文字时产生的疑问:
1. 写成 (name like '%'||$name$||'%') 为什就不行呢?# 和 $ 有什么区别呢?
2. 还有明明是写成的 unmi,为什么报错的时候又是全大写的 UNMI 呢?
具体的异同我们可能还需从源代码中找,简单的只要知道,$name$ 是字面意义的替换,这种形式要注意 SQL 注入的漏洞;#name# 是带类型的替换。至于unmi被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
分享到:
相关推荐
$sql=”select name,password,email from user_500 where name like ‘%$info%’ or password like ‘%$info%’ or email like ‘%$info%'”; $sqlTools=new SqlTools(); $res=$sqlTools->execute_dql($sql); while...
SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} 代替 #{...} SELECT * FROM tableName WHERE name LIKE '%${text}%'; 3. 程序中拼接 Java // ...
上述代码中,`scopeSearch`接收一个查询构造器和关键词参数,然后在`name`和`email`字段上使用`like`操作符进行模糊匹配。这样,当我们在查询用户时,只需调用这个`scope`,就能实现关键词的搜索。 ```php $users =...
SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入攻击,因为攻击者可以inject恶意SQL代码。正确的做法是使用参数化查询,例如: ```xml select * from t_stu where s_name like '...
例如,`name like '%明%'`会返回所有在`name`字段中包含“明”字的记录。 2. `*`:在某些SQL方言中(如MySQL),`*`和`%`功能相同,但在标准SQL中,`*`通常用于目录路径或文件名中的通配符,而不是作为LIKE语句的...
AND name LIKE '%${name}%' AND name LIKE '%John%' ``` 在此示例中,将根据`age`和`name`的值来决定最终的SQL语句。 3. **标签**:该标签用于移除SQL语句中的前导和尾随空白字符,以及多余的逗号等,...
$sql = "SELECT * FROM myTable WHERE column_name LIKE '%$searchTerm%'"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 输出数据 while($row = $result->fetch_assoc()) { echo "id: " . ...
例如, 如果`name`参数不为空,则添加`name like '%$name$%'`的条件;如果`path`参数不为空,则添加`path like '%path$%'`的条件。 参数名称 在iBatis中,参数名称可以是虚拟的,非数据库字段的名称。例如,在上面...
CREATE INDEX test_like__name_reverse ON test_like(reverse(object_name)); ``` 通过上述语句创建了一个名为`test_like__name_reverse`的反向索引。接着,在执行查询时,可以使用如下语句: ```sql SELECT * FROM ...
WHERE name LIKE '张%' AND name LIKE '%明%'; ``` ### 6. 性能考虑 虽然`LIKE`模糊查询提供了极大的灵活性,但过度使用可能会对查询性能造成影响,特别是当匹配大型数据集时。因此,在设计数据库和编写查询时,应...
notelike '%$note$%' ``` #### 二、多条件组合查询 **知识点2:** 多条件组合查询是指在一个查询语句中同时使用多个条件,以满足更复杂的查询需求。 1. **使用 `<dynamic>` 标签进行多条件组合查询:** ...
select ep_name from epfamous where ep_name like "%图%"; ``` 结果将出现多余的数据,如“石家庄金鱼涂料集团公司”、“中国一拖集团有限公司”等,而实际上只有最后一行出现“图”字。 解决这个问题的方法是使用...
$_g_name && $sqlwhere .= " and `user_name` like '%{$_g_name}%'"; $_g_tname && $sqlwhere .= " and `userbank_tname` like '%{$_g_tname}%'"; $_g_num && $sqlwhere .= " and `userbank_num` like '%{$_g_num}%'...
username LIKE '%$name$%' email LIKE '%$email$%' ``` ### Java API 使用 在Java代码中,我们可以通过SqlMapClient接口来执行SQL语句,获取查询结果。例如: ```java SqlMapClient sqlMap = ...
它使用大量columnName IN ('param1', 'param2', 'param3', ...)和/或columnName like '%param1%' or columnName like '%param2%' or columnName like '%param3%'...简化了查询的创建columnName like '%param1%' or ...
SELECT * FROM customers WHERE name LIKE 'John%'; ``` 或查询名字长度为5个字符的所有客户: ```sql SELECT * FROM customers WHERE name LIKE '_____'; ``` ### 通配符作为文字 在某些情况下,我们可能希望将...
AND name LIKE '%${name}%' ``` 2. **使用<choose>/<when>/标签**:根据用户的年龄范围选择不同的条件。 ```xml SELECT * FROM users WHERE 1 = 1 != null"> age >= #{ageLowerBound} != null">...
where material_name like '%${value}%' or material_num like '%${value}%' ``` 这里的`<select>`标签定义了一个查询方法,`id`属性对应了Java接口方法名,`resultType`定义了返回结果的数据类型。在`where`子句...
<bind name="pattern" value="'%' + _parameter.username + '%'" /> select id,sex,age,username,password from person where username LIKE #{pattern} ``` 这样,当执行查询时,Mybatis会自动处理变量的...
SELECT column_name(s) FROM table_name WHERE column_name LIKE patternSELECT column_name(s) FROM table_name WHERE column_name LIKE pattern