iBATIS学习总结

iBATIS学习总结

=========================== SqlMapConfig ===========================

1、classpath依赖项目

下载最新 ibatis-x.x.x.xxx.zip 文件,获取最新的 ibatis-2.3.4.726.jar,
并根据其中 jar-dependencies 文件的描述下载 iBATIS 依赖的 jar 包,把以上
jar 包添加到项目 classpath 中。

2、SQL Map 配置文件

2.1、SQL Map 配置文件拥有唯一的<properties>元素

<properties resource="com/newbee/SqlMapConfig.properties" />

2.2、/sqlMapConfig/settings 全局参数

cacheModelsEnabled="true" # 全局性地启用或禁用SqlMapClient的所有缓存model
enhancementEnabled="true" # 全局性地启用或禁用运行时字节码增强,以优化访问Java Bean属性的性能
lazyLoadingEnabled="true" # 全局性地启用或禁用SqlMapClient的所有延迟加载
maxRequests="32" # 同时执行SQL语句的最大线程数
maxSessions="10" # 同一时间内活动的最大session数
maxTransactions="5" # 同时进入SqlMapClient.startTransaction()的最大线程数
useStatementNamespaces="false" # 使用全限定名来引用mapped statement

2.3、dataSource 类型

2.3.1、SIMPLE 类型

<transactionManager type="JDBC" commitRequired="false"> # commitRequired 查询语句select是否需要提交
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="org.postgresql.Driver"/>
<property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/>
<property name="JDBC.Username" value="user"/>
<property name="JDBC.Password" value="password"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="10000"/>
<property name="Pool.PingQuery" value="select * from dual"/>
<property name="Pool.PingEnabled" value="false"/>
<property name="Pool.PingConnectionsOlderThan" value="0"/>
<property name="Pool.PingConnectionsNotUsedFor" value="0"/>
</dataSource>
</transactionManager>

2.3.2、DBCP 类型(CS应用推荐)

<transactionManager type="JDBC">
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${username}"/>
<property name="JDBC.Password" value="${password}"/>
<!-- OPTIONAL PROPERTIES BELOW -->
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumWait" value="60000"/>
<!-- Use of the validation query can be problematic.
If you have difficulty, try without it. -->
<property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
<property name="Pool.LogAbandoned" value="false"/>
<property name="Pool.RemoveAbandoned" value="false"/>
<property name="Pool.RemoveAbandonedTimeout" value="50000"/>
</datasource>
</transactionManager>

2.3.3、JNDI 类型(服务器推荐)

<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="DataSource" value="java:comp/env/jdbc/newbee"/>
</dataSource>
</transactionManager>

3、/sqlMapConfig/sqlMap Map文件引用参数

<sqlMap resource="com/newbee/domain/Account.xml" />

=========================== SqlMap ===========================

1、namespace 命名空间,避免属性名称冲突

<sqlMap namespace="Account">

2、<typeAlias>元素让您为一个通常较长的、全限定类名指定一个较短的别名

<typeAlias alias="Account" type="com.newbee.domain.Account"/> # 这里定义

<resultMap id="AccountResult" class="Account"> # 这里使用
<result property="id" column="ACC_ID"/>
<result property="firstName" column="ACC_FIRST_NAME"/>
<result property="lastName" column="ACC_LAST_NAME"/>
<result property="emailAddress" column="ACC_EMAIL"/>
</resultMap>

3、<statement>元素是个通用声明,可以用于任何类型的SQL语句,甚至包含多个语句(用;分隔)。通常,使用下面具体的statement类型是个好主意。

<insert>
<update>
<delete>
<select>
<procedure>

4、特殊SQL字符:因为SQL语句是嵌在XML文档中的,因此有些特殊的字符不能直接使用,例如大于号和小于号(<>)。
只需将包含特殊字符的SQL语句放在XML的CDATA区里面就可以了

<statement id="getPersonsByAge" parameterClass="int" resultClass="examples.domain.Person">
<![CDATA[SELECT *
FROM PERSON
WHERE AGE > #value#
]]>
</statement>

3、自动生成主键:很多数据库支持自动生成主键的数据类型。不过这通常(并不总是)是个私有的特性。
SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。它同时支持预生成(如Oracle)
和后生成两种类型(如MS-SQL Server)。这个值就是SQL Map执行 insert() 方法的返回值。

<!—Oracle SEQUENCE Example -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID 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="com.domain.Product">
insert into PRODUCT (PRD_DESCRIPTION)
values (#description#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>

4、SQL Map通过<procedure>元素支持存储过程。如果参数的mode属性设为INOUT或OUT,则参数对象的值被修改,IN参数对象
的值不会被修改。

<parameterMap id="swapParameters" class="map" >
<parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
{call swap_email_address (?, ?)}
</procedure>

5、SQL 输入参数(是对单一参数的描述)

5.1、定义Java Bean作为输入参数(parameterClass、parameterMap 和 Inline Parameter 混合使用)

简化版:

<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id#, #description#);
</statement>

精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,不支持Blob字段类型)

<statement id="insertProduct" parameterClass="com.domain.Product">
insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>

5.2、基本类型输入参数

假如没必要写一个Java Bean作为参数,可以直接使用基本类型的包装类(即String,Integer,Date等)作为参数。

<statement id="insertProduct" parameter="java.lang.Integer">
select * from PRODUCT where PRD_ID = #value#
</statement>

5.3、Map类型输入参数

假如没必要写一个Java Bean作为参数,而要传入的参数又不只一个时,可以使用Map类(如HashMap,TreeMap等)作为参数对象。

<statement id="insertProduct" parameterClass="java.util.Map">
select * from PRODUCT
where PRD_CAT_ID = #catId#
and PRD_CODE = #code#
</statement>

6、SQL 返回值 (是对单一返回值的描述)

6.1、定义Java Bean作为返回值

简化版:

<statement id="getProduct" resultClass="com.ibatis.example.Product">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>

精确版:(date类型对应的字段要指定字段类型,可以为空字段要指定字段类型和空值判断,已经支持Blob字段类型)

<resultMap id="get-product-result" class="com.ibatis.example.Product">
<result property="id" column="PRD_ID"/>
<result property="description" column="PRD_DESCRIPTION" jdbcType="VARCHAR" nullValue="NO_ENTRY"/>
</resultMap>

<statement id="getProduct" resultMap="get-product-result">
select
PRD_ID as id, # id 字段属性
PRD_DESCRIPTION as description # description 字段属性
from PRODUCT
where PRD_ID = #value#
</statement>

6.2、基本类型返回值

<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(*) as value
from PRODUCT
</statement>

6.3、Map类型返回值

<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>

7、缓存Mapped Statement结果集(只在select中使用)

7.1、定义缓存模式

<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>
<flushInterval hours="24"/> # 24小时自动刷新一次,也有其他单位
<flushOnExecute statement="insertProduct"/> # 指定在执行了哪个statement后要刷新一次
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name=”cache-size” value=”1000” /> # 缓存的大小
</cacheModel>

7.2、使用缓存模式

<statement id=”getProductList” cacheModel=”product-cache”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>

8、动态Mapped Statement

8.1、二元动态条件

<isEqual> 比较属性值和静态值或另一个属性值是否相等。
<isNotEqual> 比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan> 比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual> 比较属性值是否大于等于静态值或另一个属性值。
<isLessThan> 比较属性值是否小于静态值或另一个属性值。
<isLessEqual> 比较属性值是否小于等于静态值或另一个属性值。

可用属性:

prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)
compareProperty - 另一个用于和前者比较的属性(必选或选择compareValue)
compareValue - 用于比较的值(必选或选择compareProperty)

例子:

<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0"> # 二元条件,and 会被 where 覆盖
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>

8.2、一元动态条件

<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)。

可用属性:

prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 被比较的属性(必选)

8.3、其他动态条件

8.3.1、Parameter Present:这些元素检查参数对象是否存在

<isParameterPresent>
检查是否存在参数对象(不为null)。
<isNotParameterPresent>
检查是否不存在参数对象(参数对象为null)。

可用属性:

prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)

例子:

<isNotParameterPresent prepend=”AND”>
EMPLOYEE_TYPE = ‘DEFAULT’
</isNotParameterPresent>

8.3.2、Iterate:这属性遍历整个List集合,并为集合中的每个元素重复内容。

<iterate> 遍历类型为java.util.List的元素。

可用属性:

prepend - 可被覆盖的SQL语句组成部分,添加在语句的前面(可选)
property - 类型为java.util.List的用于遍历的元素(必选)
open - 整个遍历内容体开始的字符串,用于定义括号(可选)
close -整个遍历内容体结束的字符串,用于定义括号(可选)
conjunction - 每次遍历内容之间的字符串,用于定义AND或OR(可选)

例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]# -- []不要丢掉了
</iterate>

8.3.3、动态SQL元素

帮助实现动态的order by子句,动态的查询字段或SQL语句的其他动态部分。
它从根本上改变了SQL语句本身,比仅仅简单地改变参数值严重得多。
它使用$而不是#包括动态变量。

<statement id=”getProduct” resultMap=”get-product-result”>
select * from PRODUCT order by $preferredOrder$
</statement>

9、批处理SQL

sqlMap.startBatch();
// execute statements in between
sqlMap.executeBatch();

10、事务相关

10.1、默认每执行一个SQL就会自动提交并管理事务

10.2、如果使用了以下的代码,就要自己管理事务了

try {
sqlMap.startTransaction ();
// insert,update,delete statements
sqlMap.commitTransaction ();
} finally {
sqlMap.endTransaction ();
}

11、配置log4j显示执行的SQL

11.1、拷贝 log4j.jar 到项目类路径中
11.2、配置 log4j.properties 文件全部内容如下(放在源代码文件夹根目录下)

#--------------------------------
# LEVEL = FATAL ERROR WARN INFO DEBUG

log4j.rootLogger=DEBUG, stdout, fileout # BEBUG 改为其他级别则不再显示SQL

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.fileout=org.apache.log4j.RollingFileAppender
log4j.appender.fileout.File=/home/guo/ibatis.log
log4j.appender.fileout.MaxFileSize=10000KB

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} :%m%n
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n

 

转载至:http://blog.sina.com.cn/s/blog_3c62c21f01012l1f.html

posted @ 2016-06-15 10:00  飞翔.  阅读(157)  评论(0编辑  收藏  举报