
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