ibatis2学习总结

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

你可能感兴趣的:(sql,log4j,bean,ibatis,SQL Server)