ibatis学习记录

Ibatis学习笔记

1、SqlMAP

1.1、SqlMap概念

   SqlMap能大大减少访问关系数据库的代码。SqlMap使用简单的XML配置文件将JavaBean映射成Sql(映射成PreparedStatement的输入输出和ResultSet结果集)语句。与其他ORM框架(如:hibernate)笔记,特点简单易学。

1.2、SqlMap工作流程

 

1) 执行mapped statement。这是SQL Maps最重要的步骤。SQL Map框架将创建一个PreparedStatement实例,用参数对象为PreparedStatement实例设定参数,执行PreparedStatement并从ResultSet中创建结果对象。

2) 执行SQL的更新数据语句时,返回受影响的数据行数。执行查询语句时,将返回一个结果对象或对象的集合。和参数对象一样,结果对象可以是Java Bean,Map实现和基本数据类型的包装类。

 

 

 

1.3、SqlMap的setting元素

maxRequests

同时执行SQL语句的最大线程数。另外数据库一般是它的10倍。默认值为512.

maxSessions

同一时间内活动的最大session数。默认值为128.

它应该总是大于或等于maxTransactions并小于maxRequests

maxTransactions

进入sqlMapClient.startTransaction的最大现程值。默认值为:32

cacheModelEnabled

全局行地启用或禁止SqlMapClient的所有的缓存用。调试时用。默认True(启用)

lazyLoadingEnabled

全局性地启用火禁用SqlMapClient的所有延迟加载。默认值:True(启用)

enhancementEnabled

全局性地启用火禁用运行时字节码增强,以优化访问JavaBean属性的性能,同时优化延迟加载的性能。默认值:false(禁用)

useStatementNamespace

如果启用本属性,必须使用全限定名来引用mapped statement.Mapped  statement的全限定由sql-map的名称和mapped-statement的名称来合成。默认值:false

 

 

2.常用标签介绍

 typeAlias

  为较长的,全局限定类名指定一个较短的别名

transactionManager

  为SQL Map 配置事物管理服务。管理类型:JDBC、JTA和EXTERNAL。

Jdbc:通常常用connection commit()和rollback()方法,让事物管理

Jta:使用一个全局事物,使SQL Map的事务包括在更大的事务范围内。这个配置需包括一个UserTransaction属性。以便从JNDI获得一个UserTransaction.

External:这个配置可以让你自己管理事务。这意味着Sql Map的外部应用的一部分必须自己管理事务。

datasource

SimpleDataSourceFactory、DbcpDataSourceFactory、JndiDataSourceFactory。

SimpleDataSourceFacotry:适用于在没有J2EE容器提供DataSource的情况下。它基于ibatis的SimpleDatasource连接池实现。

DbcpDataSourceFactory:适用于Jakara DBCP的DataSource API提供的连接池。适用于WEB容器不提供DataSource的情况,或执行一个单独的应用。

JndiDataSourceFactory:在应用容器内部从JNDI Context中查找DataSource的实现。并且服务器提供了容器管理的连接池和相关DataSource 实现的情况。

 

2.0、Mapped Statement结构

<statement id=”statementName”

[parameterClass=”some.class.Name”]

[resultClass=”some.class.Name”]

[parameterMap=”nameOfParameterMap”]

[resultMap=”nameOfResultMap”]

[cacheModel=”nameOfCache”]

>

select * from PRODUCT where PRD_ID = [?|#propertyName#]

order by [$simpleDynamic$]

</statement>

 

2.1、DataSource配置.

(1)SimpleDataSourceFactory

<transactionManager type="JDBC">

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

 

DbcpDataSourceFactory

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

 

JndiDataSourceFactory

<transactionManager type="JDBC" >

<dataSource type="JNDI">

<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>

</dataSource>

</transactionManager>

 

JTA事务管理器

<transactionManager type="JTA" >

<property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>

<dataSource type="JNDI">

<property name="DataSource" value="java:comp/env/jdbc/jpetstore"/>

</dataSource>

</transactionManager>

备注:UserTransaction属性指向UserTransaction实例所在的JNDI位置。JTA事物管理常用它,以使SQL Map能够参与涉及其他数据库和事物资源的范围更大的事物。

 

<!CDATA[ SELECT * FROM PERSON WHERE AGE>#VALUE#]]>

 

2.2、自动生成主键

SQL Map通过<insert>的子元素<selectKey>来支持自动生成的键值。

它同时支持预生成(如Oracle)和后生成两种类型(如MS-SQL Server)

!—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>

 

 

2.3、存储过程

SQL Map通过<procedure>元素支持存储过程。

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

如果参数的Mode属性为INOUTOUT,则参数对象的值被修改。否则保持不变。

 

2.4参数传递

parameterClass

值:为Java类的全限定名。它的目的是限制输入参数的类型为指定的Java类。并优化框架的性能。

<statement id=”statementName” parameterClass=” examples.domain.Product”>

insert into PRODUCT values (#id#, #description#, #price#)

</statement>

如果不指定parameterClass参数,任何带有合适属性(get/set方法)的Java Bean都可以作为输入参数。

parameterMap

值:预先定义的<parameterMap>元素的名称。定义一系列有序的参数系列。用于匹配JDBC PreparedStatement的值符号。

<parameterMap id=”insert-product-param” class=”com.domain.Product”>

<parameter property=”id”/>

<parameter property=”description”/>

</parameterMap>

<statement id=”insertProduct” parameterMap=”insert-product-param”>

insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);

</statement>

Inline Parameter

可以嵌套在mapped statement内部使用。

<statement id=”insertProduct” >

insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)

values (#id#, #description#);

</statement>

resultClass

<statement id="getPerson" parameterClass=”int” resultClass="examples.domain.Person">

SELECT PER_ID as id,

PER_FIRST_NAME as firstName,

PER_LAST_NAME as lastName,

PER_BIRTH_DATE as birthDate,

PER_WEIGHT_KG as weightInKilograms,

PER_HEIGHT_M as heightInMeters

FROM PERSON

WHERE PER_ID = #value#

</statement>

每一个属性对应SQL查询语句一个列的别名(使用“as”关键字-标准的SQL语法)。一般情况下,列名和属性名称不匹配,就需要使用“as”关键

resultMap

<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>

<result property=”id” column=”PRD_ID”/>

<result property=”description” column=”PRD_DESCRIPTION”/>

</resultMap>

<statement id=”getProduct” resultMap=”get-product-result”>

select * from PRODUCT

</statement>

使用resultMap可以控制数据如何从结果集中取出,以及哪一个属性匹配哪一个字段

cacheModel

cacheModel的属性值等于指定的cacheModel元素的name属性值。属性cacheModel定义查询mapped statement的缓存。每一个查询mapped statement可以使用不同或相同的cacheModel。

<cacheModel id="product-cache" imlementation="LRU">

<flushInterval hours="24"/>

<flushOnExecute statement="insertProduct"/>

<flushOnExecute statement="updateProduct"/>

<flushOnExecute statement="deleteProduct"/>

<property name=”size” value=”1000” />

</cacheModel>

<statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”>

select * from PRODUCT where PRD_CAT_ID = #value#

</statement>

xmlResultName

xmlResultName

当直接把查询结果映射成XML document时,属性xmlResultName的值等于XML document根元素的名称。

<select id="getPerson" parameterClass=”int” resultClass="xml" xmlResultName=”person”>

SELECT PER_ID as id,

PER_FIRST_NAME as firstName,

PER_LAST_NAME as lastName,

PER_BIRTH_DATE as birthDate,

PER_WEIGHT_KG as weightInKilograms,

PER_HEIGHT_M as heightInMeters

FROM PERSON

WHERE PER_ID = #value#

</select>

上面的查询结果将产生一个XML document,结构如下:

<person>

<id>1</id>

<firstName>Clinton</firstName>

<lastName>Begin</lastName>

<birthDate>1900-01-01</birthDate>

<weightInKilograms>89</weightInKilograms>

<heightInMeters>1.77</heightInMeters>

</person>

 

2.5 Parameter Map

<parameterMap id=”parameterMapName” [class=”com.domain.Product”]>

<parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”]

[nullValue=”NUMERIC”] [null=”-9999999”]/>

<parameter …… />

<parameter …… />

</parameterMap>

括号[]是可选的属性。parameterMap元素只要求属性id作为唯一标识。属性class是可选的但强烈推荐使用。和parameterClass类似,class属性可以框架检查输入参数的类型并优化性能。

一个parameterMap可包含任意多的parameter元素

2.6 InlineMap

<statement id=”insertProduct” parameterClass=”com.domain.Product”>

insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)

values (#id:NUMERIC#, #description:VARCHAR#);

</statement>

注意!在内嵌参数中,要指定NULL的替代值,必须要先指定数据类型。

注意!如需要在查询时也使用NULL替代值,必须同时在resultMap中定义(如下说明)。

注意!如果您需要指定很多的数据类型和NULL替代值,可以使用外部的parameterMap元素,这样会使代码更清晰

posted @ 2013-10-24 17:38  IT一族  阅读(221)  评论(0编辑  收藏  举报