iBATIS 的sqlmap的like查询的三种方案

ibatis sqlMap.xml 文件 like 查询的三种方案

 dtd 的修改在这里有说明 http://wuxiubing.iteye.com/blog/1010635

 原: dtd 位置 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"     
    "./sql-map-2.dtd">

<sqlMap namespace="Account">
 <select id="getAllStudentLike1" resultClass="hashmap" parameterClass="String">
  select * from student where name like #name#
  <!-- sqlMapClient.queryForList("getAllStudentLike1" , "%张") ; -->
 </select>
 <select id="getAllStudentLike2" resultClass="hashmap" parameterClass="String">
  select * from student where name like '%$name$%'
  <!-- sqlMapClient.queryForList("getAllStudentLike2" , "张") ; -->
 </select>
 <select id="getAllStudentLike3" resultClass="hashmap" parameterClass="String">
  select * from student where name like '%'||#name#||'%'
  <!-- sqlMapClient.queryForList("getAllStudentLike3" , "张") ; -->
 </select>
</sqlMap>

****************************************

在通常情况下iBATIS的参数在sqlmap中使用#param#的形式,参数名以’#’包着,但当使用sql的LIKE语句时就发生了问题,在单引号中无法使用#param#这种形式

当应用SELECT * FROM TABLE WHERE COL LIKE ’value%’时如果要把'value'以参数代替,可以把整个LIKE后面的字符串全改为参数,即 SELECT * FROM TABLE WHERE COL LIKE #param#,此时参数param的值为字符串"value%"。

但有时上面这种情况会使程序变复杂,所以用参数只代替’value’时就要碰到在单引号内使用参数的问题。这时是使用’$’将参数名包起来,即SELECT * FROM TABLE WHERE COL LIKE ’$param$%’,此时参数param的值就是字符串"value"。

在网上看到另一种方法,就是SELECT * FROM TABLE WHERE COL LIKE #param#||’%’。这个方法我试过了,同样有效,此时参数param的值同样是字符串"value"。

在通常情况下iBATIS的参数在sqlmap中使用#param#的形式,参数名以’#’包着,但当使用sql的LIKE语句时就发生了问题,在单引号中无法使用#param#这种形式

当应用SELECT * FROM TABLE WHERE COL LIKE ’value%’时如果要把’value’以参数代替,可以把整个LIKE后面的字符串全改为参数,即 SELECT * FROM TABLE WHERE COL LIKE #param#,此时参数param的值为字符串"value%"。

但有时上面这种情况会使程序变复杂,所以用参数只代替’value’时就要碰到在单引号内使用参数的问题。这时是使用’$’将参数名包起来,即SELECT * FROM TABLE WHERE COL LIKE ’$param$%’,此时参数param的值就是字符串"value"。

在网上看到另一种方法,就是SELECT * FROM TABLE WHERE COL LIKE #param#||’%’。这个方法我试过了,同样有效,此时参数param的值同样是字符串"value"。

******************************************************************

ibatis配置文件中两个$中间夹字符串什么意思

{key:'aaa',value:'123'} 也就是说输出一个key为aaa的参数,可以是成员aaa(属性),也可以是Hashtable 里边的一项

$aaa$ 输出参数是以字符串方式直接输出 123

#aaa# 输出参数是以Parameter方式输出 @aaa

在通常情况下ibatis的参数在sqlmap中使用#param#的形式,参数名以’#‘包着,但当使用sql的like语句时就发生了问题,在单引号中无法使用#param#这种形式。解决办法有: 1.当应用select * from table1 where col like ’%value%’时,如果要把‘value’以参数代替,可以把整个like后面的字符串全改为参数。即:select * from table1 where col like #param# ,此时参数param的值为字符串'%value%' 2.使用‘$’将参数名包起来。例如:name like ‘%#name#%’。我们的解决方法有2。(a)把name like ‘%#name#%’的#换成$,即:name like ‘%$name$%’。(b)用||连接字符串的方式,写成,name like ‘%’|| #name#‘%’。在iBatis中,对于in子句的标准做法是采用动态sql来解决的。具体方法大致是:Java代码传入一个List或者数组,然后在sqlMapConfig映射中使用iterate循环取这个变量,动态地生成sql语句。这个标准解法的缺点是,使用起来比较麻烦1. 需要在sqlMapConfig中使用动态语句2. 需要传入一个Iterable的变量对于这个问题,我使用了一个偷懒的办法,就是使用$标记。在iBatis中,普通的变量,比如:v,是使用#号,在这个例子中,就是:#v#。这样,iBatis会使用prepareStatement,并对变量进行变量绑定。而$符号是简单替代的用法,在数据库的执行效率上要比前一种差。但优点就是简单方便。比如:SELECT * FROM emp WHERE emp_no in ($empString$);而empString的值就是1, 2, 3. 在Log中,可以看到,Sql语句就是:SELECT * FROM emp WHERE emp_no in (1,2,3)

 

1.#是把传入的数据当作字符串,如#field#传入的是id,则sql语句生成是这样,order by "id",这当然会报错..
2.$传入的数据直接生成在sql里,如#field#传入的是id,则sql语句生成是这样,order by id, 这就对了. 
 $方式一般用于传入数据库对象.例如传入表名.
#方式一般用于传入插入/更新的值或查询/删除的where条件 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值