MyBatis 知識點梳理


簡單地梳理下MyBatis相關的知識點,主要想讓自己重新撿起以前學的框架,如果能給廣大程序猿朋友有所幫助那就更好了。有疏漏的地方也歡迎大家評論指出。閑言少敘,進入正題。。。。。。。

 

MyBatis知識梳理

   簡介(百度,隨便看看)

  1. MyBatis最早源自Apache基金會的一個開源項目iBatis,2010年這個項目有Apache software foundation遷移到了google code,並且改名為MyBatis。
  2. MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。
  3. MyBatis封裝了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。
  4. MyBatis使用簡單地XML或注解做配置和定義映射關系,將Java的POJOs(Plain Old Java Objects)映射成數據庫中的記錄。

 

  MyBatis體系結構中的幾個關鍵部分

  1. 加載配置 —— 可以是XML配置文件方式,也可以是Java代碼的注釋。MyBatis將SQL的配置信息加載成為一個個的MappedStatement對象(包括了傳入參數映射配置,執行的SQL語句、結果映射配置) ,並將其存儲在內存中 
  2. SQL解析 —— 當API接口層接收到調用請求時,會收到傳入SQL的ID和傳入對象(Map、JavaBean或者基本數據類型),MyBatis會根據SQL的ID找到對應的MappedStatement,然后根據傳入參數對象對MappedStatement進行解析,解析后可以得到最終要執行的SQL語句和參數。
  3. SQL執行 —— 將得到的SQL和參數拿到數據庫進行執行,得到操作數據庫的結果。
  4. 結果映射 —— 將結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基本數據類型,並將最終結果返回。

 

  MyBatis的配置文件

  1. SqlMapConfig.xml(1個):主配置文件,用於指定數據庫連接參數和框架參數
     1 <?xml version="1.0" encoding="UTF-8" ?>  
     2 <!DOCTYPE configuration  
     3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
     4   "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
     5   
     6   
     7 <configuration>
     8     <!-- 全局別名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity-->
     9     <typeAliases>
    10         <typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/>
    11     </typeAliases>
    12     
    13     <environments default="development">
    14         <environment id="development">
    15             <transactionManager type="JDBC"/>
    16             <dataSource type="POOLED">
    17                 <property name="driver" value="com.mysql.jdbc.Driver"/>
    18                 <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    19                 <property name="username" value="root"/>
    20                 <property name="password" value=""/>
    21             </dataSource>
    22         </environment>
    23     </environments>
    24     <!-- 指定映射定義文件 -->
    25     <mappers>
    26         <mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/>
    27     </mappers>
    28     
    29 </configuration>

     

  2. SqlMap.xml(n個):映射定義文件,用於定義SQL語句和映射信息
    !!注:namespace有重要作用,不要重復,調用此文件定義增刪改查操作是需要指定namespace;
 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <!DOCTYPE mapper  
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
 5 
 6 <mapper namespace="com.maven.mybatis.mapper.PersonEntityMapper">
 7     <select id="queryAll" resultType="PersonEntity">
 8         select * from t_person
 9     </select>
10     
11     <insert id="insert" parameterType="PersonEntity">
12         insert into t_person(id, name) values(#{id}, #{name})
13     </insert>
14 
15 </mapper> 

 

    

    

  MyBatis框架主要API簡介

  • SqlSessionFactoryBuilder:該對象負責根據MyBatis配置文件SqlMapConfig.xml構建SqlSessionFactory實例
  • SqlSessionFactory:每一個MyBatis的應用程序都以一個SqlSessionFactory對象為核心。該對象負責創建SqlSession對象實例。
  • SqlSession:該對象包含了所有執行SQL操作的方法,用於執行已映射的SQL語句。  

 

  MyBatis基本應用

  • 搭建MyBatis技術環境
    • 為工程添加MyBatis開發包和數據庫驅動包

      

    • 在src下添加MyBatis配置文件SqlMapConfig.xml
    • 修改SqlMapConfig.xml,指定數據庫連接參數
    • 利用MyBatis API編程,獲取SqlSession實例

       

  • 獲取SqlSession對象
    String conf = "SqlMapConfig.xml";
    InputStream in = Resources.getResourceAsStream(resource);
    
    //創建SqlSessionFactoryBuilder對象
    SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
    //通過SessionFactoryBuilder對象獲取SqlSessionFactory
    SqlSessionFactory sf = sfb.build(in);
    
    //創建Session
    SqlSession session = sf.openSession();

     

  • 實現CRUD操作
    • 添加操作
      SqlMap.xml定義
      <!--parameterType因為前面定義過Alias所以不需要寫包名,否則要寫全包名加類名-->
      <insert id="insert" parameterType="PersonEntity">
              insert into t_person(id, name) values(#{id}, #{name})
          </insert>

      id屬性:用於表示映射文件的sql,可以理解為MappedStatement的id
      #{}:標識一個占位符
      parameterType:指定輸入參數的類型
      #{name}:其中name表示輸入的參數,參數名為name;如果輸入參數為簡單類型,#{}中參數可以任意。

               


      Java代碼

      //NAMESPACE為SqlMapper.xml文件根標簽的namespace屬性
      SqlSession session = sf.openSession();

      //第一個參數:指映射文件的id值:namespace.id
      //第二個參數:指映射文件中匹配parameterType類型的實參
      session.insert(NAMESPACE
      + ".insert", person); session.commit(); session.close();

       

    • 添加后返回主鍵
      • mysql自增主鍵返回,mysql每次在調用完一個INSERT語句時會自動生成一個自增主鍵,可以通過函數LAST_INSERT_ID()獲取到插入記錄的自增主鍵。  
        <insert id="insert" parameterType="PersonEntity">
           <!--查詢后將自增主鍵返回到實體對象-->
          <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_person(name) VALUES(#{name}) </insert>

        keyProperty屬性:配置返回user對象的屬性名
        order屬性:配置相對於insert語句執行前或執行后
        resultType:指定結果類型

      • 非自增主鍵返回,使用UUID()函數。在INSERT語句之前執行UUID函數,再將結果插入到INSERT語句中作為主鍵(主鍵必須是字符串類型,長度至少是35位)
        <insert id="insert" parameterType="PersonEntity">
            <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
                SELECT REPLACE(UUID(),'-','')
            </selectKey>
            INSERT INTO t_person(id, name) VALUES(#{id},#{name})
        </insert>

         

      • Oracle中自增主鍵返回
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
                     SELECT 序列名.nextVal()
        </selectKey>

         

    • 更新操作
      SqlMap.xml定義
      <update id="update" parameterType="PersonEntity">
          update t_person set name=#{name} where id=#{id}
      </update >

      Java代碼
      SqlSession session = sf.openSession();
      session.update(NAMESPACE + ".update", person);
              
      session.commit();
      session.close();
    • 刪除操作

      SqlMap.xml定義
      <delete id="delete" parameterType="int">
          delete from t_person where id=#{id}
      </select>

      Java代碼
      SqlSession session = sf.openSession();
      session.delete(NAMESPACE + ".delete", 100);
              
      session.commit();
      session.close();

       

    • 查詢操作
      SqlMap.xml定義
      <!--查詢單行記錄-->
      <select id="queryById" parameterType="int" resultType="PersonEntity">
          select * from t_person
      </select>
      
      <!--查詢多行記錄-->
      <select id="queryAll" resultType="PersonEntity">
          select * from t_person
      </select>
      
      <!--查詢返回Map類型查詢結果-->
      <select id="queryPerson" parameterType="int" resultType="java.util.HashMap">
          select id, name from t_person where id=#{id}
      </select>
      resultType:指定sql輸出結果映射的java對象類型,select指定resultType表示單條記錄映射程度額Java對象。
      ${}:表示拼接sql字符串,如select * from t_person where name like '%${value}%'
      ${value}:接受輸入參數的內容;如果傳入的類型是簡單類型,只能使用value


      Java代碼
      SqlSession session = sf.openSession();
      /*
      //查詢單行記錄
      PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100);
      
      //返回Map查詢結果
      Map map = (Map)session.selectOne("queryPerson", 100);
      */
      //查詢多行記錄
      List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll");
              
      session.commit();
      session.close();



  • MyBatis實現分頁查詢 —— 在使用SqlSession的selectList()方法時,指定一個RowBounds分頁器參數,即可查詢指定范圍的記錄。提示:MyBatis分頁是基於內存分頁,原理是查詢出所有記錄,然后基於jdbc的absolute()和next()方法定位獲取部分記錄,因此在遇到大量數據情況下,不推薦使用MyBatis自帶分頁功能。需要開發者指定分頁查詢的SQL語句或對MyBatis進行擴展使用。
    • RowBounds(offset, limit)  
      - offset指定抓取記錄的起始行,從0開始
      - limit指定抓取記錄的數量
    • 使用方法:sqlSession.selectList(SQL的ID, 參數, RowBounds對象);
  • Mapper映射器:是開發者創造綁定映射語句的接口,映射器接口的實例可以從SqlSession中獲得。
    SqlSession session = sqlSessionFactory.openSession();
    PersonMapper mapper = session.getMapper(PersonEntity.class);
    
    session.close();

    PersonMapper接口定義:

    public interface PersonMapper{
        public List<PersonEntity> queryAll();
        public PersonEntity queryById(int id);
        public void insert(Person person);
        public void update(Person person);
        public void delete(int id);                       
        //!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致
    }

    遵循如下規范,MyBatis會自動給我們創建實現該接口的代理對象
    - 在mapper.xml的namespace屬性值必須是mapper接口的全路徑
    - mapper接口中的方法名必須和mapper.xml文件中的id值相同
    - mapper接口中的輸入參數類型必須和mapper.xml中statement中的parameterType類型相同
    - mapper接口中的方法的返回值類型和mapper.xml中statement中的resultType的類型相同


  • ResultMap映射定義
    在SqlMap.xml定義<select>操作時,如果查詢結果字段名和Java POJO屬於不一致時,需要使用<resultMap>元素顯示指定映射關系,例如
    <select id="queryAll1" resultMap="personMap">
        select id, name from t_person
    </select>
    
    <resultMap id="personMap" type="PersonEntity">
        <result property="no" column="id" />
        <result property="username" column="name" />
    </resultMap>

 

  • SqlMapConfig.xml核心配置文件介紹
    • properties屬性
      - 這個屬性標簽可以用來引用外部的properties的文件
      - MyBatis會按一定順序來加載屬性:1)優先讀取properties標簽體內定義的屬性。2)然后讀取properties標簽中的resource或url屬性,並且會覆蓋已讀取的同名屬性。3)最后讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
      <!-- 引用外部propertes文件替代硬編碼的jdbc配置 -->
          <properties resource="db.properties"></properties>
          <!-- 因為將來要和spring進行整合,這部分用不上了 -->
          <environments default="development">
              <environment id="development">
              <!-- 使用jdbc的事務,由mybatis管理 -->
                    <transactionManager type="JDBC"/>
                    <!-- 數據庫連接池配置,由mybatis管理 -->
                  <dataSource type="POOLED">
                      <property name="driver" value="${jdbc.driver}"/>
                      <property name="url" value="${jdbc.url}"/>
                      <property name="username" value="${jdbc.username}"/>
                      <property name="password" value="${jdbc.password}"/>
                  </dataSource>
                  </environment>
            </environments>

       



    • settings(全局配置參數):在myBatis框架在運行時可以調整一些運行參數

設置參數

描述

有效值

默認值

cacheEnabled

該配置影響的所有映射器中配置的緩存的全局開關。

true | false

true

lazyLoadingEnabled

延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態。

true | false

false

aggressiveLazyLoading

當啟用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載。

true | false

true

multipleResultSetsEnabled

是否允許單一語句返回多結果集(需要兼容驅動)。

true | false

true

useColumnLabel

使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。

true | false

true

useGeneratedKeys

允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)。

true | false

False

autoMappingBehavior

指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。

NONE, PARTIAL, FULL

PARTIAL

autoMappingUnknownColumnBehavior

Specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.

NONE: Do nothing

WARNING: Output warning log (The log level of 'org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' must be set to WARN)

FAILING: Fail mapping (Throw SqlSessionException)

NONE, WARNING, FAILING

NONE

defaultExecutorType

配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(prepared statements); BATCH 執行器將重用語句並執行批量更新。

SIMPLE REUSE BATCH

SIMPLE

defaultStatementTimeout

設置超時時間,它決定驅動等待數據庫響應的秒數。

Any positive integer

Not Set (null)

defaultFetchSize

Sets the driver a hint as to control fetching size for return results. This parameter value can be override by a query setting.

Any positive integer

Not Set (null)

safeRowBoundsEnabled

允許在嵌套語句中使用分頁(RowBounds)。 If allow, set the false.

true | false

False

safeResultHandlerEnabled

允許在嵌套語句中使用分頁(ResultHandler)。 If allow, set the false.

true | false

True

mapUnderscoreToCamelCase

是否開啟自動駝峰命名規則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。

true | false

False

localCacheScope

MyBatis 利用本地緩存機制(Local Cache)防止循環引用(circular references)和加速重復嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享數據。

SESSION | STATEMENT

SESSION

jdbcTypeForNull

當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULLVARCHAR OTHER

JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER

OTHER

lazyLoadTriggerMethods

指定哪個對象的方法觸發一次延遲加載。

A method name list separated by commas

equals,clone,hashCode,toString

defaultScriptingLanguage

指定動態 SQL 生成的默認語言。

A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver

callSettersOnNulls

指定當結果集中值為 null 的時候是否調用映射對象的 settermap 對象時為 put)方法,這對於有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(intboolean等)是不能設置成 null 的。

true | false

false

logPrefix

指定 MyBatis 增加到日志名稱的前綴。

Any String

Not set

logImpl

指定 MyBatis 所用日志的具體實現,未指定時將自動查找。

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

Not set

proxyFactory

指定 Mybatis 創建具有延遲加載能力的對象所用到的代理工具。

CGLIB | JAVASSIST

JAVASSIST (MyBatis 3.3 or above)

vfsImpl

Specifies VFS implementations

Fully qualified class names of custom VFS implementation separated by commas.

Not set

useActualParamName

Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1)

 

 

  

    • typeAliases(類型別名)
      - 在映射文件中,會定義很多的statement,需要parameterType指定大量的類型,這些類型的全路徑太長,這個時候為了開發方便,可以為這些類型取一個別名(單個修改)
      <!-- 指定類的別名 -->
      <typeAliases>
          <typeAlias alias="User" type="cn.konrad.mapper.User"/>
      </typeAliases>
      -------------------------------------------------------------------
      <select id="findUserById" parameterType="int" resultType="User">
              SELECT * FROM t_user WHERE id=#{id}
      </select>

      - 批量修改(給一個包取名,定義之后,映射文件中大小寫均可,它會自動地到該包下找類)

      <!-- 指定包的別名 -->
      <typeAliases>
       <package name="cn.konrad.mapper"/>
      </typeAliases>
      ----------------------------------------------------
      <select id="findUserById" parameterType="int" resultType="User">
              SELECT * FROM t_user WHERE uid=#{uid}
      </select>

      - 對於普通的 Java 類型,有許多內建的類型別名。它們都是大小寫不敏感的,由於重載 的名字,要注意原生類型的特殊處理。

      別名

      映射的類型

      _byte

      byte

      _long

      long

      _short

      short

      _int

      int

      _integer

      int

      _double

      double

      _float

      float

      _boolean

      boolean

      string

      String

      byte

      Byte

      long

      Long

      short

      Short

      int

      Integer

      integer

      Integer

      double

      Double

      float

      Float

      boolean

      Boolean

      date

      Date

      decimal

      BigDecimal

      bigdecimal

      BigDecimal

      object

      Object

      map

      Map

      hashmap

      HashMap

      list

      List

      arraylist

      ArrayList

      collection

      Collection

      iterator

      Iterator

 

    • typeHandler(類型處理器):在mybatis通過類型處理器來完成jdbc類型對Java類型的裝換

類型處理器

Java 類型

JDBC 類型

BooleanTypeHandler

java.lang.Boolean, boolean

數據庫兼容的 BOOLEAN

ByteTypeHandler

java.lang.Byte, byte

數據庫兼容的 NUMERIC BYTE

ShortTypeHandler

java.lang.Short, short

數據庫兼容的 NUMERIC SHORT INTEGER

IntegerTypeHandler

java.lang.Integer, int

數據庫兼容的 NUMERIC INTEGER

LongTypeHandler

java.lang.Long, long

數據庫兼容的 NUMERIC LONG INTEGER

FloatTypeHandler

java.lang.Float, float

數據庫兼容的 NUMERIC FLOAT

DoubleTypeHandler

java.lang.Double, double

數據庫兼容的 NUMERIC DOUBLE

BigDecimalTypeHandler

java.math.BigDecimal

數據庫兼容的 NUMERIC DECIMAL

StringTypeHandler

java.lang.String

CHAR, VARCHAR

ClobReaderTypeHandler

java.io.Reader

-

ClobTypeHandler

java.lang.String

CLOB, LONGVARCHAR

NStringTypeHandler

java.lang.String

NVARCHAR, NCHAR

NClobTypeHandler

java.lang.String

NCLOB

BlobInputStreamTypeHandler

java.io.InputStream

-

ByteArrayTypeHandler

byte[]

數據庫兼容的字節流類型

BlobTypeHandler

byte[]

BLOB, LONGVARBINARY

DateTypeHandler

java.util.Date

TIMESTAMP

DateOnlyTypeHandler

java.util.Date

DATE

TimeOnlyTypeHandler

java.util.Date

TIME

SqlTimestampTypeHandler

java.sql.Timestamp

TIMESTAMP

SqlDateTypeHandler

java.sql.Date

DATE

SqlTimeTypeHandler

java.sql.Time

TIME

ObjectTypeHandler

Any

OTHER 或未指定類型

EnumTypeHandler

Enumeration Type

VARCHAR-任何兼容的字符串類型,存儲枚舉的名稱(而不是索引)

EnumOrdinalTypeHandler

Enumeration Type

任何兼容的 NUMERIC DOUBLE 類型,存儲枚舉的索引(而不是名稱)。

  

    • objectFactory(對象工廠)
    • plugins(插件)
    • environments(環境集合屬性對象)
    • environment(環境子屬性對象)
    • transactionManager(事務管理器)
    • dataSource(數據源)
    • mappers(映射器)
      - <mapper resource="" /> 相對於類路徑,如<mapper resource="cn/konrad/mybatis/UserMapper.xml"/>
      - <mapper url="" /> 使用絕對路徑(完全限定路徑),如 <mapper url="file:///
      D:\workSpace\mybatis\bin\cn\konrad\mapper\UserMapper.xml"/> 
      - <mapper class="" /> 使用mapper接口路徑,此方法要求mapper接口與映射文件名稱相同且存放在完全相同的目錄下,如 <mapper class="cn.konrad.mapper.UserMapper"/>

       
  • MyBatis動態SQL:對SQL進行判斷、拼接、組裝
    • if判斷
      <!-- if判斷 -->
          <select id="findUsersByCriteria" parameterType="User"
          resultType="User">
          SELECT * FROM t_user
          <!-- 這個where標簽會自動的刪除第一個AND -->
          <where>
              <if test="name!=null and name!=''">
                  AND name like '%${name}%'
              </if>
              <if test="age!=null and age!=''">
                  AND age=#{age}
              </if>
          </where>
      </select>

       

    • Sql片段:當我們通過條件查詢用戶所有信息,和通過條件查詢所有用戶的數量
      <!-- 定義sql片段 
              id屬性:表示sql片段的唯一標識
              一定要基於單標操作定義sql片段,這樣這個sql片段的可重用性才高
              在sql片段中不要包括where條件
          -->
          <sql id="query_user_where">
              <if test="name!=null and name!=''">
                  AND name like '%${name}%'
              </if>
              <if test="age!=null and age!=''">
                  AND age=#{age}
              </if>
          </sql>
      
      
      <!--引用sql片段-->
      <where>
          <!-- refid用來引用sql片段的id值,如果該sql片段不在本配置文件中需要加namespace的值 -->
          <include refid="query_user_where"></include>
      </where>

       

    • foreach:向sql傳遞數組或list時,用foreach構建SQL
      <delete id="deleteBatch"> 
          delete from user where id in
          <foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
            #{id}
          </foreach>
      </delete>

      - collection :collection屬性的值有三個分別是list、array、map三種,分別對應的參數類型為:List、數組、map集合,我在上面傳的參數為數組,所以值為array
      - item:
      表示在迭代過程中每次迭代到的位置(下標)- index:
      - open:
      前綴
      - close:后綴
      - separator:分隔符,表示迭代時每個元素之間以什么分隔



        
  • 一對一映射
    • resultType實現較為簡單,對於多表映射中只要增加其他勒種屬性即可完成映射。 但是會新增一個子類,如果對查詢結果沒有要求可以用它。
    • resultMap實現較為復雜,需要自定義resultMap。但 是不需要新增子類,用我們傳統的對象模型即可完成映射,並且支持延遲加載的功能,而resultType不支持。
      <resultMap type="cn.chinasofti.entity.Orders" id="resultMapOrder">
              <!-- 配置Order主類信息  -->
              <id column="id" property="id"/>
              <result column="note" property="note"/>
              <result column="createdate" property="createdate"/>
                      
              <association property="user" javaType="User">
                  <id column="uid" property="id"/>
                  <result column="username" property="username"/>
                  <result column="sex" property="sex"/>
                  <result column="address" property="address"/>
                  <result column="birthday" property="birthday"/>
              </association>
          </resultMap>
          
          <select id="findOrderUserWithResultMap" resultMap="resultMapOrder">
              SELECT 語句
          </select>

      - association屬性:配置關聯的表
      - javaType屬性:代表映射表中的實體對象的真實類型



  • 一對多映射
    <resultMap type="User" id="resultMapUser">
            <!-- 配置User信息 -->
            <id column="_uid" property="id"/>
            <result column="username" property="username"/>
            <result column="birthday" property="birthday"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
            
            <!-- 配置Orders集合信息 -->
            <collection property="orders" ofType="Orders">
                <id column="_oid" property="id"/>
                <result column="createdate" property="createdate"/>
                <result column="note" property="note"/>
            </collection>
        </resultMap>
        
        <select id="findUserOrders" resultMap="resultMapUser">
            SELECT 語句
        </select>

    - ofType屬性:申明的是集合中元素的類型
    !注意:當兩個表的主鍵列名相同時,在配置的時候一定要為其配置一個別名,否者該類查詢出的集合中只有一條數據

     

     

  • 多對多映射(與一對多類似,在映射的兩個映射文件中添加collection集合配置)
  • 延遲加載:默認是沒有開啟延遲加載的,需要在核心配置文件中配置
    <!-- 開啟延遲加載 -->
        <settings>
            <setting name="lazyLoadingEnabled" value="true" />
            <setting name="aggressiveLazyLoading" value="false"></setting>
        </settings>

     

  • 一級緩存:默認開啟,是基於SqlSession范圍的緩存
  • 二級緩存:默認不支持二級緩存,是基於Mapper范圍的緩存

 

 


暫時就先寫到這,后續有補充的繼續修正。歡迎各位猴子(猿)們指正補充!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM