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被转换成大写,还需再研究研究,对于以上两个疑问必要时还可以发挥一下。也要权衡一下花那个时间值不值。
分享到:
相关推荐
SQLServer Ibatis XML自动生成工具是一款实用的开发辅助软件,主要针对Java开发人员,特别是那些在项目中使用Ibatis作为持久层框架的开发者。这款工具能够显著提高开发效率,通过自动化的方式生成Ibatis所需的XML...
- 在编写SQL时,应避免使用全模糊匹配`LIKE '%text%'`,而应尽可能使用带有前缀或后缀的模糊匹配,如`LIKE 'text%'`,这可以显著提升查询效率。 - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大...
name LIKE '%$name$%' age = #age# ``` #### 事务管理 iBatis支持两种事务管理机制:基于JDBC的事务管理和基于JTA(Java Transaction API)的事务管理。 - **基于JDBC的事务管理**:直接在Java代码中...
#### 一、iBATIS中的LIKE查询技巧 iBATIS是一款优秀的Java持久层框架,它简化了基于SQL的程序编写,避免了程序员手动处理结果集和手工编写SQL语句。在进行数据库查询时,LIKE查询是一种常见的需求,特别是在搜索...
iBATIS模糊查询 iBATIS模糊查询是指使用iBATIS框架实现模糊查询的方法。模糊查询是指在数据库中搜索包含指定字符串的记录,通常使用LIKE谓词来实现。 在iBATIS中,模糊查询可以通过在映射文件中定义SQL语句来实现...
iBatis动态SQL标签用法 iBatis是Java持久层框架,提供了动态SQL标签来实现动态查询。动态SQL标签可以根据不同的条件生成不同的SQL语句,从而提高查询效率和灵活性。 动态SQL片段 iBatis提供了动态SQL片段的功能,...
标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...
AND name LIKE CONCAT('%', #{name}, '%') ``` 事务管理Ibatis 的事务管理可以通过 XML 配置文件中的 `<transactionManager>` 标签设置,如上述配置中的 JDBC 事务管理器。在实际应用中,我们还需要在代码中...
**API ibatis2** iBATIS 是一个Java编程语言中的持久层框架,它允许开发者将SQL语句直接集成到Java代码中,简化了数据库访问的复杂性。在iBATIS 2版本中,这个框架提供了强大的数据映射功能,允许程序员以面向对象...
iBatis 动态查询条件详解 iBatis 是一个基于 Java 的持久层框架,它提供了动态查询条件的功能,可以根据不同的条件生成不同的 SQL 语句。在 iBatis 中,动态查询条件是通过 `<dynamic>` 元素来实现的,该元素可以...
Ibatis,作为一个轻量级的Java持久层框架,提供了灵活的SQL映射机制,使得开发者能够更方便地处理数据库交互。本篇文章将深入探讨Ibatis SqlMap在2.3.0版本中对通配符的支持,帮助开发者更好地理解和利用这一特性。 ...
模糊查询通常涉及SQL的`LIKE`操作,可以在iBatis的映射文件中配置,然后在JSF页面提供搜索框,将输入传递给后台进行模糊匹配。 9. **错误处理和验证**:JSF提供了内置的验证机制,可以对用户输入进行校验,防止无效...
criteria.andSub1Like("%" + sub1 + "%"); } if (createdates != null && createdatee != null) { criteria.andCreatedateBetween(createdates, createdatee); } criteria.andIsdeleteEqualTo(0); ``` 上述代码...
### ibatis SQL语句对条件中特殊字符% # 处理 在开发过程中,经常会遇到SQL查询时需要处理字符串中的特殊字符的情况。特别是在使用类似`LIKE`这样的操作符时,如果用户输入的数据中含有`%`、`_`或`#`等特殊字符,...
模糊查询常用于文本搜索,Ibatis支持在SQL语句中使用`LIKE`关键字结合通配符进行模糊匹配。例如,用户输入的部分关键词可以与数据库中的数据进行比较。 ```xml SELECT * FROM users WHERE username LIKE CONCAT('...
= null">AND name LIKE #{name} != null">AND age >= #{age} ``` 五、缓存机制 Ibatis提供了本地缓存和二级缓存两种机制,可以提高数据读取的效率。本地缓存默认开启,作用于单个SqlSession,二级缓存则可...
### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...
SELECT * FROM User WHERE username LIKE '%${username}%' ``` 这里的`%`是SQL通配符,`%username%`会匹配任何包含`username`的字符串。 在Java代码中,你需要创建一个对应的`UserMapper`接口,该接口中的方法名...
### ibatis的动态查询知识点详解 #### 一、模糊查询 **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` ...
SELECT * FROM student WHERE name LIKE CONCAT('%', #{name}, '%') ``` **三、创建StudentMapper接口** 在Java代码中,我们需要创建一个接口`StudentMapper`,并在其中声明对应的操作方法,这些方法将由Ibatis...