Java框架之MyBatis 06-全局配置-mapper映射-分步查詢

来源:https://www.cnblogs.com/Open-ing/archive/2020/01/24/12232022.html
-Advertisement-
Play Games

MyBatis MyBatis是Apache的一個開源項目iBatis, iBatis一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。 iBatis 提供的持久層框架包括SQL Maps和Data Access Objects(DAO) Mybatis 是一個 ...


MyBatis

MyBatis是Apache的一個開源項目iBatis, iBatis一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。 iBatis  提供的持久層框架包括SQL Maps和Data Access Objects(DAO)

Mybatis 是一個 半自動的ORM(Object   Relation  Mapping)框架

sql和java編碼分開,功能邊界清晰,一個專註業務、一個專註數據

MyBatis全局配置

  MyBatis全局配置文件結構順序是規定好的,可以省略但不可顛倒位置

1)properties屬性

  既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來配置

  還可以創建一個資源文件,通過properties引入外部文件

    resource: 從類路徑下引入屬性文件

    url:  引入網路路徑或者是磁碟路徑下的屬性文件

<properties>
     <property name="driver" value="com.mysql.jdbc.Driver" />
</properties>
<!-- 引入類路徑下文件 -->
<properties resource="db.properties"></properties>

2)settings設置

  是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為

<settings>
    <!-- 映射下劃線到駝峰命名 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 設置Mybatis對null值的預設處理 -->
    <setting name="jdbcTypeForNull" value="NULL"/>
    <!-- 開啟延遲載入 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 設置載入的數據是按需還是全部 -->
    <setting name="aggressiveLazyLoading" value="false"/>    
    <!-- 配置開啟二級緩存 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

3)typeAliases 別名處理

  類型別名是為 Java 類型設置一個短的名字,可以方便我們在配置文件中其他位置引用某個類。

  很多的情況下,可以批量設置別名為這個包下的每一個類創建一個預設的別名,就是用簡單類名小寫的形式

<typeAliases>
    <package name="com.mybatis.bean"/>
</typeAliases>

MyBatis已經取好的別名

4)typeHandlers 類型處理器

  無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型

  MyBatis3.4以前的版本需要我們手動註冊這些處理器,以後的版本都是自動註冊的,所以基本不需設置

  我們也可以重寫類型處理器或創建自己的類型處理器來處理不支持的或非標準的類型

  1. 實現org.apache.ibatis.type.TypeHandler介面或者繼承org.apache.ibatis.type.BaseTypeHandler
  2. 指定其映射某個JDBC類型(可選操作)
  3. 在mybatis全局配置文件中註冊

5)objectFactory 對象工廠

6)plugins 插件機制

  我們可以通過插件來修改MyBatis的一些核心行為。插件通過動態代理機制,可以介入四大對象的任何一個方法的執行

    <plugins>
        <!-- 分頁插件 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

  四大對象

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters) 
ResultSetHandler (handleResultSets, handleOutputParameters) 
StatementHandler (prepare, parameterize, batch, update, query)

7)environments 環境配置

  MyBatis可以配置多種環境,根據需要每種環境使用一個environment標簽進行配置並指定唯一標識符

  可以通過environments標簽中的default屬性指定一個環境的標識符來快速的切換環境

  id:指定當前環境的唯一標識 transactionManager、和 dataSource 都必須有

<environments default="mysql">
    <environment id="mysql">
        <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>    

  實際開發中我們使用Spring管理數據源,併進行事務控制的配置來覆蓋上述配置

8)databaseIdProvider資料庫廠商標識

  MyBatis 可以根據不同的資料庫廠商執行不同的語句

<databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql"/>
</databaseIdProvider>

  Type: DB_VENDOR, 使用MyBatis提供的VendorDatabaseIdProvider解析資料庫廠商標識。也可以實現DatabaseIdProvider介面來自定義.

  配置了databaseIdProvider後,在SQL映射文件中的增刪改查標簽中使用databaseId來指定資料庫標識的別名

<select id="getEmployeeById"
    resultType="com.mybatis.bean.Employee" 
    databaseId="mysql">
    select * from tbl_employee where id = #{id}
</select>

  MyBatis匹配規則如下

    ①  如果沒有配置databaseIdProvider標簽,那麼databaseId=null

    ②  如果配置了databaseIdProvider標簽,使用標簽配置的name去匹配資料庫信息,匹配上設置databaseId=配置指定的值,否則依舊為null

    ③  如果databaseId不為null,他只會找到配置databaseId的sql語句

    ④  MyBatis 會載入不帶 databaseId 屬性和帶有匹配當前資料庫databaseId 屬性的所有語句。如果同時找到帶有 databaseId 和不帶databaseId 的相同語句,則後者會被捨棄。

9)mappers 映射器

  用來在mybatis初始化的時候,告訴mybatis需要引入哪些Mapper映射文件

    resource : 引入類路徑下的文件

    url : 引入網路路徑或者是磁碟路徑下的文件

           class : 引入Mapper介面

  通常情況下使用批量註冊,這種方式要求SQL映射文件名必須和介面名相同並且在同一目錄下

<mappers>
    <package name="com.mybatis.dao"/>
</mappers>

mapper 映射文件

  MyBatis 的真正強大在於它的映射語句,就是針對 SQL 語句構建的

<mapper namespace="main.mapper.BookMapper" >
</mapper>

  SQL 映射文件有很少的幾個頂級元素

    cache – 給定命名空間的緩存配置。

    cache-ref – 其他命名空間緩存配置的引用。

    resultMap – 是最複雜也是最強大的元素,用來描述如何從資料庫結果集中來載入對象。

    parameterMap – 已廢棄!老式風格的參數映射。內聯參數是首選,這個元素可能在將來被移除,這裡不會記錄。

    sql – 可被其他語句引用的可重用語句塊。

    insert – 映射插入語句

    update – 映射更新語句

    delete – 映射刪除語句

    select – 映射查詢語

MyBatis 預設不是自動提交,需手動提交:sqlSession.commit();

insert

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
  INSERT INTO users (id,username,PASSWORD) VALUES(NULL,#{username},#{password})
</insert>

delete

<delete id="deleteUser">
    DELETE FROM users WHERE id = #{id}
</delete>

update

<update id="updateUser">
    UPDATE users SET name=#{name},email=#{email} WHERE id = #{id}
</update>

select

<select id="getUserById" resultType="main.beans.User">
    SELECT id,username,`password`,`name`,email FROM users WHERE id = #{id}
</select>

主鍵生成與獲取

  資料庫分為支持主鍵自增與不支持的,mysql是支持的

    功能:插入一條新數據時,即可通過其主鍵id值立馬查詢這條數據,一般在 insert 中設置 useGeneratedKeys 為 true,返回資料庫自動生成的主鍵 id,keyColumn 用於指定資料庫table中的主鍵,keyProperty 用於指定傳入對象的成員變數。

    註意:settings 中設置為全局,在介面映射器(註解)中設置的 useGeneratedKeys 參數值將會覆蓋在settings元素中設置全局 useGeneratedKeys 參數值,xml 映射器中配置的 useGeneratedKeys參數只會對 xml 映射器產生影響 

@Options(useGeneratedKeys=true,keyProperty="userId",keyColumn="userId")

參數傳遞

     1) 單個普通類型參數

              可以接受基本類型,包裝類型,字元串類型等。這種情況MyBatis可直接使用這個參數,#{abc},大括弧內可隨便定義

     2)  多個參數

     任意多個參數,都會被MyBatis重新包裝成一個Map傳入。Map的key是param1,param2,或者0,1…, #{param1,param2}

     值就是參數的值 #{key1,key2}:獲取參數的值,預編譯到SQL中。安全。

     3) 命名參數

     為參數使用@Param起一個名字,MyBatis就會將這些參數封裝進map中,key就是我們自己指定的名字

public Employee getEmployeeById(@Param("id")Integer id);

     4) POJO

    resultType自動映射,當這些參數屬於我們業務POJO時,我們直接傳遞POJO

            autoMappingBehavior預設是PARTIAL,開啟自動映射的功能。唯一的要求是結果集列名和javaBean屬性名一致

     5) Map

   我們也可以封裝多個參數為map,直接傳遞 #{key} 直接傳入map中的key值

     1) 查詢單行數據返回Map集合

public Map<String,Object> getEmployeeByIdReturnMap(Integer id );

     2) 查詢多行數據返回Map集合

@MapKey("id") // 指定使用對象的哪個屬性來充當map的key
public Map<Integer,Employee>  getAllEmpsReturnMap();

     6) Collection/Array

 會被MyBatis封裝成一個 map 傳入, Collection 對應的 key 是 collection , Array 對應的 key 是 array . 如果確定是 List 集合,key 還可以是 list.

resultMap自定義映射

       自定義 resultMap,可以實現高級結果集的映射

     1) id :用於完成主鍵值的映射

     2) result :用於完成普通列的映射

  id、result屬性

<resultMap id="getBookById" type="main.beans.User">
    <id column="id" property="id"></id>
    <result column="username" property="username"></result>
    <result column="password" property="password"></result>
</resultMap>

   3) association :一個複雜的類型關聯,當一個對象的某個屬性是一個對象時,一般將結果包裝成此類型

      我們可以使用聯合查詢,並以級聯屬性的方式封裝對象.使用 association 標簽定義對象的封裝規則

<select id="getEmployeeAndDept" resultMap="myEmpAndDept" >
    SELECT e.id eid, e.last_name, e.email,e.gender ,d.id did, d.dept_name FROM tbl_employee e , tbl_dept d   
    WHERE e.d_id = d.id  AND e.id = #{id}
</select>
<resultMap type="com.mybatis.beans.Employee" id="myEmpAndDept">
  <id column="eid" property="id"/>
  <result column="last_name" property="lastName"/>
  <result column="email" property="email"/>
  <result column="gender" property="gender"/>
  <!-- 級聯的方式 -->
  <result column="did" property="dept.id"/>
  <result column="dept_name" property="dept.departmentName"/>
</resultMap>

    對於每個實體類都應該有具體的增刪改查方法,也就是DAO層,因此我們也可以使用 association 分步查詢

    在分步查詢的基礎上,可以使用延遲載入來提升查詢的效率,只需要在全局的 Settings 中配置

<select id="getEmployeeAndDeptStep" resultMap="myEmpAndDeptStep">
    select id, last_name, email,gender,d_id  from tbl_employee where id =#{id}
</select> 
<resultMap type="com.mybatis.beans.Employee" id="myEmpAndDeptStep">
  <id column="id"  property="id" />
  <result column="last_name" property="lastName"/>
  <result column="email" property="email"/>
  <result column="gender" property="gender"/>
  <association property="dept"             
          select="com.mybatis.dao.DepartmentMapper.getDeptById" //mapper包中定義的查詢方法全類名
                column="d_id" fetchType="eager">
  </association>
</resultMap>

   4) collection :複雜類型的集,當一個對象的某個屬性是一個集合對象時

        我們可以使用聯合查詢,並以級聯屬性的方式封裝對象.使用 collection 標簽定義對象的封裝規則

      property: 關聯的屬性名

                   ofType: 集合中元素的類型

  實際的開發中經常可以通過分步的方式完成查詢.

<select id="getDeptAndEmpsByIdStep" resultMap="myDeptAndEmpsStep">
  select id ,dept_name  from tbl_dept where id = #{id}
</select>
<resultMap type="com.mybatis.beans.Department" id="myDeptAndEmpsStep">
  <id column="id" property="id"/>
  <result column="dept_name" property="departmentName"/>
  <collection property="emps" 
               select="com.mybatis.dao.EmployeeMapper.getEmpsByDid"  //mapper包中定義的查詢方法全類名
              column="id">
  </collection>
</resultMap>

分步查詢多列值的傳遞

  如果分步查詢時,需要傳遞給調用的查詢中多個參數,則需要將多個參數封裝成 Map來進行傳遞,語法如下: {k1=v1, k2=v2....}

  在所調用的查詢方法取值時,就要參考Map的取值方式,需要嚴格的按照封裝map 時所用的key來取值.

fetchType屬性

  在<association> 和 <collection> 標簽中都可以設置 fetchType,指定本次查詢是否要使用延遲載入。預設為 fetchType=”lazy” ,如果本次的查詢不想使用延遲載入,則可設置為 fetchType=”eager”.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1:創建空的項目 創建項目可以按Ctrl+N或選擇菜單File| New,StarUML安裝打開後預設會有個空項目結構。 2:創建模板項目 可以通過選擇模板來啟動建模項目(會根據模板創建項目結構)。 要使用模板啟動項目,請從File| | New From TemplateName中選擇。 Star ...
  • 為什麼用StarUML UML建模工具比較常見的PowerDesigner ROSE StarUML starUML-開源免費(1-2百M),PowerDesigner-精細和一體化(6-7百M),ROSE-大而全(3-4百M) 看個人設計目的,starUML(http://staruml.io/) ...
  • 為什麼用UML 項目需要,在項目開發實現前期進行框架技術設計(條條大路通羅馬通羅馬,畫圖或者寫代碼都可以,適合就可以!)。 用戶的交互我們通常用Axure(原型設計)體現, 框架和功能結構設計則用UML體現,清楚自已使用目的,是否有用仁者見仁智者見智。 A:方便業務設計交流,理清思路,統一的規範描述 ...
  • 1. PreparedStatement預編譯的語句對象 預編譯語句PreparedStatement 是java.sql中的一個介面,它是Statement的子介面。通過Statement對象執行SQL語句時,需要將SQL語句發送給DBMS,由 DBMS首先進行編譯後再執行。預編譯語句和State ...
  • 1. Cookie Cookie,有時也用其複數形式Cookies,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。Cookie最早是網景公司的前雇員Lou Montulli在1993年3月的發明。Cookie是由伺服器端生成,發送給User-Agen ...
  • 在項目當中資料庫一般都會成為主要的性能與負載瓶頸,那麼針對資料庫各項性能指標的監控與對應的優化是開發與運維人員需要面對的主要工作,而且這部分的工作會貫穿項目從開發到運行的整個周期里。 這篇文章中我們對MySql資料庫中的幾個主要的性能指標的計算與統計進行下說明與總結。 在MySql中通過show g ...
  • 大數據環境需要的安裝包合集,包括: apache flume 1.7.0 bin.tar.gz apache hive 1.2.1 bin.tar.gz hadoop 2.7.2.tar.gz hbase 1.3.1 bin.tar.gz jdk 8u144 linux x64.tar kafka_ ...
  • 前言 Stanley B.Lippman 先生所著的《C++ Primer》是學習C++的一本非常優秀的教科書,但《C++ Primer》作為一本大部頭書,顯然不適合所有的初學者。所以Lippman先生又返璞歸真地寫了這本短小輕薄的《Essentia C++》。這本書以簡短的章節篇幅,幫助初學者快速... ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...