ibatis经验(Java版)

来源:互联网 发布:json 查找节点 编辑:程序博客网 时间:2024/05/16 01:36

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

flushonexecutestatement=”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>2sex>

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>


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/