淺談Mybatis Plus的BaseMapper的方法是如何注入的
Mybatis Plus的BaseMapper的方法
我們在用的時候經常就是生產自定義的Mapper繼承自BaseMapper,然后我們就可以使用了,但是有沒想過BaseMapper里的方法是怎么被注入到mybatis里的,也沒看到什么xml啊,今天我們就來看看是怎么回事。

Mybatis Plus的初始化方法
MybatisPlusAutoConfiguration中的SqlSessionFactory
在創(chuàng)建的時候會創(chuàng)建MybatisSqlSessionFactoryBean,然后設置MybatisConfiguration作為配置類。

MybatisConfiguration是繼承自Configuration的:

自定義了一個MybatisMapperRegistry注冊器,后面會用到。

BaseMapper方法的注入的過程
MybatisSqlSessionFactoryBean的初始化后方法afterPropertiesSet調用buildSqlSessionFactory創(chuàng)建SqlSessionFactory:

其實就會去解析自定義的mapper的xml文件:


其中有個addMapper的方法,是前面MybatisConfiguration調用的。

會解析出對應的類型,然后內部調用MybatisMapperRegistry的方法:

內部最后是MybatisMapperAnnotationBuilder去解析的:

里面會進行基本的SQL方法注入:


完成每個方法的注入:

注入的實現:

其實每一個AbstractMethod的子類都會實現自己的injectMappedStatement:


最后會去枚舉類SqlMethod中獲取對應的枚舉,里面就是類似定義在xml中的信息,最后轉換為sqlSource再進行封裝:

SqlMethod 枚舉值:
public enum SqlMethod {
/**
* 插入
*/
INSERT_ONE("insert", "插入一條數據(選擇字段插入)", "<script>\nINSERT INTO %s %s VALUES %s\n</script>"),
UPSERT_ONE("upsert", "Phoenix插入一條數據(選擇字段插入)", "<script>\nUPSERT INTO %s %s VALUES %s\n</script>"),
/**
* 刪除
*/
DELETE_BY_ID("deleteById", "根據ID 刪除一條數據", "<script>\nDELETE FROM %s WHERE %s=#{%s}\n</script>"),
DELETE_BY_MAP("deleteByMap", "根據columnMap 條件刪除記錄", "<script>\nDELETE FROM %s %s\n</script>"),
DELETE("delete", "根據 entity 條件刪除記錄", "<script>\nDELETE FROM %s %s %s\n</script>"),
DELETE_BATCH_BY_IDS("deleteBatchIds", "根據ID集合,批量刪除數據", "<script>\nDELETE FROM %s WHERE %s IN (%s)\n</script>"),
/**
* 邏輯刪除
*/
LOGIC_DELETE_BY_ID("deleteById", "根據ID 邏輯刪除一條數據", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
LOGIC_DELETE_BY_MAP("deleteByMap", "根據columnMap 條件邏輯刪除記錄", "<script>\nUPDATE %s %s %s\n</script>"),
LOGIC_DELETE("delete", "根據 entity 條件邏輯刪除記錄", "<script>\nUPDATE %s %s %s %s\n</script>"),
LOGIC_DELETE_BATCH_BY_IDS("deleteBatchIds", "根據ID集合,批量邏輯刪除數據", "<script>\nUPDATE %s %s WHERE %s IN (%s) %s\n</script>"),
/**
* 修改
*/
UPDATE_BY_ID("updateById", "根據ID 選擇修改數據", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
UPDATE("update", "根據 whereEntity 條件,更新記錄", "<script>\nUPDATE %s %s %s %s\n</script>"),
/**
* 邏輯刪除 -> 修改
*/
LOGIC_UPDATE_BY_ID("updateById", "根據ID 修改數據", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),
/**
* 查詢
*/
SELECT_BY_ID("selectById", "根據ID 查詢一條數據", "SELECT %s FROM %s WHERE %s=#{%s} %s"),
SELECT_BY_MAP("selectByMap", "根據columnMap 查詢一條數據", "<script>SELECT %s FROM %s %s\n</script>"),
SELECT_BATCH_BY_IDS("selectBatchIds", "根據ID集合,批量查詢數據", "<script>SELECT %s FROM %s WHERE %s IN (%s) %s</script>"),
SELECT_ONE("selectOne", "查詢滿足條件一條數據", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
SELECT_COUNT("selectCount", "查詢滿足條件總記錄數", "<script>%s SELECT COUNT(%s) FROM %s %s %s\n</script>"),
SELECT_LIST("selectList", "查詢滿足條件所有數據", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
SELECT_PAGE("selectPage", "查詢滿足條件所有數據(并翻頁)", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
SELECT_MAPS("selectMaps", "查詢滿足條件所有數據", "<script>%s SELECT %s FROM %s %s %s\n</script>"),
SELECT_MAPS_PAGE("selectMapsPage", "查詢滿足條件所有數據(并翻頁)", "<script>\n %s SELECT %s FROM %s %s %s\n</script>"),
SELECT_OBJS("selectObjs", "查詢滿足條件所有數據", "<script>%s SELECT %s FROM %s %s %s\n</script>");
private final String method;
private final String desc;
private final String sql;
SqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
}
public String getMethod() {
return method;
}
public String getDesc() {
return desc;
}
public String getSql() {
return sql;
}
}
最終還是調用了MapperBuilderAssistant的addMappedStatement進行注冊:

總結
- 初始化注入自定義的MybatisConfiguration和MybatisMapperRegistry。
- 解析Mapper類,獲取方法對應的AbstractMethod。
- 調用各自的實現進行去SqlMethod獲取對應的枚舉,獲取到信息后進行注冊。
其實就相當于代碼里面定義了原本需要再xx.xml定義的數據,直接在代碼中獲取注入常用的CRUD操作即可。
到此這篇關于淺談Mybatis Plus的BaseMapper的方法是如何注入的的文章就介紹到這了,更多相關Mybatis Plus BaseMapper注入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用html css javascript打造自己的RIA圖文教程
用html&css&javascript打造自己的RIA之一,包括了配置等2009-07-07
Windows同時安裝兩個版本JDK并實現動態(tài)切換JAVA8或JAVA11的方法
這篇文章主要給大家介紹了關于Windows同時安裝兩個版本JDK并實現動態(tài)切換JAVA8或JAVA11的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友可以參考下2022-11-11
SpringBoot中properties,yml,yaml的區(qū)別及使用說明
這篇文章主要介紹了SpringBoot中properties,yml,yaml的區(qū)別及使用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
分析Java中ArrayList與LinkedList列表結構的源碼
這篇文章主要介紹了Java中ArrayList與LinkedList列表結構的源碼,文章最后對LinkedList和ArrayList以及Vector的特性有一個對比總結,需要的朋友可以參考下2016-05-05
Java中static與instance的區(qū)別及作用詳解
這篇文章主要為大家介紹了Java中static與instance的區(qū)別及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Java用 Rhino/Nashorn 代替第三方 JSON 轉換庫
本篇文章主要介紹了Java用 Rhino/Nashorn 代替第三方 JSON 轉換庫,非常具有實用價值,需要的朋友可以參考下2017-05-05

