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