这几天在学习使用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
中的配置为
-
<
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
>
<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>
再用如下的代码调用
-
Person person =
new
Person();
-
person.setName(
"unmi"
);
-
List list =
sqlMap.queryForList(
"getPersonsByName"
,
person);
Person person = new
Person(); person.setName("unmi"); List list =
sqlMap.queryForList("getPersonsByName", person);
执行效果翻译成 sql 语句就是
-
select
*
from
person
where
name
like
'unmi'
select * from person
where name like 'unmi'
这实际上是一个完全匹配的查询,与用等号写成如下语句是一致的
-
select
*
from
person
where
name
= 'unmi'
select * from person where name = 'unmi'
我们之所
以要用 like 谓词,一般都想实现模糊查询,比如说 name 以 'unmi' 开始、结束或包含 'unmi' 的记录,如下
-
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%'; 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 的模糊查询的配置如下(两种方式)
-
<
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
>
<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,允许根据不同的条件生成不同的SQL语句,这对于复杂的查询非常有用。 ##### 4.1 `if`标签 ```xml SELECT * FROM USERS != null"> AND name = #{name} ``` 这里使用`<if>`标签来...
iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,可以将SQL语句拆分成小的...
各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernat)
此外,该工具可能还包含了对复杂的查询条件的支持,比如模糊搜索、分页查询等,这些在生成的SQL中会以动态SQL的形式出现,使得代码更加简洁和易于维护。对于大型项目而言,这种自动化生成的功能能够显著减少编码时间...
【标题】"stuts2+ibatis+jQuery +UI + flexgrid+Json做的一个用户管理界面"揭示了这个项目是基于一系列技术构建的用户管理系统。接下来,我们将详细探讨这些技术及其在用户管理中的应用。 **Struts2**:Struts2 是...
"Struts2+Spring+Ibatis+MySQL" 是一个经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。这个组合集成了强大的MVC(Model-View-Controller)框架Struts2、依赖注入与面向切面编程的Spring框架、...
spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2spring2+struts1+ibatis2
1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...
这个开发包包含了Ibatis的核心组件,分别是`ibatis-common-2.jar`、`ibatis-sqlmap-2.jar`和`ibatis-dao-2.jar`。 1. **ibatis-common-2.jar**: 这个组件是Ibatis的基础工具包,包含了Ibatis运行时的一些通用类和...
Struts2、Spring3和iBATIS是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的Web应用。在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何...
在本项目中,"springboot+mysql+ibatis完整整合案例"是一个针对初学者的教程,旨在演示如何将Spring Boot、MySQL数据库和MyBatis框架有效地集成在一起,创建一个可运行的应用程序。以下是对这些技术及其整合过程的...
Struts2、Spring和iBatis是Java Web开发中三个非常重要的开源框架,它们共同构建了一个灵活、可扩展且高效的应用程序开发环境。这个“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+...
本教程将深入探讨Ibatis如何实现CRUD(创建、读取、更新、删除)操作,如何调用存储过程,以及如何进行动态查询。 **创建(Create)** 在Ibatis中,创建数据通常通过SQL映射文件实现。每个映射文件包含一个或多个...
iBatis还支持动态SQL,可以方便地处理复杂的查询需求。 当我们把Spring、Struts2和iBatis整合在一起时,可以构建出一个高效、模块化的Web应用。Spring作为整体的框架容器,负责管理所有的Bean,包括Struts2和iBatis...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
综上所述,这个实例展示了如何整合Struts2、Spring、iBatis和Oracle来构建一个完整的Web应用,实现了动态分页搜索和附件上传功能。这种架构具有良好的可扩展性和可维护性,适用于各种中大型企业级项目。开发者可以...
《ibatis-sqlmaps-2_cn》是一本专注于介绍IBATIS框架的中文教程,非常适合初学者和有经验的开发者进行深入学习。IBATIS,作为一个轻量级的持久层框架,它为Java应用程序提供了数据库操作的支持,尤其在处理SQL映射...