Mybatis的配置文件和映射文件詳解


一、Mybatis的全局配置文件
    1、SqlMapConfig.xml(名稱可變)是mybatis的全局配置文件,配置內容如下:
     properties(屬性)
       settings(全局配置參數)
       typeAliases(類型別名)
       typeHandlers(類型處理器)
       objectFactory(對象工廠)
       plugins(插件)
       environments(環境集合屬性對象)
         environment(環境子屬性對象)
         transactionManager(事務管理)
         dataSource(數據源)
         mappers(映射器)
 
     2、properties
     將數據庫連接參數單獨配置在db.properties(名稱可變)中,放在類路徑下。這樣只需要在SqlMapConfig.xml中加載db.properties的屬性值。這樣在SqlMapConfig.xml中就不需要對數據庫連接參數硬編碼。將數據庫連接參數只配置在db.properties中,原因:方便對參數進行統一管理,其它xml可以引用該db.properties
 
 例如:db.properties
     jdbc.driver=com.mysql.jdbc.Driver
     jdbc.url=jdbc:mysql://localhost:3306/mybatis
     jdbc.username=root
     jdbc.password=root
 
 相應的SqlMapConfig.xml
   <properties resource="db.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
 
注意: MyBatis 將按照下面的順序來加載屬性:
 首先、在properties標簽中指定的屬性文件首先被讀取。
 其次、會讀取properties元素中resource或 url 加載的屬性,它會覆蓋已讀取的同名屬性。
 最后、讀取parameterType傳遞的屬性,它會覆蓋已讀取的同名屬性。
常用做法:
 不要在properties元素體內添加任何屬性值,只將屬性值定義在外部properties文件中。
 在properties文件中定義屬性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX的形式,就像jdbc.driver。這樣可以防止和parameterType傳遞的屬性名沖突,從而被覆蓋掉。
 
3、settings
  mybatis全局配置參數,全局參數將會影響mybatis的運行行為。比如:開啟二級緩存、開啟延遲加載。具體可配置情況如下
  
配置示例:
    <settings>
       <setting name="cacheEnabled" value="true"/>
       <setting name="lazyLoadingEnabled" value="true"/>
       <setting name="multipleResultSetsEnabled" value="true"/>
    </settings>
 
4、typeAliases
   typeAliases可以用來自定義別名。在mapper.xml中,定義很多的statement,而statement需要parameterType指定輸入參數的類型、需要resultType指定輸出結果的映射類型。如果在指定類型時輸入類型全路徑,不方便進行開發,可以針對parameterType或resultType指定的類型定義一些別名,在mapper.xml中通過別名定義,方便開發。
   例如:
    <typeAliases>
        <!-- 單個別名定義 -->
        <typeAlias alias="user" type="com.kang.pojo.User"/>
        <!-- 批量別名定義,掃描整個包下的類,別名為類名(首字母大小寫都可以) -->
        <package name="com.kang.pojo"/>
        <package name="其它包"/>
    </typeAliases>
   mapper.xml的引用形式
    <select id="findUserById" parameterType="int" resultType="user">
            SELECT * FROM USER WHERE id=#{value}
    </select>
 
5、typeHandlers
    mybatis中通過typeHandlers完成jdbc類型和java類型的轉換。通常情況下,mybatis提供的類型處理器滿足日常需要,不需要自定義。具體可參考Mybatis的官方文檔。
6、environments
   MyBatis 可以配置多種環境。這會幫助你將 SQL 映射應用於多種數據庫之中。但是要記得一個很重要的問題:你可以配置多種環境,但每個數據庫對應一個 SqlSessionFactory。所以,如果你想連接兩個數據庫,你需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,你就需要三個實例,以此類推。
   為了明確創建哪種環境,你可以將它作為可選的參數傳遞給 SqlSessionFactoryBuilder。
   可以接受環境配置的兩個方法簽名是:
       SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
       SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);
   如果環境被忽略,那么默認環境將會被加載,按照如下方式進行:
       SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
       SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);
 
配置示例:
 
    <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>
 
注意:
---默認的環境 ID(比如: default=”development”)。
---每個 environment 元素定義的環境 ID(比如: id=”development”)。
---事務管理器的配置(比如: type=”JDBC”)。
默認的環境和環境 ID 是自我解釋的。你可以使用你喜歡的名稱來命名,只要確定默認的要匹配其中之一。
7、mappers
   Mapper配置的幾種方法:
     第一種(常用)
        <mapper resource=" " /> resource指向的是相對於類路徑下的目錄
         如:<mapper resource="sqlmap/User.xml" />
     第二種
        <mapper url=" " /> 使用完全限定路徑
         如:<mapper url="file:///D:\workspace\mybatis1\config\sqlmap\User.xml" />
     第三種
        <mapper class=" " /> 使用mapper接口類路徑
         如:<mapper class="cn.kang.mapper.UserMapper"/>
注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。
     第四種(推薦)
        <package name=""/> 注冊指定包下的所有mapper接口
         如:<package name="cn.kang.mapper"/>
注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。
  使用示例:
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
        <package name="cn.kang.mapper"/>
    </mappers>
 
二、Mapper映射文件
    Mapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心
         Mapper映射文件是一個xml格式文件,必須遵循相應的dtd文件規范,如ibatis-3-mapper.dtd
      Mapper映射文件是以<mapper>作為根節點,在根節點中支持9個元素,分別為insert、update、delete、select(增刪改查);cache、cache-ref、resultMap、parameterMap、sql
   (一)select、parameterMapresultType、resultMap
    
     1、<select
         <!-- (1)id (必須配置)
        id是命名空間中的唯一標識符,可被用來代表這條語句。
        一個命名空間(namespace) 對應一個dao接口,
        這個id也應該對應dao里面的某個方法(相當於方法的實現),因此id 應該與方法名一致  
         -->
     
        id="findUserById"  --- 對應接口中的方法名
     
         <!--(2)parameterType (可選配置, 默認為mybatis自動選擇處理)
        將要傳入語句的參數的完全限定類名或別名, 如果不配置,mybatis會通過ParameterHandler 根據參數類型默認選擇合適的typeHandler進行處理
          parameterType 主要指定參數類型,可以是int, short, long, string等類型,也可以是復雜類型(如對象) 
         -->
        parameterType="int"
     
          <!-- (3)resultType (resultType 與 resultMap 二選一配置)
         resultType用以指定返回類型,指定的類型可以是基本類型,可以是java容器,也可以是javabean 
          -->
        resultType="User"
     
          <!--(4)resultMap (resultType 與 resultMap 二選一配置)
              resultMap用於引用我們通過 resultMap標簽定義的映射類型,這也是mybatis組件高級復雜映射的關鍵 
          -->
        resultMap="userResultMap"
     
          <!--(5)flushCache (可選配置)
         將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:false 
          -->
        flushCache="false"
     
          <!--(6)useCache (可選配置)
         將其設置為 true,將會導致本條語句的結果被二級緩存,默認值:對 select 元素為 true 
          -->
        useCache="true"
     
          <!--(7)timeout (可選配置)
         這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)
          -->
        timeout="10000"
     
          <!-- (8)fetchSize (可選配置)
         這是嘗試影響驅動程序每次批量返回的結果行數和這個設置值相等。默認值為 unset(依賴驅動)
          -->
        fetchSize="256"
     
          <!--(9)statementType (可選配置)
          STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
          -->
     statementType="PREPARED"
     
          <!--(10)resultSetType (可選配置)
         FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值為 unset (依賴驅動)
          -->
     resultSetType="FORWARD_ONLY"
      >
 
     2、parameterType(輸入類型)
       通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型。
       #{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個占位符即?。
     例如:
        <select id="findUserById" parameterType="int" resultType="user">
            select * from user where id = #{id}
            </select>
 
     使用占位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行java類型和jdbc類型的轉換。#{}可以接收
  簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
     ${}和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如
  果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:
 
       <select id="selectUserByName" parameterType="string" resultType="user">
                 select * from user where username like '%${value}%'
            </select>
      使用#{}則傳入的字符串中必須有%號,而%是人為拼接在參數中,顯然有點麻煩,如果采用${}在sql中拼接為%的方式則在調用mapper接口
  傳遞參數就方便很多。如果使用${}原始符號則必須人為在傳參數中加%。
          List<User> list = userMapper.selectUserByName("%管理員%");
 
      如果使用%${value}%則不用人為在參數中加%。
              List<User>list = userMapper.selectUserByName("管理員");
 
         (1)parameterType也可以傳遞pojo對象。Mybatis使用ognl表達式解析對象字段的值,如下例子:
    <!—傳遞pojo對象綜合查詢用戶信息 -->
      <select id="findUserByUser" parameterType="user" resultType="user">
           select * from user where id=#{id} and username like '%${username}%'
        </select>
      上邊%${username}%中的username就是user對象中對應的屬性名稱。
     parameterType還可以傳遞pojo包裝對象(也就是將多個對象包裝為一個對象)。開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢
   條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。
   例如下面的包裝對象:
    public class QueryVo {
        private User user;
        private UserCustom userCustom;
    }
   在映射文件中的使用
          <!—傳遞pojo包裝對象綜合查詢用戶信息 -->
        <select id="findUserByUser" parameterType="queryVo" resultType="user">
           select * from user where id=#{user.id} and username like '%${user.username}%'
        </select>
    可以看出通過使用類似java中對象訪問屬性的形式來進行參數傳遞。
     (2)parameterType也可以傳遞hashmap類型的參數
    在xml映射文件中使用形式如下:
          <select id="findUserByHashmap" parameterType="hashmap" resultType="user">
           select * from user where id=#{id} and username like '%${username}%'
          </select>
    在代碼中的調用形式如下:
    public void testFindUserByHashmap()throws Exception{
           SqlSession session = sqlSessionFactory.openSession();//獲取session
           UserMapper userMapper = session.getMapper(UserMapper.class);//獲限mapper接口實例
           HashMap<String, Object> map = new HashMap<String, Object>();//構造查詢條件Hashmap對象
           map.put("id", 1);
           map.put("username", "管理員");
           List<User>list = userMapper.findUserByHashmap(map);//傳遞Hashmap對象查詢用戶列表
           session.close();//關閉session
       }
 
     3、resultType(返回值類型)
      使用resultType可以進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,才可以映射成功。如果查詢出來的列名和pojo中的屬性名全部不一致,就不會創建pojo對象。但是只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
    resultType可以輸出簡單類型。例如查詢用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表才可以實現分頁。
        <!-- 獲取用戶列表總數 -->
       <select id="findUserCount" parameterType="user" resultType="int">
           select count(*) from user
         </select>
resultType可以輸出pojo對象和pojo列表。當使用動態代理時,輸出pojo對象和輸出pojo列表在xml映射文件中定義的resultType是一樣的,而生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 )。
 
        4、resultMap(輸出結果映射
    mybatis中可以使用resultMap完成高級輸出結果映射。如果查詢出來的列名和定義的pojo屬性名不一致,就可以通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。然后使用resultMap作為statement的輸出映射類型。resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
    
      <resultMap type="" id="">
         <!-- id:唯一性,注意啦,這個id用於標示這個javabean對象的唯一性, 不一定會是數據庫的主鍵(不要把它理解為數據庫對應
             表的主鍵)
           property:對應javabean的屬性名,
           column:對應數據庫表的列名
            這樣,當javabean的屬性與數據庫對應表的列名不一致的時候,就能通過指定這個保持正常映射了)
          -->
        <id property="" column=""/>
        
        <!-- result與id相比, 對應普通屬性 -->    
        <result property="" column=""/>
        
              <!--
            constructor對應javabean中的構造方法
               -->
        <constructor>
            <!-- idArg 對應構造方法中的id參數 -->
            <idArg column=""/>
            <!-- arg 對應構造方法中的普通參數 -->
            <arg column=""/>
        </constructor>
        
             <!--
            collection,對應javabean中容器類型, 是實現一對多的關鍵
            property 為javabean中容器對應字段名
            column 為體現在數據庫中列名
            ofType 就是指定javabean中容器指定的類型
             -->
        <collection property="" column="" ofType=""></collection>
        
             <!--
            association 為關聯關系,是實現N對一的關鍵。
            property 為javabean中容器對應字段名
            column 為體現在數據庫中列名
            javaType 指定關聯的類型
              -->
        <association property="" column="" javaType=""></association>
      </resultMap>
 
(二) insert、update、delete
    1、<insert
      <!--(1)id (必須配置)
        id是命名空間中的唯一標識符,可被用來代表這條語句。
        一個命名空間(namespace) 對應一個dao接口,
        這個id也應該對應dao里面的某個方法(相當於方法的實現),因此id 應該與方法名一致 
         -->
      id="addUser"
      
      <!--(2) parameterType (可選配置, 默認為mybatis自動選擇處理)
        將要傳入語句的參數的完全限定類名或別名, 如果不配置,mybatis會通過ParameterHandler 根據參數類型默認選擇合適
           的typeHandler進行處理
        parameterType 主要指定參數類型,可以是int, short, long, string等類型,也可以是復雜類型(如對象) 
         -->
      parameterType="user"
      
      <!--(3)flushCache (可選配置,默認配置為true)
        將其設置為 true,任何時候只要語句被調用,都會導致本地緩存和二級緩存都會被清空,默認值:true(對應插入、更新和
           刪除語句) 
          -->
      flushCache="true"
      
      <!--(4)statementType (可選配置,默認配置為PREPARED)
        STATEMENT,PREPARED 或 CALLABLE 的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,
           默認值:PREPARED。 
         -->
      statementType="PREPARED"
      
      <!--(5)keyProperty (可選配置, 默認為unset)
        (僅對 insert 和 update 有用)唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的                  selectKey 子元素設置它的鍵值,默認:unset。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 
         -->
      keyProperty=""
      
      <!--(6)keyColumn (可選配置)
        (僅對 insert 和 update 有用)通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當
           主鍵列不是表中的第一列的時候需要設置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。 
          -->
      keyColumn=""
      
      <!-- (7)useGeneratedKeys (可選配置, 默認為false)
        (僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數據庫內部生成的主鍵
           (比如:像 MySQL 和 SQL Server 這樣的關系數據庫管理系統的自動遞增字段),默認值:false。  
          -->
      useGeneratedKeys="false"
      
      <!--(8)timeout  (可選配置, 默認為unset, 依賴驅動)
        這個設置是在拋出異常之前,驅動程序等待數據庫返回請求結果的秒數。默認值為 unset(依賴驅動)。 
         -->
      timeout="20"
      >
  
  2、 <update
          id="updateUser"
          parameterType="user"
          flushCache="true"
          statementType="PREPARED"
          timeout="20"
         >
  3、<delete
          id="deleteUser"
          parameterType="user"
          flushCache="true"
          statementType="PREPARED"
          timeout="20"
        >
 


免責聲明!

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



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