`
zscomehuyue
  • 浏览: 414710 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(name like '%$name$%')

阅读更多
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被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
分享到:
评论
1 楼 huangsky 2010-12-02  
没看仔细
'%$name$%'这个只是单纯的字符串连接,会给注入的
是要模糊查询,看下面的博文
http://huangsky.iteye.com/blog/824434

相关推荐

    php站内搜索并高亮显示关键字的实现代码

    $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-&gt;execute_dql($sql); while...

    Desktop.zip

     SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');   2. 使用 ${...} 代替 #{...}  SELECT * FROM tableName WHERE name LIKE '%${text}%';    3. 程序中拼接  Java  // ...

    Laravel开发-searchable

    上述代码中,`scopeSearch`接收一个查询构造器和关键词参数,然后在`name`和`email`字段上使用`like`操作符进行模糊匹配。这样,当我们在查询用户时,只需调用这个`scope`,就能实现关键词的搜索。 ```php $users =...

    iBATIS模糊查询

    SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入攻击,因为攻击者可以inject恶意SQL代码。正确的做法是使用参数化查询,例如: ```xml select * from t_stu where s_name like '...

    SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解

    例如,`name like '%明%'`会返回所有在`name`字段中包含“明”字的记录。 2. `*`:在某些SQL方言中(如MySQL),`*`和`%`功能相同,但在标准SQL中,`*`通常用于目录路径或文件名中的通配符,而不是作为LIKE语句的...

    关于mybatis的一些相关资源

    AND name LIKE '%${name}%' AND name LIKE '%John%' ``` 在此示例中,将根据`age`和`name`的值来决定最终的SQL语句。 3. **标签**:该标签用于移除SQL语句中的前导和尾随空白字符,以及多余的逗号等,...

    自写php+MySQL模糊查询

    $sql = "SELECT * FROM myTable WHERE column_name LIKE '%$searchTerm%'"; $result = $conn-&gt;query($sql); if ($result-&gt;num_rows &gt; 0) { // 输出数据 while($row = $result-&gt;fetch_assoc()) { echo "id: " . ...

    ibatis动态SQL标签用法

    例如, 如果`name`参数不为空,则添加`name like '%$name$%'`的条件;如果`path`参数不为空,则添加`path like '%path$%'`的条件。 参数名称 在iBatis中,参数名称可以是虚拟的,非数据库字段的名称。例如,在上面...

    oracle like 的优化

    CREATE INDEX test_like__name_reverse ON test_like(reverse(object_name)); ``` 通过上述语句创建了一个名为`test_like__name_reverse`的反向索引。接着,在执行查询时,可以使用如下语句: ```sql SELECT * FROM ...

    SQL使用Like模糊查询

    WHERE name LIKE '张%' AND name LIKE '%明%'; ``` ### 6. 性能考虑 虽然`LIKE`模糊查询提供了极大的灵活性,但过度使用可能会对查询性能造成影响,特别是当匹配大型数据集时。因此,在设计数据库和编写查询时,应...

    ibatis的动态查询

    notelike '%$note$%' ``` #### 二、多条件组合查询 **知识点2:** 多条件组合查询是指在一个查询语句中同时使用多个条件,以满足更复杂的查询需求。 1. **使用 `&lt;dynamic&gt;` 标签进行多条件组合查询:** ...

    MySQL数据库查询中的like问题.pdf

    select ep_name from epfamous where ep_name like "%图%"; ``` 结果将出现多余的数据,如“石家庄金鱼涂料集团公司”、“中国一拖集团有限公司”等,而实际上只有最后一行出现“图”字。 解决这个问题的方法是使用...

    PHPSHE 1.6 userbank sql注入1

    $_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}%'...

    API ibatis2

    username LIKE '%$name$%' email LIKE '%$email$%' ``` ### Java API 使用 在Java代码中,我们可以通过SqlMapClient接口来执行SQL语句,获取查询结果。例如: ```java SqlMapClient sqlMap = ...

    comp-query-constructor:一个 SQuireL SQL 插件,可简化大型查询的创建

    它使用大量columnName IN ('param1', 'param2', 'param3', ...)和/或columnName like '%param1%' or columnName like '%param2%' or columnName like '%param3%'...简化了查询的创建columnName like '%param1%' or ...

    sqlserver -like

    SELECT * FROM customers WHERE name LIKE 'John%'; ``` 或查询名字长度为5个字符的所有客户: ```sql SELECT * FROM customers WHERE name LIKE '_____'; ``` ### 通配符作为文字 在某些情况下,我们可能希望将...

    MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据

    AND name LIKE '%${name}%' ``` 2. **使用&lt;choose&gt;/&lt;when&gt;/标签**:根据用户的年龄范围选择不同的条件。 ```xml SELECT * FROM users WHERE 1 = 1 != null"&gt; age &gt;= #{ageLowerBound} != null"&gt;...

    MyBatis中的模糊查询语句

    where material_name like '%${value}%' or material_num like '%${value}%' ``` 这里的`&lt;select&gt;`标签定义了一个查询方法,`id`属性对应了Java接口方法名,`resultType`定义了返回结果的数据类型。在`where`子句...

    Mybatis中的like模糊查询功能

    &lt;bind name="pattern" value="'%' + _parameter.username + '%'" /&gt; select id,sex,age,username,password from person where username LIKE #{pattern} ``` 这样,当执行查询时,Mybatis会自动处理变量的...

    SELECT column_name(s)

    SELECT column_name(s) FROM table_name WHERE column_name LIKE patternSELECT column_name(s) FROM table_name WHERE column_name LIKE pattern

Global site tag (gtag.js) - Google Analytics