`
kfyfly
  • 浏览: 54337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    iBatis2学习笔记

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

    iBATIS2.0学习总结

    iBATIS2.0是一个基于Java的持久层框架,它主要负责将SQL查询与应用程序的业务逻辑解耦,使得开发者可以更加专注于SQL的编写和优化,而无需关心数据访问的底层细节。iBATIS并不像Hibernate那样是完全的对象关系映射...

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

    在IT行业中,Ibatis、Oracle...希望这篇总结能为你的学习之路提供有价值的指导,进一步深化你对Ibatis、Oracle和敏捷开发的理解。在IT世界中,持续学习和实践是提升自身能力的关键,祝你在技术探索的道路上越走越远。

    ibatis学习总结

    【ibatis学习总结】 在Java应用中,ORM(对象关系映射)框架是连接数据库与业务逻辑的关键。相比像Hibernate和Apache OJB这样的"一站式"ORM解决方案,iBATIS提供了一种更为灵活的"半自动化"策略。iBATIS允许开发者...

    ibatis学习总结文档

    本文档旨在对iBATIS的学习进行深入的总结,帮助初学者快速上手。 一、iBATIS概述 iBATIS的核心理念是“SQL Map”,它将SQL与Java代码分离,通过XML配置文件或注解来定义SQL语句,实现了数据访问层的灵活定制。这...

    ibatis学习资料汇总

    《iBatis学习资料汇总》 iBatis,作为一个轻量级的持久层框架,它在Java开发领域中扮演着重要的角色。这个框架允许开发者将SQL语句与Java代码分离,提高了开发效率并降低了维护成本。本文将深入探讨iBatis的核心...

    ibatis 知识点总结(PDF)

    #### 第Ⅲ部分:SqlMap API使用方法学习总结 **SqlMap API使用方法:** ibatis提供了丰富的API用于执行SQL语句和处理结果集。 - **SqlSessionFactory:** - SqlSessionFactory是ibatis的核心工厂类,负责创建...

    ibatis2.rar

    "iBATIS学习总结 - 郭睿的专栏 - CSDN.NET_files"和"iBATIS与Spring集成及环境搭建 - 振华 - ITeye技术网站_files"可能是相关文章的图片或辅助资源。 通过这些资料,开发者可以系统地学习和掌握iBATIS 2.x版本的...

    传智播客ibatis教程_ibatis优点总结

    本文将深入探讨其中一个流行的选择——iBATIS,以及其在传智播客教程中的优点总结。 iBATIS,全称为“互联网应用程序基础工具包”(Internet Basics for Architecture with Transactions and SQL),是由Apache ...

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

    《Ibatis开发与学习总结借鉴》 Ibatis,作为一个轻量级的持久层框架,以其简单易用、灵活高效的特点,被广泛应用于Java Web开发中。本文将对Ibatis的基本原理、开发工具Abator以及在Eclipse环境下的应用进行深入...

    ibatis2小例子(转)

    标题 "ibatis2小例子(转)" 指向的是一个关于iBatis2的实战教程或示例,这是...通过对上述知识点的学习和实践,开发者可以高效地利用iBatis2进行数据库操作,降低数据访问层的复杂性,并提高代码的可读性和可维护性。

    Ibatis2.x学习实战

    【Ibatis2.x学习实战】 Ibatis,全称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在2.x版本中,Ibatis主要帮助开发者将SQL语句与Java代码分离,提供了一种灵活的数据库访问方式,...

    freemarker+struts2+ibatis入门学习摘要

    "freemarker+struts2+ibatis入门学习摘要" 这个标题揭示了本文档将围绕三个核心Java技术框架进行讲解:FreeMarker、Struts2和iBatis。这些是Java Web开发中常用的技术,它们分别负责视图层、控制层和数据访问层的...

    J2EE学习 Ibatis开发资料共享 Ibatis开发资料 Ibatis学习框架 Ibatis开发概要

    ### J2EE学习:Ibatis开发资料概要 #### 一、Ibatis简介与特点 Ibatis是一款半自动化的ORM(Object Relational Mapping)框架,它不像Hibernate等其他ORM工具那样提供完全自动化的数据库操作,而是更侧重于SQL语句...

    iBatis学习总结

    《iBatis学习总结——深入理解SQLServer驱动与工具应用》 在软件开发领域,数据库操作是不可或缺的一部分,而iBatis作为一个优秀的持久层框架,为开发者提供了灵活的SQL映射功能,使得Java应用程序能够更好地与...

    ibatis-2-mybatis-2.3.5.zip

    总结,iBatis 2.3.5以其简洁的设计和强大的功能,在Java世界中占据了一席之地。通过深入学习其源码,不仅可以提升对数据库操作的理解,还能为后续使用MyBatis或其他ORM框架打下坚实基础。在实际项目中,结合iBatis的...

    Ext简单后台交互(struts2+ibatis2+mysql5.5)

    总结来说,这个项目展示了如何使用Struts2作为MVC框架处理HTTP请求,iBatis作为数据访问层执行SQL操作,MySQL作为数据库存储数据,而Ext JS则用于构建现代、交互式的用户界面。通过这样的组合,开发者可以构建出高效...

Global site tag (gtag.js) - Google Analytics