ibatis总结

1 .insert,update,delete 返回值
(
1 ).insert 返回的为插入的主键值,但必须在配置文件中加入 < selectKey />
   如果主键值为String
< selectKey resultClass = " string "  keyProperty = " id " >
   SELECT @@IDENTITY AS ID
</ selectKey >

   如果主键值为Int型
< selectKey resultClass = " java.lang.Integer "  keyProperty = " id "   >
   SELECT @@IDENTITY AS ID
</ selectKey >  
或者
< selectKey resultClass = " int "  keyProperty = " id " >
   SELECT @@IDENTITY AS ID
</ selectKey >
注:@@IDENTITY只是SQL Server的写法,其他数据库也有相关的属性。

(
2 ).Update,和Delete返回为修改数据影响的条数;
2 .SQL模糊查询的两种方法
(
1 ).如果是模糊查询,在关键字传入前加‘%’; 例:String keyword = % + keyword + % ”;
(
2 ).配置文件的写法: select name,sex from t_user  where  name like  ' %$name$% '  
3 .在ibatis的bean.xml配置文件中,日期的转换
<! [CDATA[
select count( 
1  ) from dbu_window  where    
(     
( DATE_FORMAT( 
' $dateStartTemp$ ' ' %Y-%m-%d '  )  >=  f_start_date and
    DATE_FORMAT( 
' $dateStartTemp$ ' ' %Y-%m-%d '  )  <=  f_end_date )
or     
( DATE_FORMAT( 
' $dateEndTemp$ ' ' %Y-%m-%d '  )  >=  f_start_date and 
    DATE_FORMAT( 
' $dateEndTemp$ ' ' %Y-%m-%d '  )  <=  f_end_date ) )
]]
>
4 .$sql$即程序预定义sql语句的应用
java代码:String selSql 
=   " select count(*) from `bbs_config`; " ;
     sqlMapClient.queryForObject( 
" execSelSqlStr "  , selSql );
bean.xml文件:
< select id = " execSelSqlStr "  resultClass = " int "  parameterClass = " string " >
   
<! [CDATA[   $sql$   ]] >
</ select >
5 .ResultClass和ResultMap的区别
resultClass:可以把结果自动映射到相应的JAVA类中,但无法指定输出字段的类型,会对性能产生轻微的影响。
resultMap:可以预先定义resultMap元素,可以控制数据如何从结果集中取出,以及哪个属性匹配哪个字段,

parameterClass和parameterMap的区别
parameterClass属性值是JAVA类的全限定名,目的是限制输入参数的类型为指定的JAVA类,如果不指定,任何带有合适属性(
get / set方法)的JAVA BEAN都可以作为输入参数
parameterMap:预先定义parameterMap的属性值,用于有次序的参数匹配JDBC符号
6 .“#”和“$”的区别
“#” 为占为符,#在是用prepareStatement的
? 插入参数,$是文本替换
“$”为直接替换,但为出现SQL引入问题和性能上的影响,like,limit和表名的引入必须使用“$”
7 . where  条件的组装
< isEqual >          比较属性值和静态值或另一个属性值是否相等
< idNotEqual >       比较属性值和静态值或另一个属性值是否不相等
< isGreaterThan >     比较属性值是否大于静态值或另一个属性值
< isGreaterEqual >    比较属性值是否大于等于静态值或另一个属性值
< isLessThan >       比较属性值是否小于静态值或另一个属性值
< isLessEqual >      比较属性值是否小于等于静态值或另一个属性值
< isNull >           检查属性是否为NULL
< isNotNull >        检查属性是否不为NULL
< isEmpty >         检查属性是否为NULL或空
< isNotEmpty >      检查属性是否不为NULL或不为空
< isPropertyAvailable >        检查是否存在该属性
< isNotPropertyAvailable >     检查是否不存在该属性
8 . <! [CDATA[ ]] > 的含义
用了特殊字符的SQL语句(比如
> < )不能直接使用。必须用 <! [CDATA[ ]] >
9 .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
10 .value的使用
假如没有必要写JAVA BEAN作为参数,可以直接使用基本类型,也可以直接传入参数值。如果是直接传入参数值就配置文件中必须写 #value#做为参数传入
11 .事务的处理
startTransacton();
commitTransaction();
rollbackTransaction();

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

12 .iterate在ibatis里的运用,List参数名后面一定要加“[]”,防止解析器简单的把List解析成String
< select id = " getUserInfoByName "  resultMap = " userResult "  parameterClass = " java.util.List " >
select 
*  from tuserinfo  where  f_user_code  in
    
< iterate open = " ( "  close = " ) "  conjunction = " , "   >
<! [CDATA[
           #value[]# 
        ]]
>
   
</ iterate >
</ select >

13 .xmlResultName的运用 详细输出结果,直接把查存出来的结果映射成XML document
   
< select id = " getUser "  parameterClass = " user "  resultClass = " xml "  xmlResultName = " person " >
    
<! [CDATA[ 
        select name,sex from t_user 
where  id  =  #id# 
     ]]
>
   
</ select >

String xml
=  (String)sqlMapClient.queryForObject( " getUser " ,user );
System.
out .println(xml);

<? xml version = " 1.0 "  encoding = " UTF-8 " ?>
   
< person >
      
< name > we are good  !</ name >
      
< sex > 2 </ sex >
   
</ person >
14 .分页功能的实现
1 ). 用ibatis自带的分页功能,但是自带分页是把所有数据读入内存再分页的,所以必须自己覆写LimitSqlExecutor方法,
2 ). 直接使用limit实现
15 .ibatis的IDE:http: // ibatis.apache.org/ibator.html
16 .容易出错的地方 :
1 ) 在parameterMap和resultMap中,字段数据类型是java.sql.Types类定义的常量名称。常用的数据类型包括BLOB,CHAR,CLOB,DATE,LONGVARBINARY, INTEGER,NULL,NUMERIC,TIME,TIMESTAMP和VARCHAR等。 
2 ) 对于数据表中NULLBALE的字段,必须在parameterMap和resultMap中指定字段的数据类型。 
3 ) 对于数据类型是DATE,CLOB或BLOB的字段,最好在parameterMap和resultMap中指定数据类型。 
4 ) 对于二进制类型的数据,可以将LONGVARBINARY映射成byte[]。 
5 ) 对于文本类型较大的数据,可以将CLOB映射成String。 
6 ) Java Bean必须拥有缺省的构造器(即无参数的构造器)。 
7 ) Java Bean最好实现Serializable接口,以备应用的进一步扩展。

17 .曾经写了一个ibatis动态查询的例子:
排序代码如下:
< dynamic prepend = "  order by " >
< isNotNull property = " sortName " >
   
< isNotEqual property = " sortName "  compareValue = "" >
    
<! [CDATA[#sortName# ]] >
   
</ isNotEqual >
</ isNotNull >
< isNotNull property = " sortSequence " >
   
< isNotEqual property = " sortSequence "  compareValue = "" >
    
<! [CDATA[ #sortSequence# ]] >
   
</ isNotEqual >
</ isNotNull >
</ dynamic >
竟然无法排序,后来查了下资料,把“#”改成了“$”就可以了。
现总结下经验:#xxx# xxx代表是属性值,map里面的key或者是你的pojo对象里面的属性,ibatis会自动在它的外面加上引号,表现在sql语句是这样的 
where  xxx  =   ' xxx '  ;而$xxxx$ 则是把xxxx作为字符串拼接到你的sql语句中,比如 order by topicId , 如果你不用$来拼接而用#的话,外面就会被加上引号,比如你的语句这样写 ... order by #xxx# (xxx就是你传进来的字符串topicId),ibatis 就会把他翻译成 order by  ' topicId '  这样就报错了,用$的结果就是这样 order by topicId。

18 .ibatis通用sql语句可以单独定义如:
< sql id = " whereTemplate " >
< dynamic prepend = " where " >
   
< isNotNull prepend = " and "  property = " id " >
    
<! [CDATA[ id  =  #id# ]] >
   
</ isNotNull >
</ dynamic >
</ sql >

< select id = " coreGetCountAll "  resultClass = " java.lang.Integer "  parameterClass = " coreNote " >
<! [CDATA[ SELECT COUNT(  1  ) FROM note ]] >
< include refid = " whereNoteTemplate "   />
</ select >

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值