一、mybatis的優勢:
1. 與JDBC相比,減少了大量冗餘代碼。
2. 框架體積小,學習成本相對較低。
3. SQL語句和代碼分離,降低耦合度,管理便捷,可重用度高。
4. 推薦XML配置方式,支持動態SQL語句的編寫。
5. 提供映射標籤,支持對象與數據庫ORM字段關係映射。
二、mybatis組成:
一般包括一個接口(java文件)和一個XML(映射)文件
四、mybatis規則:
<!-- 求接口和XML文件名保持一致; -->
<!-- 要求接口中方法名與xml文件方法中的id屬性保持一致 -->
<!-- 求接口中綁定的形參和返回值變量的類型與xml文件方法中的parameterType和resultType保持一致;-->
<!-- resultType和parameterType的參數可以使用別名-->
三、常用標籤
<!-- namespace:配置在映射文件的最上端||xml文件路徑的全限定名 -->
Select:查詢
<!-- resultMap:一般用於封裝多表查詢時的結果集 -->
<!-- type:返回值的類(可用別名)-->
<!-- id:代表該po在數據庫中的主鍵 -->
<!-- column:代表sql的列名 -->
<!-- result:代表po中的屬性 -->
<!-- include:調用-->
<!-- sql:sql片段(提取出常用的sql語句、字段)-->
<!-- refid:參考的id,指向調用的sql語句id-->
<!-- #{xxx}:這表示一個佔位符(?),在select語句中通常可以爲任意字符-->
Insert:插入
<!-- insert:一般用於插入 -->
<!-- trim:格式化標記(可以完成set、where)-->
<!-- prefix、suffix:在trim標籤包裹的部分的前面或者後面添加內容-->
<!-- prefixOverrides、suffixOverrides :覆蓋“”中的內容 -->
<!-- #{xxx}:在insert語句中參數必須是po中的屬性,且有序-->
Update:更新
<!-- if:動態sql語句,意思和java中的一樣 -->
<!-- test:判斷條件-->
<!-- set:sql語句中set關鍵字-->
<!-- prefixOverrides、suffixOverrides :覆蓋“”中的內容 -->
<!-- #{xxx}:在insert語句中參數必須是po中的屬性,且有序-->
Delete:刪除
<!-- delete:sql刪除關鍵字 -->
以上爲增刪改查用到的基本語法,接下來是拓展語法。
1. <resultMap>
場景:當返回結果集中包含(一對一映射,一對多映射)時,需要通過該標籤封裝結果;
<!-- type:映射的po類全限定名(可用別名),Id:唯一標識 -->
<!-- id:映射的po類中的主鍵字段 || 聯合主鍵的配置多個 -->
<!-- column:映射字段在數據庫中對應的字段 -->
<!-- property:映射字段在po類中對應的字段 -->
<!-- association :用於一對一映射 -->
<!-- property:在order類中對應的字段 -->
<!-- javaType:po類的全限定名 -->
<!-- collection:用於一對多映射 -->
<!-- property:在order類中對應的字段 -->
<!-- ofType:po類的全限定名 -->
<!-- 除了使用po類進行映射之外,還可以通過select嵌套一個查詢,以column(關聯主鍵)給的字段作爲參數,將結果映射到teacher字段中 -->
動態sql
1.<if>
場景:當數據庫操作對變量值有一定限制時
<!-- test: 對指定屬性做出限制的條件 -->
<!-- concat:拼接模糊查詢關鍵字 -->
2. <choose>(when,otherwise)
場景:當我們僅想使用多個查詢條件中的一個。(類似java中switch)
<!-- choose: 父類標籤,無實際意義,僅僅是爲了包含多個when -->
<!-- when:當滿足test中的條件時(true),執行when中的語句並跳出choose,其餘的when條件不執行 -->
<!-- otherwise: 類似switch中的default,條件都不滿足時執行。 -->
3. <trim>
場景:多條件操作時,某些不滿足需求的條件會不執行,而條件之間的連接字符(and,or)會導致sql語法錯誤。
<!-- trim: 提供前後綴,覆蓋功能 -->
<!-- prefix: 在trim標籤包裹的部分前添加指定內容 -->
<!-- suffix: 在trim標籤包裹的部分後添加指定內容 -->
<!-- prefixOverrides: 表示移除第一個滿足條件的字段 -->
<!-- suffixOverrides : 表示移除最後一個滿足條件的字段(,)-->
4. <foreach>
場景:批量操作。常用於in後(類似java中的for循環)
<!-- in: 子查詢 -->
<!-- collection: 參數類型可以爲數組,集合以及map,當參數類型爲map時,寫入的參數需爲map中的key(map.put(“abcd”,zzzz)即寫入abcd,此時參數不可亂寫)-->
<!-- item: 表示循環體中具體對象 -->
<!-- index: 在list和數組中,index是元素的序號,在map中,index是元素的key-->
<!-- open: 表示該語句以什麼開始 -->
<!-- separator: 每次循環元素之間的分隔符 -->
<!-- close: 在trim標籤包裹的部分後添加指定內容 -->
5. <bind>
場景:預定義變量,在查詢語句中使用;
<!-- value: 預定義的值 -->
逆向工程生成代碼解析
<!-- criterion.valid: 傳入的條件有效 -->
<!-- criterion.noValue: 當條件不符合標準的時候 - -->
<!-- criterion.singleValue: 條件是一個值的時候 調用此條件 -->
<!-- "criterion.betweenValue: 條件是兩個值的時候 調用此條件 -->