`
zhangzuanqian
  • 浏览: 270049 次
  • 来自: ...
社区版块
存档分类
最新评论

ibatis like

阅读更多

http://hi.baidu.com/edmond80/blog/item/44b31afa42aef18b9f51467e.html

 

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 楼 culbertzp 2010-12-23  
引用
(name like '%$name$%')  
       <!-- (name like '%'||#name#||'%') -->

如果没记错的话,使用||的执行效率要慢些
引用
至于unmi被转换成大写,还需再研究研究

如果使用的是Oracle数据库,那么所有的SQL语句在执行之前都有转换为大写

相关推荐

    sqlserver Ibatis XML自动生成工具

    SQLServer Ibatis XML自动生成工具是一款实用的开发辅助软件,主要针对Java开发人员,特别是那些在项目中使用Ibatis作为持久层框架的开发者。这款工具能够显著提高开发效率,通过自动化的方式生成Ibatis所需的XML...

    ibatis总结 ibatis ibatis ibatis ibatis

    - 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...

    iBatis文档\ibatis.doc

    name LIKE '%$name$%' age = #age# ``` #### 事务管理 iBatis支持两种事务管理机制:基于JDBC的事务管理和基于JTA(Java Transaction API)的事务管理。 - **基于JDBC的事务管理**:直接在Java代码中...

    操作数据库 iBATIS查询

    #### 一、iBATIS中的LIKE查询技巧 iBATIS是一款优秀的Java持久层框架,它简化了基于SQL的程序编写,避免了程序员手动处理结果集和手工编写SQL语句。在进行数据库查询时,LIKE查询是一种常见的需求,特别是在搜索...

    iBATIS模糊查询

    iBATIS模糊查询 iBATIS模糊查询是指使用iBATIS框架实现模糊查询的方法。模糊查询是指在数据库中搜索包含指定字符串的记录,通常使用LIKE谓词来实现。 在iBATIS中,模糊查询可以通过在映射文件中定义SQL语句来实现...

    ibatis动态SQL标签用法

    iBatis动态SQL标签用法 iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,...

    常用ibatis配置

    标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...

    Ibatis培训教程

    AND name LIKE CONCAT('%', #{name}, '%') ``` 事务管理Ibatis 的事务管理可以通过 XML 配置文件中的 `&lt;transactionManager&gt;` 标签设置,如上述配置中的 JDBC 事务管理器。在实际应用中,我们还需要在代码中...

    API ibatis2

    **API ibatis2** iBATIS 是一个Java编程语言中的持久层框架,它允许开发者将SQL语句直接集成到Java代码中,简化了数据库访问的复杂性。在iBATIS 2版本中,这个框架提供了强大的数据映射功能,允许程序员以面向对象...

    ibatis_动态查询条件

    iBatis 动态查询条件详解 iBatis 是一个基于 Java 的持久层框架,它提供了动态查询条件的功能,可以根据不同的条件生成不同的 SQL 语句。在 iBatis 中,动态查询条件是通过 `&lt;dynamic&gt;` 元素来实现的,该元素可以...

    ibatis-sqlmap-2.3.0中sqlmap支持通配符

    Ibatis,作为一个轻量级的Java持久层框架,提供了灵活的SQL映射机制,使得开发者能够更方便地处理数据库交互。本篇文章将深入探讨Ibatis SqlMap在2.3.0版本中对通配符的支持,帮助开发者更好地理解和利用这一特性。 ...

    jsf+ibatis增删改查

    模糊查询通常涉及SQL的`LIKE`操作,可以在iBatis的映射文件中配置,然后在JSF页面提供搜索框,将输入传递给后台进行模糊匹配。 9. **错误处理和验证**:JSF提供了内置的验证机制,可以对用户输入进行校验,防止无效...

    ibatis Example使用

    criteria.andSub1Like("%" + sub1 + "%"); } if (createdates != null && createdatee != null) { criteria.andCreatedateBetween(createdates, createdatee); } criteria.andIsdeleteEqualTo(0); ``` 上述代码...

    ibatis sql语句对条件中特殊字符% # 处理

    ### ibatis SQL语句对条件中特殊字符% # 处理 在开发过程中,经常会遇到SQL查询时需要处理字符串中的特殊字符的情况。特别是在使用类似`LIKE`这样的操作符时,如果用户输入的数据中含有`%`、`_`或`#`等特殊字符,...

    ibatis常见案例

    模糊查询常用于文本搜索,Ibatis支持在SQL语句中使用`LIKE`关键字结合通配符进行模糊匹配。例如,用户输入的部分关键词可以与数据库中的数据进行比较。 ```xml SELECT * FROM users WHERE username LIKE CONCAT('...

    ibatis的增删改查功能

    = null"&gt;AND name LIKE #{name} != null"&gt;AND age &gt;= #{age} ``` 五、缓存机制 Ibatis提供了本地缓存和二级缓存两种机制,可以提高数据读取的效率。本地缓存默认开启,作用于单个SqlSession,二级缓存则可...

    ibatis and和or联合查询 .doc

    ### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...

    IBatis完成单表基本的数据库操作 模糊查询

    SELECT * FROM User WHERE username LIKE '%${username}%' ``` 这里的`%`是SQL通配符,`%username%`会匹配任何包含`username`的字符串。 在Java代码中,你需要创建一个对应的`UserMapper`接口,该接口中的方法名...

    ibatis的动态查询

    ### ibatis的动态查询知识点详解 #### 一、模糊查询 **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` ...

    ibatis框架实现的增删改查

    SELECT * FROM student WHERE name LIKE CONCAT('%', #{name}, '%') ``` **三、创建StudentMapper接口** 在Java代码中,我们需要创建一个接口`StudentMapper`,并在其中声明对应的操作方法,这些方法将由Ibatis...

Global site tag (gtag.js) - Google Analytics