`
tkiicpp
  • 浏览: 83218 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Ibatis sql书写经验2 模糊查询+动态查询

阅读更多

这几天在学习使用IBATIS突然要使用模糊查询,以及动态多个条件查询,按照自己的想法试了很久,都没解决这个问题.

首先是模糊查 询的问题,开始时我使用如下条件:select * from user where name like '%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是使用$来代替#号.

1>写成: like '%$value$%' 就可以了,<!--  模糊查询不能用#,#是用prepareStatement的?插入参数,$是文本替换  --> ,

2>同时还找到另一个方法,但是那个 方法我试了很久,就是不行,方法为: like '%' || #value# || '%'  , 查询出来的结果居然是全部.后来在网上有人说,这个写法是oracle的写法,

3> 如果是mysql,则应该写成: name like CONCAT('%',#value:VARCHAR#,'%')  ,不过我没试用过,反正有一个方法成功就可以了.

第 一个方法我试用成功,后面的也就没试过,有兴趣的朋友可以试试

第二个大问题就是多条件组合查询,开始时,我也在想这个问题,总不能为每一个 查询都写一个SQL配制吧,这样太........后来参考一些文档,发现,原来IBATIS里提供了动态映射.示例如下:

 <!--
在ibatis中使用安全的拼接语句,动态查询
ibatis比JDBC的优势之一,安全高效
说明文字在注释中
-->


  
< select  id ="selectAllProducts"  parameterClass ="Product"  resultMap ="ProductResult" >
    select id,note from Product
       
< dynamic  prepend ="WHERE" >
       
<!--  isNotNull判断参数是否存在,Integer类型  -->
            
< isNotNull  property ="id" >
                
<!--  isGreaterThan判断参数是否大于 compareValue,isGreaterEquals是大于等于  -->
                
< isGreaterThan  prepend =" and "  property ="id"  compareValue ="0" >
                id = #id#
                
</ isGreaterThan >
            
</ isNotNull >
            
<!--  isNotEmpty判断字串不为空,isEmpty可以判断字串为空  -->
            
< isNotEmpty  prepend =" and "  property ="note" >
            
<!--  模糊查询不能用#,#在是用prepareStatement的?插入参数,$是文 本替换  -->
            note like '%$note$%'
            
</ isNotEmpty >
        
</ dynamic >
  
</ select >
  
用Map传参数
  
  
< select  id ="selectAllProducts"  parameterClass ="java .util.HashMap"  resultMap ="ProductResult" >
    select id,note from Product
       
< dynamic  prepend ="WHERE" >
       
<!--  isPropertyAvailable判断属性是否有效  -->
          
< isPropertyAvailable  property ="id" >
            
< isNotNull  property ="id" >
                
<!--  isLessThan判断参数是否小于 compareValue,isLessEquals是小于等于  -->
                
< isLessThan  prepend =" and "  property ="id"  compareValue ="10" >
                id = #id#
                
</ isLessThan >
            
</ isNotNull >
          
</ isPropertyAvailable >
        
</ dynamic >
  
</ select >
 
<!-- ------------------------------------------------------------------ 几个常用属性 -->

< isPropertyAvailable >  属性是存在
< isNotPropertyAvailable >  属性不存在
< isNull >  属性值是null
< isEmpty >  判断 Collection.size < 1 或String.length()<1
<isEqual
>  等于
< isNotEqual >  不等于
< isGreaterThan >  大于
< isGreaterEqual >  大于等于
< isLessThan >  小于
< isLessEqual >  小于等于

 

 

以 下是引用一个文章,大家可以参考一下 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. How do I use LIKE in my queries

 

分享到:
评论

相关推荐

    ibatis sql 语句的编写

    ibatis还支持动态SQL,允许根据不同的条件生成不同的SQL语句,这对于复杂的查询非常有用。 ##### 4.1 `if`标签 ```xml SELECT * FROM USERS != null"&gt; AND name = #{name} ``` 这里使用`&lt;if&gt;`标签来...

    ibatis动态SQL标签用法

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

    各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernat)

    各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernat)

    ibatis sql生成工具

    此外,该工具可能还包含了对复杂的查询条件的支持,比如模糊搜索、分页查询等,这些在生成的SQL中会以动态SQL的形式出现,使得代码更加简洁和易于维护。对于大型项目而言,这种自动化生成的功能能够显著减少编码时间...

    stuts2+ibatis+jQuery +UI + flexgrid+Json做的一个用户管理界面

    【标题】"stuts2+ibatis+jQuery +UI + flexgrid+Json做的一个用户管理界面"揭示了这个项目是基于一系列技术构建的用户管理系统。接下来,我们将详细探讨这些技术及其在用户管理中的应用。 **Struts2**:Struts2 是...

    struts2+spring+ibatis+mysql

    "Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...

    spring2+struts1+ibatis2

    spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2

    iBATIS模糊查询

    1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...

    ibatis开发包(common+sqlmap+dao)

    这个开发包包含了Ibatis的核心组件,分别是`ibatis-common-2.jar`、`ibatis-sqlmap-2.jar`和`ibatis-dao-2.jar`。 1. **ibatis-common-2.jar**: 这个组件是Ibatis的基础工具包,包含了Ibatis运行时的一些通用类和...

    struts2+spring3+ibatis项目整合案例

    Struts2、Spring3和iBATIS是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的Web应用。在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何...

    springboot+mysql+ibatis完整整合案例

    在本项目中,"springboot+mysql+ibatis完整整合案例"是一个针对初学者的教程,旨在演示如何将Spring Boot、MySQL数据库和MyBatis框架有效地集成在一起,创建一个可运行的应用程序。以下是对这些技术及其整合过程的...

    struts2+spring+Ibatis框架包

    Struts2、Spring和iBatis是Java Web开发中三个非常重要的开源框架,它们共同构建了一个灵活、可扩展且高效的应用程序开发环境。这个“struts2+spring+iBatis框架包”集成了这三个框架,使得开发者能够快速构建基于...

    struts2+spring+ibatis整合项目实例

    - **SQL映射**:在iBatis的XML映射文件中编写SQL语句,通过动态SQL支持复杂查询。 - **拦截器**:Struts2的拦截器可以增强Action的功能,如登录检查、权限验证等。 通过这个整合项目实例,开发者可以学习到如何在...

    struts2+hibernate+spring+ibatis 小实例

    struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+hibernate+spring+ibatis 小实例struts2+...

    ibatis的CRUD+存储过程+动态查询

    本教程将深入探讨Ibatis如何实现CRUD(创建、读取、更新、删除)操作,如何调用存储过程,以及如何进行动态查询。 **创建(Create)** 在Ibatis中,创建数据通常通过SQL映射文件实现。每个映射文件包含一个或多个...

    spring+struts2+ibatis整合的jar包

    iBatis还支持动态SQL,可以方便地处理复杂的查询需求。 当我们把Spring、Struts2和iBatis整合在一起时,可以构建出一个高效、模块化的Web应用。Spring作为整体的框架容器,负责管理所有的Bean,包括Struts2和iBatis...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    struts2+spring+ibatis+oracle+分页搜索+上传附件实例

    综上所述,这个实例展示了如何整合Struts2、Spring、iBatis和Oracle来构建一个完整的Web应用,实现了动态分页搜索和附件上传功能。这种架构具有良好的可扩展性和可维护性,适用于各种中大型企业级项目。开发者可以...

    ibatis-sqlmaps-2_cn

    《ibatis-sqlmaps-2_cn》是一本专注于介绍IBATIS框架的中文教程,非常适合初学者和有经验的开发者进行深入学习。IBATIS,作为一个轻量级的持久层框架,它为Java应用程序提供了数据库操作的支持,尤其在处理SQL映射...

Global site tag (gtag.js) - Google Analytics