ibatis 属性详细分析--ibatis <dynamic

ibatis 属性详细分析

分类: iBatis   146人阅读  评论(0)  收藏  举报

insert 返回的为插入的主键值,但必须在配置文件中加入<selectKey/>

   如果主键值为String

    <selectKey resultClass="String" keyProperty="resourceId" >

       <![CDATA[

             select resource_id as resourceId  from rentout where resource_id=#resourceId#

       ]]>

     </selectKey>

   如果主键值为Int型

      <selectKey resultClass="Integer" keyProperty="id" >

       <![CDATA[

           Select last_insert_id();

       ]]>

     </selectKey>


Update,和Delete返回为修改数据影响的条数;

SQL注入
  a.在关键字传入前加‘%’; 例:String  keyword=”%”+keyword+”%”;

b、过滤关键字中的非法字符

公共SQL提取的运用
  在<sql></sql> 中包含需要复用的SQL语句,在需要的地方<include  refid=””/> 引入即可

ResultClass和ResultMap的区别
  resultClass:可以把结果自动映射到相应的JAVA类中,但无法指定输出字段的类型,会对性能产生轻微的影响。

  resultMap:可以预先定义resultMap元素,可以控制数据如何从结果集中取出,以及哪个属性匹配哪个字段,

 
parameterClass和parameterMap的区别
parameterClass属性值是JAVA类的全限定名,目的是限制输入参数的类型为指定的JAVA类,如果不指定,任何带有合适属性(get/set方法)的JAVA BEAN都可以作为输入参数

parameterMap:预先定义parameterMap的属性值,用于有次序的参数匹配JDBC符号

“#”和“$”的区别
  “#” 为占为符

  “$”为直接替换,但为出现SQL引入问题和性能上的影响,like,limit和表名的引入必须使用“$”

分页功能的实现
 a. 用ibatis自带的分页功能,但是自带分页是把所有数据读入内存再分页的,所以必须自己覆写LimitSqlExecutor方法,

 b. 直接使用limit实现

 where 条件的组装
  <isEqual>         比较属性值和静态值或另一个属性值是否相等

  <idNotEqual>      比较属性值和静态值或另一个属性值是否不相等

  <isGreaterThan>    比较属性值是否大于静态值或另一个属性值

  <isGreaterEqual>   比较属性值是否大于等于静态值或另一个属性值

  <isLessThan>      比较属性值是否小于静态值或另一个属性值

  <isLessEqual>     比较属性值是否小于等于静态值或另一个属性值

  <isNull>          检查属性是否为NULL

  <isNotNull>       检查属性是否不为NULL

  <isEmpty>        检查属性是否为NULL或空

  <isNotEmpty>     检查属性是否不为NULL或不为空

  <isPropertyAvailable>       检查是否存在该属性

  <isNotPropertyAvailable>    检查是否不存在该属性

<![CDATA[  ]]>的含义
用了特殊字符的SQL语句不能直接使用。必须用<![CDATA[ ]]>

 

ibatis自带缓存的运用
<cacheModel  id=”person-cache” implementation=”LRU”>

   <flushInterval  hours=”24”/>       //可以用hours/minutes/second

   <flushOnExecute   statement=”selectperson”/>    //需要缓存的方法,可以为多个

   <property  name=”size”  value=”1000”/>

</cacheModel>

 

缓存策略:

   LRU:最近最少使用

   MEMORY:适用于没有统一的对象重用模式,property的属性值必须是STRONG,

      SOFT,WEAK,这三个值分别对应于JVM不同内存reference类型。

      WEAK,大多数情况下,WEAK是最佳选择,缺省值就是WEAK,它能大大提高常用查询的性能,对于当前不被使用的查询数据,将被清除

      SOFT,在查询结果对象不被使用,可以减少内存不足的可能性

      STRONG,对查询的结果一直保留在内存中,可以使用在数据量很少或者静态数据的时

   FIFO:先进先出

   OSCACHE:配置oscache.properties

value的使用
  假如没有必要写JAVA BEAN作为参数,可以直接使用基本类型,也可以直接传入参数值。如果是直接传入参数值就配置文件中必须写 #value#做为参数传入

iterate在ibatis里的运用
<iterate  perpend=”AND” property=”stringList”  open=”(”   close=”)”  conjunction=”OR”>

   <![CDATA[

       Username=#stringList[]#

]]>

</iterate>

 

List参数名后面一定要加“[]”,防止解析器简单的把List解析成String

 

结果:username=(1 or 2 or 3)

事务的处理
startTransacton();

commitTransaction();

rollbackTransaction();

批处理
如果有很多非查询的(insert/update/delete)语句要处理,为了减少网络通讯的流量,可以进行批处理

sqlMap.startBatch();

sqlMap.endBatch();

xmlResultName的运用 详细输出结果
 直接把查存出来的结果映射成XML document

 <select  id=”getPerson” parameterClass=”int”  resultClass=”xml” xmlResultName=”person”>

   Select id as id,name as name from  person  where id=#value#;

</select>

结果:返回的为XML格式的字符串(String)

 <xmlversion="1.0"encoding="UTF-8"/>

< person>

<id>2</id>

<name>2222</name>

</person>

xmlResultName属性值为根目录名

-------------------------

Ibatis Dynamic

  (2011-02-18 18:27:04)
  分类: 语言编程

动态标签分类:1<dynamic>,2 二元标签,3 一元标签,4 <iterate>
这四种标签以及他们的子标签具有共同的属性prepend,open,close
1 <dynamic> 

Xml代码
<statement id="dynamicGetAccountList" resultMap="account-result"> 
        select * from ACCOUNT  
        <dynamic prepend="WHERE"> 
            <isNotNull prepend="AND" property="firstName"> 
              
<!--             生成的语句不会有多余and,因为dynamic有一个隐含的属性,  
removeFirstPrepend="true",所有一般都要写上perpend="and",需要的时候他会自动去掉--> 
                (ACC_FIRST_NAME = #firstName#  
                <isNotNull prepend="OR" property="lastName"> 
                    ACC_LAST_NAME = #lastName#  
                </isNotNull> 
                )  
            </isNotNull> 
            <isNotNull prepend="AND" property="emailAddress"> 
                ACC_EMAIL like #emailAddress#  
            </isNotNull> 
            <!-- <isNotEmpty property="firstName" prepend="and" open="(" close=")" > firstName=#firstName# </isNotEmpty> --> 
            <isGreaterThan prepend="AND" property="id" 
                compareValue="0"> 
<!--             //如果参数id的值大于给定的比较值(0),那么加上下面的语句(and acc_id=#id#) ACC_ID--> 
                = #id#  
            </isGreaterThan> 
        </dynamic> 
        order by ACC_LAST_NAME  
    </statement> 

<statement id="dynamicGetAccountList" resultMap="account-result">
select * from ACCOUNT
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="firstName">

<!-- 生成的语句不会有多余and,因为dynamic有一个隐含的属性,
removeFirstPrepend="true",所有一般都要写上perpend="and",需要的时候他会自动去掉-->
(ACC_FIRST_NAME = #firstName#
<isNotNull prepend="OR" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
)
</isNotNull>
<isNotNull prepend="AND" property="emailAddress">
ACC_EMAIL like #emailAddress#
</isNotNull>
<!-- <isNotEmpty property="firstName" prepend="and" open="(" close=")" > firstName=#firstName# </isNotEmpty> -->
<isGreaterThan prepend="AND" property="id"
compareValue="0">
<!-- //如果参数id的值大于给定的比较值(0),那么加上下面的语句(and acc_id=#id#) ACC_ID-->
= #id#
</isGreaterThan>
</dynamic>
order by ACC_LAST_NAME
</statement>

2、一元条件元素的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
    property - 被比较的属性(必选)

<isPropertyAvailable>  检查是否存在该属性(存在parameter bean的属性)。   
<isNotPropertyAvailable>  检查是否不存在该属性(不存在parameter bean的属性)。   
<isNull>  检查属性是否为null。   
<isNotNull>  检查属性是否不为null。   
<isEmpty>  检查Collection.size()的值,属性的String或String.valueOf()值,是否为null或空(“”或size() < 1)。   
<isNotEmpty>  检查Collection.size()的值,属性的String或String.valueOf()值,是否不为null或不为空(“”或size() > 0)。
例子:
<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>  

3、二元条件元素的属性: 二元是两个对象进行比较
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
    compareValue - 用于比较的值(必选或选择compareProperty)

<isEqual>  比较属性值和静态值或另一个属性值是否相等。   
<isNotEqual>  比较属性值和静态值或另一个属性值是否不相等。    
<isGreaterThan>  比较属性值是否大于静态值或另一个属性值。   
<isGreaterEqual>  比较属性值是否大于等于静态值或另一个属性值。   
<isLessThan>  比较属性值是否小于静态值或另一个属性值。    
<isLessEqual>  比较属性值是否小于等于静态值或另一个属性值。
例子:
<isLessEqual prepend=”AND” property=”age” compareValue=”18”>
ADOLESCENT = ‘TRUE’
</isLessEqual>  

4、<iterate>:这属性遍历整个集合,并为List集合中的元素重复元素体的内容。
Iterate的属性:
prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
    conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)

<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”> username=#userNameList[]# </iterate> = and(username=name1 or username=name2...)

 

注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,以防解析器简单地将List输出成String。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值