`
zhanglm
  • 浏览: 76052 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis的like用法(轉)

    博客分类:
  • java
阅读更多

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. How do I use LIKE in my queries 

分享到:
评论

相关推荐

    ibatis总结 ibatis ibatis ibatis ibatis

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

    sqlserver Ibatis XML自动生成工具

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

    ibatis动态SQL标签用法

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

    iBatis文档\ibatis.doc

    在开始使用iBatis之前,确保你已经安装了Java运行环境,并配置了相应的JDBC驱动,这将使iBatis能够与数据库进行交互。同时,你需要一个XML配置文件来定义SqlMapClient,这是iBatis的主要接口。 #### 构建 iBatis ...

    ibatis Example使用

    根据提供的文件信息,我们可以从中提炼出与ibatis及其Example特性相关的知识点。以下是对这些知识点的详细阐述: ### 1. **ibatis简介** ...希望本文能对你理解和使用ibatis及其Example特性提供一定的帮助。

    操作数据库 iBATIS查询

    在iBATIS中,可以使用类似的方法来实现这样的查询。一种常见的错误写法是直接将`%`包含在SQL字符串中,如下所示: ```xml SELECT * FROM t_stu WHERE s_name LIKE #name# ``` 这种方式的问题在于,当调用查询时...

    iBATIS模糊查询

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

    Ibatis调用Oracle存储过程返回自定义类型

    本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现返回自定义类型的处理方法。 #### Oracle自定义类型简介 Oracle支持用户自定义数据类型,这为复杂数据结构的应用提供了极大的便利。...

    常用ibatis配置

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

    Ibatis培训教程

    码2 Ibatis 的核心接口和实现类在使用 Ibatis 之前,我们需要了解其核心的接口和实现类。Ibatis 的核心接口主要包括 SqlSession 和 SqlSessionFactory。SqlSession 接口是执行 SQL 语句的主要接口,提供了 CRUD...

    ibatis dynamic 用法

    本文将详细介绍 ibatis 中 Dynamic SQL 的使用方法,特别关注 `&lt;dynamic&gt;` 标签及其相关的子标签。 #### 二、Dynamic SQL 标签概述 Dynamic SQL 在 ibatis 中主要通过以下几种标签实现: 1. **`&lt;dynamic&gt;`**:用于...

    ibatis_动态查询条件

    在动态查询条件中,iBatis 提供了多种判断参数的方法,例如 `isNotNull`、`isNotEmpty`、`isGreaterThan` 等,这些方法可以根据参数的值来生成不同的 SQL 语句。 下面是一个简单的示例,演示如何使用 iBatis 的动态...

    jsf+ibatis增删改查

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

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

    通过对ibatis框架下SQL语句中特殊字符处理方法的详细分析,我们可以看到,合理地使用字符串转义处理结合动态SQL标签,可以有效地解决特殊字符带来的问题。这样不仅可以保证查询的准确性,还可以提高代码的健壮性和...

    ibatis的增删改查功能

    在使用Ibatis之前,首先需要在项目的资源配置文件中引入Ibatis的相关配置,包括数据库连接信息、SqlSessionFactory的配置等。SqlSessionFactory是Ibatis的核心对象,用于创建SqlSession,它是执行SQL的入口。 二、...

    ibatis的动态查询

    以上内容详细介绍了 ibatis 中动态查询的基本原理及具体实现方法,包括模糊查询、多条件组合查询以及使用 Map 作为参数的高级用法。这些知识点对于深入理解 ibatis 的动态查询机制非常重要,可以帮助开发者更高效地...

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

    标题 "IBatis完成单表基本的数据库操作 模糊查询" 涉及到的是使用iBatis这个轻量级的持久层框架进行数据库的基本操作,特别是模糊查询。iBatis是一个优秀的SQL映射框架,它允许开发者将SQL语句与Java代码分离,提高...

    ibatis

    Ibatis使用SqlSessionFactory来创建SqlSession实例,SqlSession是与数据库交互的主要接口。SqlSessionFactory是一个重量级对象,通常在应用启动时创建一次,然后在整个应用生命周期中重复使用。 ```java ...

    ibatis框架实现的增删改查

    本篇文章将深入探讨如何使用Ibatis框架实现对`student`表的增删改查操作,包括模糊查询以及利用序列自动生成主键。 首先,我们来理解Ibatis的基本概念。Ibatis是由Apache基金会维护的一个开源项目,它是一个SQL映射...

    ibatis教程_查询指定id的单个对象

    本教程聚焦于如何使用Ibatis查询指定ID的单个对象,这对于日常的数据检索工作尤为重要。 首先,理解Ibatis的基本架构。Ibatis不是一个完整的ORM(对象关系映射)框架,而是介于SQL和Java之间的桥梁,允许开发者编写...

Global site tag (gtag.js) - Google Analytics