ibatis 总结

来源:互联网 发布:读图软件免费下载 编辑:程序博客网 时间:2024/05/20 00:13

 

ibatis的jdbctype和ENDDATE="#endDate:DATETIME#" 

        不用ibatis的自动识别,提高效率。

 

--------------sql-map.config.xml文件--------------根元素<sqlMapConfig>

        1,<properties>元素(唯一)

                如:<properties resource="config/database.properties" />

        2,<settings>元素

                maxRequests同时执行SQL语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。

                        缺省值:512

                maxSessions

                        同一时间内活动的最大session数。可以是代码请求的显式session,也可以是当线程使用SqlMapClient实例(即执行一条语句)自动获得的session。

                        减小这个参数值通常能减少内存使用。

                        缺省值:128

                maxTransactions

                        同时进入SqlMapClient.startTransaction()的最大线程数。

                        缺省值:32

                cacheModelsEnabled

                        全局性地启用或禁用SqlMapClient的所有缓存model。调试程序时使用。

                        缺省值:true(启用)

                lazyLoadingEnabled

                        全局性地启用或禁用SqlMapClient的所有延迟加载。调试程序时使用。

                        缺省值:true(启用)

                enhancementEnabled

                        是否针对POJO启用字节码增加机制以提升geter/seter的调用效用,为延迟加载带来了及大的性能提升。

                        缺省值:false(禁用)

                useStatementNamespaces

                        如果启用本属性,必须使用全限定名来引用mapped statement。

                        如,queryForObject("User.getUserById", id);"User"就是Namespaces

                        缺省值:false//个人喜欢设为true

        3,<typeAlias alias="user" type="persistence.model.User"/>元素

                //user.xml中也用typeAlias

                预定义的个别名:

                事务管理器别名

                        JDBC--com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig

                                让JDBC管理事务

                        JTA--com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig

                                器使用一个JTA全局事务,使SQL Map的事务包括在更大的事务范围内,

                                这个更大的事务范围可能包括了其他的数据库和事务资源。

                        EXTERNAL--com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig

 

                Data Source Factory别名

                        SIMPLE--com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory

                        DBCP--com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory

                        JNDI--com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

 

                例子:

                        <transactionManager type="JDBC">

                                <dataSource type="DBCP">

                                        <property value="${driver}" name="JDBC.Driver" />

                        </..>

 

        4,<transactionManager type="JDBC" >元素        

                <dataSource type="SIMPLE">//它基于iBatis的SimpleDataSource连接池实现。

                <dataSource type="DBCP">//使用Jakarta DBCP的DataSource API提供连接池

                </dataSource>

        </transactionManager>

                JndiDataSourceFactory在应用容器内部从JNDI Context中查找DataSource实现。

                当使用应用服务器,并且服务器提供了容器管理的连接池和相关DataSource实现的情况下,

                可以使用JndiDataSourceFactory。使用JDBC DataSource的标准方法是通过JNDI来查找。

                                应用服务器,以处理逻辑为主,

                                web服务器,以处理HTTP为主

                <transactionManager type="JDBC" >

                        <dataSource type="JNDI">

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

                        </dataSource>

                </transactionManager>

                以上配置使用了常用的JDBC事务管理。但对于容器管理的资源,您可能需要象下面的例子一样配置,让它能和全局事务一起工作:

                <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能够参与涉及其他数据库和事务资源的范围更大的事务。

        5,<sqlMap resource="sql/user.xml" />

 

----------------------SQL Map(映射)文件----------根元素<sqlMap>

#与$区别"#"好用。

        select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。 

        select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,

                那么Sql语句应该写成 select * from table where id = '$id$' 

resultMap,resultClass

 

关联可以有2种方式,:

1.    SELECT a.*,b.cname cateCName FROM param a,category b WHERE a.categoryid=b.id and a.id=#id#

        resultMap如何写?

2.        <resultMap id=...>

                <result property="addresses" column="id"  select="User.getAddressByUserId" />

 

 

<resultMap id="paramCateResult" class="param">

<select id="getParam" resultMap="paramCateResult" parameterClass="long">

<select id="calculateParamResultSet" resultClass="int" parameterClass="string">

parameterClass="java.util.HashMap","int","long"...

                map.put("name", "zhouxingchi");

                map.put("age", 49);

                list=(List) client.queryForList("getStudent2",map);

                <select id="getStudent2" parameterClass="java.util.HashMap" resultMap="get-student-result">

                        SELECT * FROM student WHERE sname=#name# AND sage=#age#;

                </select>

parameterMap

 

        <sqlMap id=”Product”>

                <cacheModel id=”productCache” type=”LRU”>

                        <flushInterval hours=”24”/>

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

                </cacheModel>

                <typeAlias alias=”product” type=”com.ibatis.example.Product” />

                <parameterMap id=”productParam” class=”product”>

                        <parameter property=”id”/>

                </parameterMap>

                <resultMap id=”productResult” class=”product”>

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

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

                        <result property="addList" column="id"  select="User.getAddressByUserId" />################

                        //关联查询,自动关联。延迟加载?

                </resultMap>

                <select id=”getProduct” parameterMap=”productParam” resultMap=”productResult” cacheModel=”product-cache”>

                        select * from PRODUCT where PRD_ID = ?

                </select>

        </sqlMap>

 

        <select>

                属性:id,parameterClass,resultClass,parameterMap,resultMap,cacheModel

                子元素:所有动态元素

                <select>

        <procedure>[prə'si:dʒə] 

                属性:id,parameterClass,resultClass,parameterMap,resultMap,xmlResultName

                子元素:所有动态元素

 

 

        <![CDATA[select...]]>//表示转义,因为xml不能解释"<",">"等        

 

        <selectKey>来支持自动生成的键值//Oracle预生成//selectKey是insert特有的

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

        Inline Parameter

 

        <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//返回 xml格式,person为根元素

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

        //4008111111

 

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

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

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

                //jdbcType指定DB字段的数据类型

                //一般:字段可以为NULL,或日期型,才需要jdbcType属性

                <parameter …… />

                <parameter …… />

        </parameterMap>

 

        <result property=”category” column=”PRD_CAT_ID” select=”getCategory”/>

        category是用户定义的类型,JDBC不知道如何给它赋值。

        select=”getCategory”使用PRD_CAT_ID字段的值去调用“getCategory”。

        得到一个Category对象并赋值给Product的category属性。

        //造成N+1 Select?

 

        联合查询

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

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

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

<result property=”category.id” column=”CAT_ID” />

<result property=”category.description” column=”CAT_DESCRIPTION” />

</resultMap>

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

select *

from PRODUCT, CATEGORY

where PRD_CAT_ID=CAT_ID

and PRD_ID = #value#

</

 

column是 SQL查询的resultset的列名或别名(级别高)

<result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>

 

 

<cacheModel id="product-cache" type ="LRU" readOnly=”true” serialize=”false”>

        //LRU近期最少使用,

        //readOnly=”true”只读缓存(默认);readOnly=“false”可读写缓存

        //type="LRC"|MEMORY|FIFO

        <flushInterval hours="24"/>

        <flushOnExecute statement="insertProduct"/>

        <flushOnExecute statement="updateProduct"/>

        <flushOnExecute statement="deleteProduct"/>

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

</cacheModel>

 

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

        select * from PRODUCT where PRD_CAT_ID = #value#

</statement>

 

dynamic MAP

<statement id="dynamicGetAccountList" resultMap="account-result" >

        select * from ACCOUNT

        <dynamic prepend="WHERE">

                <isNotNull prepend="AND" property="firstName">

                        (ACC_FIRST_NAME = #firstName#

                        <isNotNull prepend="OR" property="lastName">

                                ACC_LAST_NAME = #lastName#

                        </isNotNull>

                )

                </isNotNull>

                <isNotNull prepend="AND" property="emailAddress">

                        ACC_EMAIL like #emailAddress#

                </isNotNull>

                <isGreaterThan prepend="AND" property="id" compareValue="0">

                        ACC_ID = #id#

                </isGreaterThan>

        </dynamic>

        order by ACC_LAST_NAME

 

<dynamic>元素和条件元素都有“prepend”属性

二元条件元素<isGreaterThan prepend="AND" property="id" compareValue="0">

一元条件元素<isNotNull prepend="AND" property="emailAddress">

存在条件元素<isNotParameterPresent prepend=”AND”>

<iterate>元素

        <iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”>

                username=#userNameList[]#

        </iterate>