`
zhoou
  • 浏览: 2504 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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  

分享到:
评论

相关推荐

    ibatis学习总结,oracle , 敏捷开发,

    ibatis学习总结,oracle 学习总结,大数据量处理

    ibatis学习总结文档

    ibatis学习总结文档,帮助快速入门.

    Spring +ibatis学习总结

    Spring +ibatis学习总结这个框架挺好用的 大家可以试试

    ibatis学习总结

    相对于Hibernate和Apache OJB等“一站式”ORM解决方案而言,IBatis是一种“半...它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的scheme(怎么翻complex scheme?),使用SQL Maps, 你可以自由的使用SQL语句。

    iBatis学习总结

    ibatis的Jar包 博文链接:https://yangjinhappy.iteye.com/blog/165239

    ibatis2.rar

    iBATIS学习总结

    ibatis总结 ibatis ibatis ibatis ibatis

    ibatis学习 ibatis总结 ibatis ibatis ibatis

    iBATIS2.0学习总结

    在做一个mis系统的时候,公司用到了iBATIS来作为持久化的框架,并结合spring2.5的mvc来完成,项目现在已经完成,把iBATIS做了一下总结。

    ibatis入门学习总结

    ibatis操作数据库入门教程,通过本文档的学习,可以实现对ibatis的增删改查操作,个人学习总结,不当之处,请予指出!

    iBatis2学习笔记

    4.iBatis2学习笔记:SqlMap的配置总结(18条).doc 5.iBatis2学习笔记:入参和返回值的问题.doc 6.iBatis2学习笔记:一对多映射(双向).doc 7.iBatis2学习笔记:多对多映射(双向) .doc 8.iBatis2学习笔记:总结与...

    持久层框架ibatis学习笔记

    这篇iBatis 学习笔记是跟着传智播客的视频学习整理的,理解上难免有些错误,请以视频为 根本,有些地方笔记中没有整理到,因为这是我之后看着自己做的工程项目总结的,和视频 不完全一致。请谅解。

    ibatis开发和学习总结借鉴.pdf

    ibatis开发和学习总结借鉴.pdf

    ibatis经验

    ibatis学习经验总结,最全面的学习IBATIs总结

    iBATIS学习笔记

    iBATIS学习笔记 使用 iBATIS 开发近一年了,都是在 Google 中现学现用,是时候为自己总结看看这一年都收获了些什么。无奈的是英文水平实在是太差了,官方文档看起来太吃力,所以到图书馆借了这本《iBATIS 实战》这是 ...

    ibatis学习资料及个人学习笔记,对初学者很有用

    总结了一些ibatis的一些学习文档资料,以及自己的总结笔记,包括和struts2,hibernate的总结部分。

Global site tag (gtag.js) - Google Analytics