淺談Mybatis Plus的BaseMapper的方法是如何注入的
Mybatis Plus的BaseMapper的方法
我們在用的時候經(jīng)常就是生產(chǎn)自定義的Mapper繼承自BaseMapper,然后我們就可以使用了,但是有沒想過BaseMapper里的方法是怎么被注入到mybatis里的,也沒看到什么xml啊,今天我們就來看看是怎么回事。
Mybatis Plus的初始化方法
MybatisPlusAutoConfiguration中的SqlSessionFactory
在創(chuàng)建的時候會創(chuàng)建MybatisSqlSessionFactoryBean,然后設置MybatisConfiguration作為配置類。
MybatisConfiguration是繼承自Configuration的:
自定義了一個MybatisMapperRegistry注冊器,后面會用到。
BaseMapper方法的注入的過程
MybatisSqlSessionFactoryBean的初始化后方法afterPropertiesSet調(diào)用buildSqlSessionFactory創(chuàng)建SqlSessionFactory:
其實就會去解析自定義的mapper的xml文件:
其中有個addMapper的方法,是前面MybatisConfiguration調(diào)用的。
會解析出對應的類型,然后內(nèi)部調(diào)用MybatisMapperRegistry的方法:
內(nèi)部最后是MybatisMapperAnnotationBuilder去解析的:
里面會進行基本的SQL方法注入:
完成每個方法的注入:
注入的實現(xiàn):
其實每一個AbstractMethod的子類都會實現(xiàn)自己的injectMappedStatement:
最后會去枚舉類SqlMethod中獲取對應的枚舉,里面就是類似定義在xml中的信息,最后轉換為sqlSource再進行封裝:
SqlMethod 枚舉值:
public enum SqlMethod { /** * 插入 */ INSERT_ONE("insert", "插入一條數(shù)據(jù)(選擇字段插入)", "<script>\nINSERT INTO %s %s VALUES %s\n</script>"), UPSERT_ONE("upsert", "Phoenix插入一條數(shù)據(jù)(選擇字段插入)", "<script>\nUPSERT INTO %s %s VALUES %s\n</script>"), /** * 刪除 */ DELETE_BY_ID("deleteById", "根據(jù)ID 刪除一條數(shù)據(jù)", "<script>\nDELETE FROM %s WHERE %s=#{%s}\n</script>"), DELETE_BY_MAP("deleteByMap", "根據(jù)columnMap 條件刪除記錄", "<script>\nDELETE FROM %s %s\n</script>"), DELETE("delete", "根據(jù) entity 條件刪除記錄", "<script>\nDELETE FROM %s %s %s\n</script>"), DELETE_BATCH_BY_IDS("deleteBatchIds", "根據(jù)ID集合,批量刪除數(shù)據(jù)", "<script>\nDELETE FROM %s WHERE %s IN (%s)\n</script>"), /** * 邏輯刪除 */ LOGIC_DELETE_BY_ID("deleteById", "根據(jù)ID 邏輯刪除一條數(shù)據(jù)", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"), LOGIC_DELETE_BY_MAP("deleteByMap", "根據(jù)columnMap 條件邏輯刪除記錄", "<script>\nUPDATE %s %s %s\n</script>"), LOGIC_DELETE("delete", "根據(jù) entity 條件邏輯刪除記錄", "<script>\nUPDATE %s %s %s %s\n</script>"), LOGIC_DELETE_BATCH_BY_IDS("deleteBatchIds", "根據(jù)ID集合,批量邏輯刪除數(shù)據(jù)", "<script>\nUPDATE %s %s WHERE %s IN (%s) %s\n</script>"), /** * 修改 */ UPDATE_BY_ID("updateById", "根據(jù)ID 選擇修改數(shù)據(jù)", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"), UPDATE("update", "根據(jù) whereEntity 條件,更新記錄", "<script>\nUPDATE %s %s %s %s\n</script>"), /** * 邏輯刪除 -> 修改 */ LOGIC_UPDATE_BY_ID("updateById", "根據(jù)ID 修改數(shù)據(jù)", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"), /** * 查詢 */ SELECT_BY_ID("selectById", "根據(jù)ID 查詢一條數(shù)據(jù)", "SELECT %s FROM %s WHERE %s=#{%s} %s"), SELECT_BY_MAP("selectByMap", "根據(jù)columnMap 查詢一條數(shù)據(jù)", "<script>SELECT %s FROM %s %s\n</script>"), SELECT_BATCH_BY_IDS("selectBatchIds", "根據(jù)ID集合,批量查詢數(shù)據(jù)", "<script>SELECT %s FROM %s WHERE %s IN (%s) %s</script>"), SELECT_ONE("selectOne", "查詢滿足條件一條數(shù)據(jù)", "<script>%s SELECT %s FROM %s %s %s\n</script>"), SELECT_COUNT("selectCount", "查詢滿足條件總記錄數(shù)", "<script>%s SELECT COUNT(%s) FROM %s %s %s\n</script>"), SELECT_LIST("selectList", "查詢滿足條件所有數(shù)據(jù)", "<script>%s SELECT %s FROM %s %s %s\n</script>"), SELECT_PAGE("selectPage", "查詢滿足條件所有數(shù)據(jù)(并翻頁)", "<script>%s SELECT %s FROM %s %s %s\n</script>"), SELECT_MAPS("selectMaps", "查詢滿足條件所有數(shù)據(jù)", "<script>%s SELECT %s FROM %s %s %s\n</script>"), SELECT_MAPS_PAGE("selectMapsPage", "查詢滿足條件所有數(shù)據(jù)(并翻頁)", "<script>\n %s SELECT %s FROM %s %s %s\n</script>"), SELECT_OBJS("selectObjs", "查詢滿足條件所有數(shù)據(jù)", "<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; } }
最終還是調(diào)用了MapperBuilderAssistant的addMappedStatement進行注冊:
總結
- 初始化注入自定義的MybatisConfiguration和MybatisMapperRegistry。
- 解析Mapper類,獲取方法對應的AbstractMethod。
- 調(diào)用各自的實現(xiàn)進行去SqlMethod獲取對應的枚舉,獲取到信息后進行注冊。
其實就相當于代碼里面定義了原本需要再xx.xml定義的數(shù)據(jù),直接在代碼中獲取注入常用的CRUD操作即可。
到此這篇關于淺談Mybatis Plus的BaseMapper的方法是如何注入的的文章就介紹到這了,更多相關Mybatis Plus BaseMapper注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Mybatis-Plus接口BaseMapper與Services使用詳解
- MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼
- Mapper層繼承BaseMapper<T>需要引入的pom依賴方式
- mybatis抽取基類BaseMapper增刪改查的實現(xiàn)
- mybatis-plus中BaseMapper入門使用
- MybatisPlus BaseMapper 中的方法全部 Invalid bound statement (not found Error處理)
- Mybatis-Plus BaseMapper的用法詳解
- BaseMapper接口的使用方法
相關文章
Filter、Servlet、Listener的學習_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Filter、Servlet、Listener的學習資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數(shù)限制
本文主要介紹了java中使用session監(jiān)聽實現(xiàn)同帳號登錄限制、登錄人數(shù)限制,通過session來監(jiān)聽在線人數(shù)和登陸限制,有需要的童鞋可以了解一下。2016-10-10SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳功能
MinIO是一個基于Go實現(xiàn)的高性能、兼容S3協(xié)議的對象存儲,使用MinIO構建用于機器學習,分析和應用程序數(shù)據(jù)工作負載的高性能基礎架構,這篇文章主要介紹了SpringBoot + minio實現(xiàn)分片上傳、秒傳、續(xù)傳,需要的朋友可以參考下2023-06-06ArrayList與linkedList的用法區(qū)別及擴容方式
這篇文章主要介紹了ArrayList與linkedList的用法區(qū)別及擴容方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot開發(fā)技巧啟動時配置校驗實現(xiàn)示例
這篇文章主要為大家介紹了SpringBoot開發(fā)在啟動時自動配置校驗的實現(xiàn)示例及原理解析,有需要的朋友可以借鑒參考下希望能夠有所幫助2021-10-10