ibatis 注意点

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

iBATIS三种自动生成主键的方式

  

<!-- Oracle SEQUENCE Example using .NET 1.1 System.Data.OracleClient -->    
< insert   id = "insertProduct-ORACLE"   parameterClass = "product" >    
    < selectKey   resultClass = "int"   type = "pre" keyProperty = "id" >    
        SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL   
    </ selectKey >    
    insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#)   
</ insert >    
   
<!-- Microsoft SQL Server IDENTITY Column Example -->    
< insert   id = "insertProduct-MS-SQL"   parameterClass = "product" >    
    insert into PRODUCT (PRD_DESCRIPTION)   
    values (#description#)   
    < selectKey   resultClass = "int"   type = "post" keyProperty = "id" >    
        select @@IDENTITY as value   
    </ selectKey >    
</ insert >    
   
<!-- MySQL Example -->    
< insert   id = "insertProduct-MYSQL"   parameterClass = "product" >    
    insert into PRODUCT (PRD_DESCRIPTION)   
    values (#description#)   
    < selectKey   resultClass = "int"   type = "post" keyProperty = "id"   >    
        select LAST_INSERT_ID() as value   
    </ selectKey >    
</ insert > 

 
    如果主键值为 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 )语句要处理,为了减少网络通讯的流量,可以进行批处理

sqlMapClientTemplate.execute(new SqlMapClientCallback() {
      public Object doInSqlMapClient(SqlMapExecutor executor)throws SQLException {
          executor.startBatch();
           for(PrjPiValues prjPiValue : prjPiValues){
                sqlMapClientTemplate.insert("PrjPiValues.insertPrjPiValues", prjPiValue);
           }
            executor.executeBatch();
            return null;
        }
});


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)