Mybatis學習-映射關係標籤篇

mybatis的真正的核心在映射文件中,比直接使用 JDBC 節省95%的代碼。而且將 SQL 語句獨立在 Java 代碼之外,可以進行更爲細緻的 SQL 優化


                                                                                                                                                                                                                                                                       

 

一、 映射文件的頂級元素

  • select:映射查詢語句
  • insert映射插入語句
  • update:映射更新語句
  • delete:映射刪除語句
  • sql:可以重用的sql代碼塊
  • resultMap:最複雜,最有力量的元素,用來描述如何從數據庫結果集中加載你的對象
  • cache:配置給定命名空間的緩存
  • cache-ref:從其他命名空間引用緩存配置
二、select 標籤的屬性信息

<select
  <!--
    1. id(必須配置)
    id是命名空間中的唯一標識符,可被用來代表這條語句
    一個命名空間(namespace)對應一個dao接口
    這個id也應該對應dao裏面的某個方法(sql相當於方法的實現),因此id應該與方法名一致
   -->
  id="selectUser"

  <!--
    2. parapeterType(可選配置,默認由mybatis自動選擇處理)
    將要傳入語句的參數的完全限定名或別名,如果不配置,mybatis會通過ParamterHandler根據參數類型默認選擇合適的typeHandler進行處理
    paramterType 主要指定參數類型,可以是int, short, long, string等類型,也可以是複雜類型(如對象)
   -->
  parapeterType="int"

  <!--
    3. resultType(resultType 與 resultMap 二選一配置)
    用來指定返回類型,指定的類型可以是基本類型,也可以是java容器,也可以是javabean
   -->
  resultType="hashmap"
  
  <!--
    4. resultMap(resultType 與 resultMap 二選一配置)
    用於引用我們通過 resultMap 標籤定義的映射類型,這也是mybatis組件高級複雜映射的關鍵
   -->
  resultMap="USER_RESULT_MAP"
  
  <!--
    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, PrearedStatement或CallableStatement,默認值:PREPARED
   -->
  statementType="PREPARED"

  <!--
    10. resultSetType(可選配置)
    FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個,默認值爲:unset(依賴驅動)
   -->
  resultSetType="FORWORD_ONLY"></select>
三、resultMap 標籤的屬性信息

<!-- 
  1. type 對應的返回類型,可以是javabean, 也可以是其它
  2. id 必須唯一, 用於標示這個resultMap的唯一性,在使用resultMap的時候,就是通過id引用
  3. extends 繼承其他resultMap標籤
 -->
<resultMap type="" id="" extends="">  
  <!-- 
    1. id 唯一性,注意啦,這個id用於標示這個javabean對象的唯一性, 不一定會是數據庫的主鍵(不要把它理解爲數據庫對應表的主鍵)
    2. property 屬性對應javabean的屬性名
    3. column 對應數據庫表的列名
       (這樣,當javabean的屬性與數據庫對應表的列名不一致的時候,就能通過指定這個保持正常映射了)
   -->
  <id property="" column=""/>
        
  <!-- 
    result 與id相比,對應普通屬性
   -->    
  <result property="" column=""/>
        
  <!-- 
    constructor 對應javabean中的構造方法
   -->
  <constructor>
    <!-- idArg 對應構造方法中的id參數 -->
       <idArg column=""/>
       <!-- arg 對應構造方法中的普通參數 -->
       <arg column=""/>
   </constructor>
   
   <!-- 
    collection 爲關聯關係,是實現一對多的關鍵 
    1. property 爲javabean中容器對應字段名
    2. ofType 指定集合中元素的對象類型
    3. select 使用另一個查詢封裝的結果
    4. column 爲數據庫中的列名,與select配合使用
    -->
  <collection property="" column="" ofType="" select="">
    <!-- 
      當使用select屬性時,無需下面的配置
     -->
    <id property="" column=""/>
    <result property="" column=""/>
  </collection>
        
  <!-- 
    association 爲關聯關係,是實現一對一的關鍵
    1. property 爲javabean中容器對應字段名
    2. javaType 指定關聯的類型,當使用select屬性時,無需指定關聯的類型
    3. select 使用另一個select查詢封裝的結果
    4. column 爲數據庫中的列名,與select配合使用
   -->
  <association property="" column="" javaType="" select="">
    <!-- 
      使用select屬性時,無需下面的配置
     -->
    <id property="" column=""/>
    <result property="" column=""/>
  </association>
</resultMap>
四、insert 標籤的屬性信息

<insert
  <!--
    同 select 標籤
   -->
  id="insertProject"

  <!-- 
    同 select 標籤
   -->
  paramterType="projectInfo"
  
  <!-- 
    1. useGeneratedKeys(可選配置,與 keyProperty 相配合)
    設置爲true,並將 keyProperty 屬性設爲數據庫主鍵對應的實體對象的屬性名稱
   --> 
  useGeneratedKeys="true"

  <!-- 
    2. keyProperty(可選配置,與 useGeneratedKeys 相配合)
    用於獲取數據庫自動生成的主鍵
   -->
  keyProperty="projectId"
>

五、重用 sql 標籤

<sql id="userColumns">id,username,password</sql>

這個 SQL 片段可以被包含在其他語句中,eg:
<select id="selectProjectList" paramertType="int" resultType="hashmap">
  SELECT 
      <include refid="userColumns"/>
  FROM 
      t_project_002_project_info
</select>

六、完全限定名使用別名替代

在 mybatis 配置文件中,使用如下配置

<typeAliases>
    <typeAlias type="com.enh.bean.ProjectInfo" alias="projectInfo"/>
</typeAliases>

那麼在 Mapper 中,可以直接使用 projectInfo,即表示 com.enh.bean.ProjectInfo

七、命名空間

每個sql映射文件的要元素中,都需要指定一個名稱空間,用以確保每個映射語句的id屬性不會重複。如

<mapper namespace="com.enh.mapper.PersonMapper">

在Java代碼中引用某個 sql 映射時,使用的亦是含有名稱空間的全路徑。如

session.update("com.enh.mapper.PersonMapper.udpateUser", user);  





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章