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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...