• IBATIS


    CreateTime--2017年5月29日13:56:15
    Author:Marydon

    一、IBATIS

      iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。是一个基于SQL映射支持Java和·NET的持久层框架。

      (一)配置

        1.1.1 ibatis配置文件常用配置

    <sqlMapConfig>
        <settings cacheModelsEnabled="true" lazyLoadingEnabled="true"
            enhancementEnabled="true" useStatementNamespaces="true"
            statementCachingEnabled="true" classInfoCacheEnabled="true" />
    </sqlMapConfig>

         参数说明:

    cacheModelsEnabled
    //是否启动ibatis中的缓存功能;
    lazyLoadingEnabled
    //是否同时懒加载带来极大的性能提升;
    useStatementNamespaces
    //是否使用 domain xml 文件中 namespace 别名配置
    //iBATIS的默认是不会启动命名空间的,若使用,需声明该值为true
    enhancementEnabled
    //是否需要POJO启动Java字节码增强功能,可以提升getter/setter的调用效能避免Java反射所带来的性能开销。
    剩下两个默认值都为true
    classInfoCacheEnabled 
    /*With this setting enabled, iBATIS will maintain a cache of introspected classes. This will lead to a  significant reduction in startup time if many classes are reused.*/
    statementCachingEnabled (iBATIS 2.3.0以后版本中有)
    /*With this setting enabled, iBATIS will maintain a local cache of prepared statements. This can lead to significant performance improvements.*/   

        1.1.2 ibatis的总配置有且只能有一个,总配置文件直接引用各个SQLMap文件,不能像struts一样,a总配置文件-->引用b子配置文件-->...n层-->各个配置文件。

        举例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sqlMapConfig
            PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
            "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
    <sqlMapConfig>
        <settings cacheModelsEnabled="true" errorTracingEnabled="true"
            enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="512"
            maxSessions="384" maxTransactions="256" useStatementNamespaces="true" />
    
        <!-- 
            特别注意:只能直接引用SQLMap文件,不能通过:引用子配置文件,子配置文件去引用SQLMap文件的方式实现,
            否则,最终会找不到SQLMap文件
        -->        
        <!-- 患者信息 -->
        <sqlMap resource="telemedicine/service/domain/entites/oracle/patient/PATIENT_INFO.xml" />
            
        
    </sqlMapConfig>

      

      (二)常用标签    

       CreateTime--2016年12月9日17:45:21

        iBATIS的isNotNull和isNotEmpty的区别

    <isNotNull prepend="," property="FREMARK">
        FREMARK = #FREMARK#
    </isNotNull>
    <isNotEmpty prepend="," property="FBEGINDATE">
        FBEGINDATE = TO_DATE(#FBEGINDATE#,'yyyy-MM-dd')
    </isNotEmpty>

          isNotNull相当于

    if(FREMARK){
        FREMARK = #FREMARK#
    }

          该字段内容可以为空,即FREMARK=

          isNotEmpty相当于  

    if(FREMARK != null && FREMARK != ""){
        FREMARK = #FREMARK#
    }

          前台传过来的字段中不仅要包括FREMARK,并且FREMARK的内容不能为空,才会执行

        UpdateTime--2017年1月22日15:15:03

        1.2.1 字段不等于具体的值:column=="value"  

          语法:

            <isEqual prepend="" property="" compareValue=""></isEqual>

          举例:  

    <isEqual prepend="and" property="FCOMLVL" compareValue="-1">
        FCOMLVL IS NULL
    </isEqual>

        1.2.2 字段等于具体的值:column!="value"

          语法:

            <isNotEqual prepend="" property="" compareValue=""></isNotEqual>

          举例:

    <isNotEqual prepend="and" property="FPLVCODE" compareValue="1">
        FPLVCODE=#FPLVCODE#
    </isNotEqual>

        1.2.3 字段不为空:column!=null  

          语法:

            <isNotNull prepend="" property=""></isNotNull>

          举例:

    <isNotNull prepend="," property="FJCMYEAR">
        FJCMYEAR=#FJCMYEAR#
    </isNotNull>

        1.2.4 字段非空且不是空字符串:column!=null && column!=""

          语法:

            <isNotEmpty prepend="" property=""></isNotEmpty>

          举例:

    <isNotEmpty prepend="and" property="FICDFM">
        FICDFM=#FICDFM#
    </isNotEmpty>

        1.2.5 字段存在,且为空:column!=null&&column==""

          语法:

            <isEmpty prepend="" property=""></isEmpty>

          举例:        

    <isNotEmpty property="CLICOM" >
         order by A.FCLINHITS DESC,length(A.FZJM) ASC,FICDCODE 
    </isNotEmpty>
    <isEmpty property="CLICOM">
        <isNotEmpty property="HOSCOM" >
            order by A.FINHOSHITS DESC,length(A.FZJM) ASC,FICDCODE
        </isNotEmpty>
        <isEmpty property="HOSCOM">
            order by A.FINHOSHITS DESC,length(A.FZJM) ASC,FICDCODE
        </isEmpty>
    </isEmpty>

        1.2.6 字段不存在:column==null

          语法:

            <isNull prepend="" property=""></isNull>    

        1.2.7 XML文件中如何使用">"和"<"

        方法一:      

          使用
          <![CDATA[

          ]]>

        举例:

    <![CDATA[
          X1.ORGDEGREE <= #ORGDEGREE_Z#
    ]]>

        方法二:

          大于用 &gt; 表示,小于用 &lt; 表示

        UpdateTime--2017年8月8日09:08:03

        1.2.8 关于prepend

        以<isNotNull prepend="and" property="firstName">为例

        生成的语句不会有多余的and,因为dynamic有一个隐藏的属性:removeFirstPrepend="true", 所以一般要写上prepend="and",需要的时候它会自动去掉。 

      (三)常用操作

        UpdateTime--2017年6月15日08:15:36

        1.3.1 增

    <insert id="insertTSORGDIAITEM" parameterClass="map">
        INSERT INTO 表名
    </insert>

        举例:

    <insert id="insertTDOCTORORG" parameterClass="map">
      <selectKey keyProperty="FID" resultClass="java.lang.Long">
        SELECT SEQ_1.NEXTVAL FROM DUAL
      </selectKey>
      INSERT INTO TDOCTORORG
        (FID,
         FDOCTORCODE,
         FDOCTORNAME,
         FZJM,
         FRCODE,
         FORGID,
         FDOCTORCODE_CENTER,
         FREMARK,
         FDEPTCODE)
      VALUES
        (#FID#,
         #FDOCTORCODE#,
         #FDOCTORNAME#,
         #FZJM#,
         #FRCODE#,
         #FORGID#,
         #FDOCTORCODE_CENTER#,
         #FREMARK#,
         #FDEPTCODE#)
    </insert>

        转换成SQL

    INSERT INTO TDOCTORORG
      (FID,
       FDOCTORCODE,
       FDOCTORNAME,
       FZJM,
       FRCODE,
       FORGID,
       FDOCTORCODE_CENTER,
       FREMARK,
       FDEPTCODE)
    VALUES
      (?, ?, ?, ?, ?, ?, ?, ?, ?)
    --[142929, 001, test, 001, 410122, 0, , null, null]
        1.3.2 改
    <update id="updateTDICTICDCODE"  parameterClass="map">
        UPDATE 表名
    </update>

        举例:

    <update id="updateFDOCTORCODE" parameterClass="map">
        UPDATE TDOCTORORG
           SET FDOCTORCODE_CENTER = #FDOCTORCODE_CENTER#,
               FDOCTORNAME        = #FDOCTORNAME#,
               FZJM               = #FZJM#,
               FDEPTCODE          = #FDEPTCODE#
         WHERE FDOCTORCODE = #FDOCTORCODE#
           AND FRCODE = #FRCODE#
           AND FORGID = #FORGID#
    </update>

        转换成SQL

    UPDATE TDOCTORORG
       SET FDOCTORCODE        = ?,
           FDOCTORCODE_CENTER = ?,
           FDOCTORNAME        = ?,
           FZJM               = ?,
           FDEPTCODE          = ?
     WHERE FID = ?
       AND FRCODE = ?
       AND FORGID = ?
    --[001, , test1, 001, null, 142929, 410122, 0]
        1.3.3 删
    <delete id="delTSORGDIAITEM" parameterClass="map">
        DELETE FROM 表名
    </delete>
        1.3.4 查
    <select id="getTSORGDIAITEM" parameterClass="map" remapResults="true" resultClass="java.util.HashMap" cacheModel="cacheTSORGDIAITEM">
        SELECT 字段 FROM 表名
    </select>

        举例:

    <select id="getPrint" resultClass="map">
      SELECT T1.PATIENT_NAME,
             T1.SEX,
             T1.BIRTH_DAY,
             T1.OUTPAT_CODE,
             TO_CHAR(T2.CONSULT_DATE, 'yyyy-MM-dd HH24:mi') CONSULT_DATE,
             T2.CONSULT_CLASS,
             T2.CONSULT_TYPE,
             T3.CONSULT_DIAGNOSIS,
             T3.TREATMENT_PLAN,
             T3.REMARK,
             T3.CONSULT_PEOPLE
        FROM OUTPATIENT_INFO                T1,
             OUTPATIENT_CONSULT_INFO        T2,
             OUTPATIENT_CONS_ASSESSMENTINFO T3
       WHERE T1.PATIENT_INFO_ID = #PATIENT_INFO_ID#
         AND T2.CONSULT_APPLY_ID = #CONSULT_APPLY_ID#
         AND T1.PATIENT_INFO_ID = T2.PATIENT_INFO_ID
         AND T2.CONSULT_APPLY_ID = T3.CONSULT_APPLY_ID
    </select>

        转换成SQL

    SELECT T1.PATIENT_NAME,
             T1.SEX,
             T1.BIRTH_DAY,
             T1.OUTPAT_CODE,
             TO_CHAR(T2.CONSULT_DATE, 'yyyy-MM-dd HH24:mi') CONSULT_DATE,
             T2.CONSULT_CLASS,
             T2.CONSULT_TYPE,
             T3.CONSULT_DIAGNOSIS,
             T3.TREATMENT_PLAN,
             T3.REMARK,
             T3.CONSULT_PEOPLE
        FROM OUTPATIENT_INFO                T1,
             OUTPATIENT_CONSULT_INFO        T2,
             OUTPATIENT_CONS_ASSESSMENTINFO T3
       WHERE T1.PATIENT_INFO_ID = ?
         AND T2.CONSULT_APPLY_ID = ?
         AND T1.PATIENT_INFO_ID = T2.PATIENT_INFO_ID
         AND T2.CONSULT_APPLY_ID = T3.CONSULT_APPLY_ID
    --[51CE27E4269418A9E0530100007FCD14, 51CE27E4269518A9E0530100007FCD14]    

        注意:

          1.使用iBATIS进行增、改操作时,parameterClass映射到SQL时:

            若parameterClass中不存在参数,如:FDOCTORCODE_CENTER,iBATIS进行ORM映射时,会自动将该字段对应的值置为NULL,执行该SQL时不会发生异常;

            若parameterClass中存在参数,如:FDOCTORCODE_CENTER,但对应的值为空,iBATIS进行ORM映射时,会自动将该字段对应的值置为空字符串""。

          2.使用TO_CHAR(),TO_DATE()等函数时千万别忘了给该字段起别名!

        1.3.5 动态拼接WHERE查询条件

          第一步:声明动态WHERE条件

    <sql id="isReported_where">
        <dynamic prepend="where">
            <isNotEmpty prepend=" " property="FPROVLEVELLIMIT">
                x1.FPROVLEVELLIMIT=#FPROVLEVELLIMIT#
            </isNotEmpty>
            <isNotEmpty prepend="and" property="FCOUNLEVELLIMIT">
                x1.FCOUNLEVELLIMIT=#FCOUNLEVELLIMIT#
            </isNotEmpty>
            <isNotEmpty prepend="and" property="FTOWNLEVELLIMIT">
                x1.FTOWNLEVELLIMIT=#FTOWNLEVELLIMIT#
            </isNotEmpty>
            <isNotEmpty prepend="and" property="FVILLLEVELLIMIT">
                x1.FVILLLEVELLIMIT=#FVILLLEVELLIMIT#
            </isNotEmpty>
        </dynamic>
    </sql>

          注意:

            a.dynamic prepend="值",这个地方的值视情况而定,一般为""或"where";

            b.isNotEmpty 第一个prepend的值为" "或"and",必须有值。

          第二步:引用引用SQL

    <!-- 引用通用SQL -->
    <include refid="TSORGDIAITEM_WHERE"/>      

      

      (四)IBATIS + ORACLE

        见另外两篇文章     

  • 相关阅读:
    时序图和类图
    word文档一个表格分割成两个表格
    Spring 报错:Error creating bean with name
    怎么让线条快速选中并组合多个形状
    [扩展阅读] Python 函数修饰符(装饰器)的使用
    第039 类和对象 拾遗
    吴恩达深度学习 第一课第三周课后编程作业
    第038讲:类和对象:继承 课后测试题及答案
    廖雪峰Python教程--使用模块
    第037讲:类和对象:面向对象编程
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/6918057.html
Copyright © 2020-2023  润新知