1. 程式人生 > >mybatis中***Mapper.xml對映檔案的配置細節

mybatis中***Mapper.xml對映檔案的配置細節

mapper對映檔案9大元素

對映檔案是以<mapper>作為根節點,在根節點中支援9個元素,分別為

insert、update、delete、select(增刪改查);

cache、cache-ref、resultMap、parameterMap、sql。

例子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace必須和所描述介面的全類名保持一致  -->
<mapper namespace="com.imooc.dao.MessageDao">
<!-- 
資料庫的欄位和java類的屬性對應:
      1,type就是類的全名
      2,id是配置主鍵的  result是普通鍵的 ,column是資料庫欄位名字 ,property是類屬性
 -->
  <!--  
  <resultMap type=" pojo.Message" id="MessageResult">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>
   -->
<!--
	1,select的id必須和當前接口裡面的方法名字保持一致 
	2,resultMap必須和返回結果的全類名保持一致
 -->
  <select id="selectMessage"  resultMap="  com.imooc.pojo.Message">
    select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE WHERE ID=#{id}
  </select>
</mapper>

一,resultMap 自定義結果集對映

$返回結果要麼用resultType,要麼用自定義的resultMap,二選一

resultMap中:

  • type就是類的全名,一般是一個封裝好的pojo,id就是引用這個結果集的標記
  •  id是配置主鍵的,  result是普通鍵的
  • column是資料庫欄位名字 ,property是類屬性
<!--
資料庫的欄位和java類的屬性對應:
      1,type就是類的全名
      2,id是配置主鍵的  result是普通鍵的 ,column是資料庫欄位名字 ,property是類屬性
 -->

  <resultMap type=" pojo.Message" id="MessageResult">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>
  <!--
	1,select的id必須和當前接口裡面的方法名字保持一致 
	2,resultMap必須和返回結果的全類名保持一致
 -->
  <select id="selectMessage"  resultMap="MessageResult">
    select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE WHERE ID=#{id}
  </select>
</mapper>

resultMap的關聯查詢-------association

例如:有一個員工,他有個屬性叫部門,部門會關聯一個部門表,我們希望查詢員工資訊的時候,把他部門相應的資訊也帶出來

1,級聯屬性

2,association -----關聯物件

可以指定關聯的物件(部門),然後下面的property就直接寫部門裡面的屬性

3,association -----分步查詢

select標籤可以引用其他mapper對映檔案的sql查詢語句。

4, association 之延遲載入,在上一個的基礎上,有時候我們不需要關聯出部門的資訊,全部關聯的話就會給資料庫造成負擔,如果要按需載入查詢的話,需要在mybatis的全域性配置檔案裡面加這兩個setting(懶載入和按需載入)就可以了。

* resultMap------collection巢狀結果集

1,運用場景,查詢部門,部門下有很多員工,是一個集合list,需要把所有員工資訊關聯查詢出來就可以寫collection

 

 注:得到員工的list結果集之後,然後再呼叫department類之中get方法getEmps(),將結果輸出。

結果:

2,collection-------分步查詢

介面:

sql:

sql1,按照部門id先查詢出部門資訊

sql2,按照部門id查出員工資訊list(一個部門很多員工)

 

 resultMap:select屬性為sql2的id,column為傳過來的查詢引數(部門id)

注意:當遇到多個引數需要傳遞時,可以封裝為Map,fetchType可以直接設定延遲載入

 resultMap-----dicriminator鑑別器

可以根據查詢得到的結果,判斷之後,執行不同的封裝規則,case就是一個判斷的條件,如果結果等於case的值,就執行下面的結果封裝。

二,動態sql

if  ,  foreach  ,trim  ,  choose四個標籤

1,if的用法

OGNL表示式:

 判斷和拼接:根據傳過來的條件查詢員工資訊

如果滿足test條件,就在sql上拼接上下面的語句

select * from tbl_employee where id=? and last_name like ? and email= ? and gender=?

注:如果第一個判斷沒有成功就會出現語法錯誤-------“後面開頭以and開始”

解決辦法1:在前面的sql寫成  where 1=1

解決方法2:把所有的if判斷都放在一個<where></where>標籤中(並去掉sql的where,標籤會自動加上),但是:只能解決and拼在前面,要用trim標籤

2,trim標籤

例子 :trim標籤用法

https://blog.csdn.net/wt_better/article/details/80992014

3,choose標籤的使用

具體文章:choose具體用法

 4,set標籤的使用-----由於更新,update

 

  • MyBatis在生成update語句時若使用if標籤,如果前面的if沒有執行,則可能導致有多餘逗號的錯誤。

  • 使用set標籤可以將動態的配置SET 關鍵字,和剔除追加到條件末尾的任何不相關的逗號。

沒有使用if標籤時,如果有一個引數為null,都會導致錯誤,如下示例:

        注意:set語句之後一定別忘記加逗號 

5,foreach迴圈標籤

傳過來的是一個list集合

例子,細節參考文章foreach使用

https://blog.csdn.net/qq_34107571/article/details/77834548

三,mybatis的兩個內建引數

  • _parameter
  • _databaseId

注:這兩個引數是不需要我們定義也可以直接拿來使用的。

parameter:代表整個引數,如果傳入的是單個引數或物件,那麼_parameter就可以代表這個引數或物件,如果傳入的是多

個引數,那麼_parameter代表的就是一個map(MyBatis會預設將引數封裝為map)

_datebaseId:代表我們當前使用的資料庫別名,前提是我們在全域性配置檔案裡面配置了databaseIDProvider標籤

databaseIDProvider標籤用於配置多個數據庫

具體用法見文章:mybatis內建引數詳解

https://blog.csdn.net/postersxu/article/details/79058626

四,sql標籤----抽取可重用的sql片段

<sql> 和 <include>

<sql>封裝SQL語句簡寫select 和 insert語句, <include>根據id在查詢和新增語句中呼叫<sql>標籤中的語句

<sql>標籤中的id 唯一對應<include>標籤中的refid