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

    见另外两篇文章     

原文地址:https://www.cnblogs.com/Marydon20170307/p/6918057.html