天天看點

mybatis 批量update_MyBatis通透了解

mybatis 批量update_MyBatis通透了解
MyBatis程式設計步驟

​ 1.建立SqlSessionFactory對象

​ 2.通過SqlSessionFactory擷取SqiSession對象

​ 3.通過SQLSession對象獲得Mapper代理對象

​ 4.通過Mapper代理對象,執行資料庫操作

​ 5.執行成功,則使用SqlSession送出事務

​ 6.執行失敗,則使用SQLSession復原事務

​ 7.關閉會話

Mybatis動态SQL,動态SQL的執行原理

​ Mybatis的動态SQL,可以讓我們在XML映射檔案中,以XML标簽的形式編寫動态SQL,完成邏輯判斷和動态拼接SQL的功能。

​ 執行原理為:使用OGNL的表達式,從SQL參數對象中計算表達式的值,根據表達式的值動态拼接SQL,以此來完成動态SQL的功能。

​ 可以參考官網文檔:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

通常一個XML映射檔案都會寫一個Mapper接口對應,這個Mapper接口的工作原理,Mapper接口裡的方法,參數不同,可以重載嗎

​ Mapper接口,對應關系:

​ 1.接口的全限名,就是映射檔案中的"namespace"的值

​ 2.接口的方法名,就是映射檔案中MapperedStatement的"id"值

<resultMap id="BaseResultMap" type="com.my.blog.website.modal.Vo.AttachVo">
           

​ 3.接口方法内的參數,就是傳遞給SQL的參數

​ Mapper接口是沒有實作類的,當調用接口方法時,接口全限名+方法名拼接字元串作為key值,可唯一定為一個對應的MapperedStatement

​ 總結來說,在 Mybatis 中,每一個

<select />

<insert />

<update />

<delete />

标簽,都會被解析為一個 MappedStatement 對象。

​ 另外,Mapper 接口的實作類,通過 MyBatis 使用

JDK Proxy

自動生成其代理對象 Proxy ,而代理對象 Proxy 會攔截接口方法,進而“調用”對應的 MappedStatement 方法,最終執行 SQL ,傳回執行結果

Mapper接口綁定的實作方式

​ 1.通過XML Mapper裡面寫SQL來綁定,在這種情況下,要指定XML映射檔案裡面的"namespace"必須為接口的全路徑名。

​ 2.通過注解綁定,就是在接口的方法上加上@select,@Update,@Insert,@Delete注解,這裡面包含SQL語句綁定。

@Select("select g.*,mg.stock_count,mg.start_date,mg.end_date from miaosha_goods mg left join goods g on mg.goods_id = g.id ")
public List<GoodsVo> getGoodsVoList();
           

​ 3.是第二種的特例,也是通過

注解

綁定,在接口的方法上面加上

@SelectProvider

@UpdateProvider

@InsertProvider

@DeleteProvider

注解,通過 Java 代碼,生成對應的動态 SQL 。

MyBatis的XML Mapper檔案中,不同的XML映射檔案,id是否可以重複

​ 不同的XML Mapper檔案,如果配置了namespace,那麼id可以重複,如果沒有配置namespace,那麼id就不能重複。

​ 因為

namespace + id

是作為

Map<String, MappedStatement>

的 key 使用的

如何擷取自動生成的主鍵值
// 方式一,使用 useGeneratedKeys + keyProperty 屬性
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO person(name, pswd)
    VALUE (#{name}, #{pswd})
</insert>

// 方式二,使用 `<selectKey />` 标簽
<insert id="insert" parameterType="Person">
    <selectKey keyProperty="id" resultType="long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>

    INSERT INTO person(name, pswd)
    VALUE (#{name}, #{pswd})
</insert>
           
在Mapper中如何傳遞多個參數

​ 1.使用Map集合,裝載多個參數進行傳遞

​ 2.保持傳遞多個參數,使用@Param注解

​ 3.直接傳遞多個參數,不同@Param注解,這種方法就是按照參數在方法中的位置,從1開始,逐個不斷向下

Mybatis都有哪些Executor執行器,之間的差別是什麼

​ 1.SimpleExecutor:每執行一次update或者select,就建立一個Statement對象,用完立刻關閉Statement對象

​ 2.ReuseExecutor:執行update或者select,以SQL作為key查詢緩存中的statement對象,存在就使用,不存在就建立,用完不關閉Statement對象,而是放置于緩存Map内,用于下一次使用

​ 3.BatchStatement:執行 update 操作(沒有 select 操作,因為 JDBC 批處理不支援 select 操作),将所有 SQL 都添加到批進行中(通過 addBatch 方法),等待統一執行(使用 executeBatch 方法)。它緩存了多個 Statement 對象,每個 Statement 對象都是調用

​ 4.CachingExecutor :在上述的三個執行器之上,增加

二級緩存

的功能。

​ 通過設定

<setting name="defaultExecutorType" value="">

"value"

屬性,可傳入 SIMPLE、REUSE、BATCH 三個值,分别使用 SimpleExecutor、ReuseExecutor、BatchExecutor 執行器。

​ 通過設定

<setting name="cacheEnabled" value=""

"value"

屬性為

true

時,建立 CachingExecutor 執行器。

Mybatis如何實作批量操作

​ 1.使用批處理

private static SqlSessionFactory sqlSessionFactory;

@Test
public void testBatch() {
    // 建立要插入的使用者的名字的數組
    List<String> names = new ArrayList<>();
    names.add("占小狼");
    names.add("朱小厮");
    names.add("徐媽");
    names.add("飛哥");

    // 獲得執行器類型為 Batch 的 SqlSession 對象,并且 autoCommit = false ,禁止事務自動送出
    try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
        // 獲得 Mapper 對象
        UserMapper mapper = session.getMapper(UserMapper.class);
        // 循環插入
        for (String name : names) {
            mapper.insertUser(name);
        }
        // 送出批量操作
        session.commit();
    }
}
           

​ 2.在xml檔案中用foreach循環,就相當于insert into table(1,1) values((value,value),(value,value)),但是這種有大小限制,單條SQL不能超過語句的最大限制,預設1M.

mybatis支援一對一,一對多的關聯查詢.

具體可參考https://blog.csdn.net/xzm_rainbow/article/details/15336959

Mybatis 是如何進行分頁的?分頁插件的原理是什麼?

Mybatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結果集執行的

記憶體分頁

,而非

資料庫分頁

是以,實際場景下,不适合直接使用 MyBatis 原有的 RowBounds 對象進行分頁。而是使用如下兩種方案:

  • 在 SQL 内直接書寫帶有資料庫分頁的參數來完成資料庫分頁功能
  • 也可以使用分頁插件來完成資料庫分頁。

這兩者都是基于資料庫分頁,差别在于前者是工程師

手動

編寫分頁條件,後者是插件

自動

添加分頁條件。

可以檢視腦圖:https://github.com/zy-yz/Xmind/tree/master/src/Xmind/mybatis

繼續閱讀