淺談Mybatis Plus的BaseMapper的方法是如何註入的
Mybatis Plus的BaseMapper的方法
我們在用的時候經常就是生產自定義的Mapper繼承自BaseMapper,然後我們就可以使用瞭,但是有沒想過BaseMapper裡的方法是怎麼被註入到mybatis裡的,也沒看到什麼xml啊,今天我們就來看看是怎麼回事。
Mybatis Plus的初始化方法
MybatisPlusAutoConfiguration中的SqlSessionFactory
在創建的時候會創建MybatisSqlSessionFactoryBean,然後設置MybatisConfiguration作為配置類。
MybatisConfiguration是繼承自Configuration的:
自定義瞭一個MybatisMapperRegistry註冊器,後面會用到。
BaseMapper方法的註入的過程
MybatisSqlSessionFactoryBean的初始化後方法afterPropertiesSet調用buildSqlSessionFactory創建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註入內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- mybatis-plus中BaseMapper入門使用
- Mapper層繼承BaseMapper<T>需要引入的pom依賴方式
- MyBatis-Plus實現邏輯刪除的示例代碼
- Mybatis執行Update返回行數為負數的問題
- MyBatis-Plus實現字段自動填充功能的示例