ibatis配置详解
ibatis与hibernate都是持久层的额技巧框架,这里看看ibatis的配置:作为自己以后的参考:
ibstis的配置重要由两种文件,
(一)有关项目标总体配置,如衔接的数据源,衔接池,缓存等的配置,也即sqlmapconfig.xml文件的配置。
(二)sqlmap.xml文件的配置,也即对象与表的操作映射的配置。
下面分两个部分进行记载
第一部分 sqlmapconfig.xml
在这个文件中总共的构造如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- 这里进行文件的注释阐明 -->
<properties resource=""> ------->在这里将项目(工程)的所有资源文件包括进来,将相对与src路径的资源文件的路径以及文件名包括进来
<settings cacheModelsEnabled="true" --->全局把持sqlMapClient的缓存
enhancementEnabled="true" --->全局把持运行时字节码加强,优化javabean的属性性能
lazyLoadingEnabled="true" --->延迟加载
errorTracingEnabled="true"
maxRequests="32" ---->同时履行sql语句的最大线程数,通常大小是maxTransactions的10倍,并且总是大于maxTransactions和maxSessions的总和。减小这个值能够进步性能。
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false" --->是否启动全局的sqlmap名字空间。假如启动则利用时,必需加上名字空间:queryForObject(sqlMap的名字空间.statementName)
/> --------->这个节点是设置工程的总体性能,依据名称来设置
<typeAlias alias="person" type="com.Jdnis.ibatis.model.Person" />
----->这个节点是将长的路径名等用短的进行替换,也就是用上面的person来代表右边的person类
<transactionManager type="JDBC"> -->type指定事务治理器:JDBC,JTA,EXTERNAL,三者的差别后面再讲到
<dataSource type="SIMPLE"> -->type值由:SIMPLE,DBCP,JNDI三者的应用后面再讲
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/person" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="root" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from sample" />
<property name="Pool.PingEnabled" value="false" />
<property name="Pool.PingConnectionsOlderThan" value="1" />
<property name="Pool.PingConnectionsNotUsedFor" value="1" />
</dataSource>
</transactionManager>
------->这个节点是来配置数据源,数据库衔接等等信息的。
<sqlMap resource="com/neusoft/ibatis/map/person.xml" />
-->将体系中的对象与数据库表的映射文件都包括进来上面采取的时相对路径,当然也可以用尽对路径:<sqlmap url="file:///C:/config/person.xml"
</sqlMapConfig>
第二部分:sqlmap.xml映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Person">
<!-- 注释阐明 -->
<cacheModel id="personCache" type="LRU">
<flushInterval hours="24"/>
<property name="size" value="1000"/>
</cacheModel>
<typeAlias alias="person" type="com.Jdnis.ibatis.model.Person" />
<parameterMap id="personParam" class="person">
<parameter property="id"/>
......
</parameterMap>
<resultMap id="personResult" class="person">
<result property="id" column="PER_ID"/>
......
</resultMap>
<statement id="insertPerson" parameterClass="person">
INSERT INTO persons VALUES(#id#,#firstName#,#lastName#,#birthDate#,#weight#,#height#)
</statement>
其他<statement>,<insert>,<update>,<select>,<delete>,<procedure>
</sqlMap>
注解:
<1>statement
属性:id(名称),parameterClass(输进参数的类型),resultClass(输出参数的类型),parameterMap(name of parameterMap),resultMap(name of reaultMap),cacheModel(name of cacheModel),其中只有一个必选属性:id
statement 的体时sql语句,当sql有特别字符时,将它放进CDATA块中如:<![CDATA[select * from person where PER_D>#id#]]>
<2>主动天生主键
通过<insert>子元素<selectKey>来支撑主动天生的键值,例如:
----对于oracle
<insert id="insertPerson-Oracl" parameterClass="person">
<selectKey resultClass="int" keyProperty="id">
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
</selectKey>
insert into
PERSON(PER_ID,PER_FIRST.....)
values(#id#,#firstName#....);
</insert>
--->对于sqlServer
<insert id="insertPerson-sqlServer" parameterClass="person">
insert into
PERSON(PER_FIRST.....)
values(#firstName#....);
<selectKey resultClass="int" keyProperty="id">
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
<3>存储进程
<parameterMap id="swapParameters" class="map">
<parameter property="email1" jdbcType="varchar" javaType="java.lang.String" model="INOUT"/>
<parameter property="email12" jdbcType="varchar" javaType="java.lang.String" model="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters">
{call swap_email_addres(?,?)}
</procedure>
<4>parameterClass 输进参数的类类型
<5>resultClass 输出参数的类类型
<6>parameterMap
用到预处置的PreparedStatement,将要进行预处置的数据,先放到parameterMap元素中,接着引用parameterMap元素:例如:
<parameterMap id="insert-person-param" class="person">
<parameter property="id"/>
<parameter property="firstName"/>
<parameter property="lastName"/>
<parameter property="birthDate"/>
<parameter property="weight">
<parameter property="height"/>
</parameterMap>
<statement id="insertPerson" parameterMap="insert-person-param">
insert into person values(?,?,?,?,?,?);
</statement>
<7>resultMap成果映射到预先定义的resultMap中
<resultMap id="get-person" resultClass="person">
<result property="id" column="PER_ID"/>
<result property="firstName" column="PER_FIRST_NAME"/>
......
</resultMap>
<statement id="getPerson" resuleMap="get-person">
select * from person
<statement>
<8>cacheModel定义查询缓存
<cacheModel id="person-cache" implementation="LRU">
<flushInterval hours="24">
<flushOnExecute statement="insertPerson"/>
<flushOnExecute statement="updatePerson"/>
<flushOnExecute statement="deletePerson"/>
......
<property name="size" value="1000"/>
</cacheModel>
<statement id="getPerson" parameterClass="int" cacheModel="person-cache">
<![CDATA[select * from person where PER_ID=#id#]]>
</statement>