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属性为INOUT或OUT,则参数对象的值被修改。否则保持不变。 |
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元素,这样会使代码更清晰 |