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

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

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”.

 


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

更多相關文章
  • 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++》。這本書以簡短的章節篇幅,幫助初學者快速... ...
一周排行
  • 記錄LINQ學習過程。 概要 LINQ是一種“語言集成”的查詢表達式,使用LINQ可以智能提示和進行類型檢查。C#里可以編寫的LINQ查詢有SQL資料庫、XML文檔、ADO.NET數據集、支持IEnumerable和IEnumerable的對象。使用LINQ,可以簡單對數據源進行分組、排序、篩選。有 ...
  • mssql是.NET的標配,一般使用.NET的人基本都用mssql。 以前mssql只能支持windows平臺,從微軟打出 擁抱開源 的口號開始,mssql的2017 版本,開始支持linux系統。 一開始,我是直接在centos中安裝mssql的,總的來說,比windows快很多。但是現在都使用容 ...
  • 首先看 ServiceCollection 的定義 //定義 public class ServiceCollection : IServiceCollection { private readonly List<ServiceDescriptor> _descriptors = new List< ...
  • Entity Framework框架提供了幾種開發模式,比如Database First,Model First,Code First。Database First是最老也是應用得最廣泛的一種設計方式。Database First這種方式的設計高度依賴於資料庫中表的結構,根據表及表間的關係來創建模型 ...
  • 1,安裝WinccV7.4並破解: 安裝WinccV7.4SP1. 安裝授權文件---根據提示 安裝免狗驅動,根據提示 安裝SImatic.net v13.2,連接PLC, 首先在同一個區域網裡面,如果是路由器,則可以採用禁用/啟用網路的方法進行讓路由器分配IP地址. 然後在控制面版--->PG..... ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,記錄一下學習過程以備後續查用。 一、引言 今天我們要講行為型設計模式的第十一個模式--解釋器模式,也是面向對象設計模式的最後一個模式。先要說明一下,其實這個模式不是最後一個模 式(按Go ...
  • 最近在給客戶開發 Azure DevOps Exension, 該擴展中某個功能需要調用使用 .NET Core 3 寫的 Web Api。 在拜讀了 "Authenticating requests to your service" 之後,我給 Web Api 增加了 JWT 認證。 PS: 我沒 ...
  • PPT導出圖片質量太差?簡單操作直接導出印刷質地圖片 ​ PPT不僅可以用於展示文檔,還可以用於簡單圖片合成處理,同時,PPT文檔還可以全部導出為圖片. 預設情況下,PPT導出的圖片為96DPI,辛苦做的圖片無法適應很多場合的使用。其實,在windows 下只需要一個小小的設置,就可以導出300DP ...
  • 安裝JDK1.8,安裝時會安裝jdk、jre。 如果只是在IDEA中寫寫代碼,安裝完jdk,在IDEA中指定jdk路徑就可以了。 如果要在命令行下執行jdk的命令,比如java、javac,或者要使用tomcat等依賴jdk的,就需要配置jdk的環境變數。 jdk環境變數的配置 1、JAVA_HOM ...
  • (1)集群原理 在Redis集群中,所有的Redis節點彼此互聯,節點內部使用二進位協議優化傳輸速度和帶寬。 當一個節點掛掉後,集群中超過半數的節點檢測失效時才認為該節點已失效。不同於Tomcat集群 需要使用反向代理伺服器,Redis 集群中的任意節點都可以直接和Java客戶端連接。Redis 集 ...
x