mybatis 的通用maper, 其实有很多, mybatis-plus 算是其中做的比较好的一款了. 这里就来看一下 mybatis-plus 是怎么实现这个通用mapper功能的.

一. BaseMapper

mybatis中 Mapper interface 的时候, 并没有继承什么接口. 所以想要什么方法, 得自己添加.

在mybatis-plus 中, 让 Mapper interface 继承了 BaseMapper 接口, 直接的结果, 就是 Mapper.java 多了很多方法:

  1. public interface BaseMapper<T> {
  2. /**
  3. * <p>
  4. * 插入一条记录
  5. * </p>
  6. *
  7. * @param entity 实体对象
  8. */
  9. int insert(T entity);
  10.  
  11. /**
  12. * <p>
  13. * 根据 ID 删除
  14. * </p>
  15. *
  16. * @param id 主键ID
  17. */
  18. int deleteById(Serializable id);
  19.  
  20. /**
  21. * <p>
  22. * 根据 columnMap 条件,删除记录
  23. * </p>
  24. *
  25. * @param columnMap 表字段 map 对象
  26. */
  27. int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  28.  
  29. /**
  30. * <p>
  31. * 根据 entity 条件,删除记录
  32. * </p>
  33. *
  34. * @param queryWrapper 实体对象封装操作类(可以为 null)
  35. */
  36. int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  37.  
  38. /**
  39. * <p>
  40. * 删除(根据ID 批量删除)
  41. * </p>
  42. *
  43. * @param idList 主键ID列表(不能为 null 以及 empty)
  44. */
  45. int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  46.  
  47. /**
  48. * <p>
  49. * 根据 ID 修改
  50. * </p>
  51. *
  52. * @param entity 实体对象
  53. */
  54. int updateById(@Param(Constants.ENTITY) T entity);
  55.  
  56. /**
  57. * <p>
  58. * 根据 whereEntity 条件,更新记录
  59. * </p>
  60. *
  61. * @param entity 实体对象 (set 条件值,不能为 null)
  62. * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
  63. */
  64. int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
  65.  
  66. /**
  67. * <p>
  68. * 根据 ID 查询
  69. * </p>
  70. *
  71. * @param id 主键ID
  72. */
  73. T selectById(Serializable id);
  74.  
  75. /**
  76. * <p>
  77. * 查询(根据ID 批量查询)
  78. * </p>
  79. *
  80. * @param idList 主键ID列表(不能为 null 以及 empty)
  81. */
  82. List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  83.  
  84. /**
  85. * <p>
  86. * 查询(根据 columnMap 条件)
  87. * </p>
  88. *
  89. * @param columnMap 表字段 map 对象
  90. */
  91. List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  92.  
  93. /**
  94. * <p>
  95. * 根据 entity 条件,查询一条记录
  96. * </p>
  97. *
  98. * @param queryWrapper 实体对象
  99. */
  100. T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  101.  
  102. /**
  103. * <p>
  104. * 根据 Wrapper 条件,查询总记录数
  105. * </p>
  106. *
  107. * @param queryWrapper 实体对象
  108. */
  109. Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  110.  
  111. /**
  112. * <p>
  113. * 根据 entity 条件,查询全部记录
  114. * </p>
  115. *
  116. * @param queryWrapper 实体对象封装操作类(可以为 null)
  117. */
  118. List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  119.  
  120. /**
  121. * <p>
  122. * 根据 Wrapper 条件,查询全部记录
  123. * </p>
  124. *
  125. * @param queryWrapper 实体对象封装操作类(可以为 null)
  126. */
  127. List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  128.  
  129. /**
  130. * <p>
  131. * 根据 Wrapper 条件,查询全部记录
  132. * 注意: 只返回第一个字段的值
  133. * </p>
  134. *
  135. * @param queryWrapper 实体对象封装操作类(可以为 null)
  136. */
  137. List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  138.  
  139. /**
  140. * <p>
  141. * 根据 entity 条件,查询全部记录(并翻页)
  142. * </p>
  143. *
  144. * @param page 分页查询条件(可以为 RowBounds.DEFAULT)
  145. * @param queryWrapper 实体对象封装操作类(可以为 null)
  146. */
  147. IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  148.  
  149. /**
  150. * <p>
  151. * 根据 Wrapper 条件,查询全部记录(并翻页)
  152. * </p>
  153. *
  154. * @param page 分页查询条件
  155. * @param queryWrapper 实体对象封装操作类
  156. */
  157. IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  158. }

二. MapperScan

MapperScan这块, 还是 mybatis 的功能. 对 Mapper.java 进行扫描注册 : MapperFactoryBean

具体过程见: MapperScan

三. MybatisPlusAutoConfiguration

  1. @Bean
  2. @ConditionalOnMissingBean
  3. public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  4. MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
  5. factory.setDataSource(dataSource);
  6. factory.setVfs(SpringBootVFS.class);
  7. if (StringUtils.hasText(this.properties.getConfigLocation())) {
  8. factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
  9. }
  10. applyConfiguration(factory);
  11. if (this.properties.getConfigurationProperties() != null) {
  12. factory.setConfigurationProperties(this.properties.getConfigurationProperties());
  13. }
  14. if (!ObjectUtils.isEmpty(this.interceptors)) {
  15. factory.setPlugins(this.interceptors);
  16. }
  17. if (this.databaseIdProvider != null) {
  18. factory.setDatabaseIdProvider(this.databaseIdProvider);
  19. }
  20. if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
  21. factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
  22. }
  23. // TODO 自定义枚举包
  24. if (StringUtils.hasLength(this.properties.getTypeEnumsPackage())) {
  25. factory.setTypeEnumsPackage(this.properties.getTypeEnumsPackage());
  26. }
  27. if (this.properties.getTypeAliasesSuperType() != null) {
  28. factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
  29. }
  30. if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
  31. factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
  32. }
  33. if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
  34. factory.setMapperLocations(this.properties.resolveMapperLocations());
  35. }
  36. // TODO 此处必为非 NULL
  37. GlobalConfig globalConfig = this.properties.getGlobalConfig();
  38. //注入填充器
  39. if (this.applicationContext.getBeanNamesForType(MetaObjectHandler.class,
  40. false, false).length > 0) {
  41. MetaObjectHandler metaObjectHandler = this.applicationContext.getBean(MetaObjectHandler.class);
  42. globalConfig.setMetaObjectHandler(metaObjectHandler);
  43. }
  44. //注入主键生成器
  45. if (this.applicationContext.getBeanNamesForType(IKeyGenerator.class, false,
  46. false).length > 0) {
  47. IKeyGenerator keyGenerator = this.applicationContext.getBean(IKeyGenerator.class);
  48. globalConfig.getDbConfig().setKeyGenerator(keyGenerator);
  49. }
  50. //注入sql注入器
  51. if (this.applicationContext.getBeanNamesForType(ISqlInjector.class, false,
  52. false).length > 0) {
  53. ISqlInjector iSqlInjector = this.applicationContext.getBean(ISqlInjector.class);
  54. globalConfig.setSqlInjector(iSqlInjector);
  55. }
  56. factory.setGlobalConfig(globalConfig);
  57. return factory.getObject();
  58. }
  59.  
  60. private void applyConfiguration(MybatisSqlSessionFactoryBean factory) {
  61. MybatisConfiguration configuration = this.properties.getConfiguration();
  62. if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
  63. configuration = new MybatisConfiguration();
  64. }
  65. if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
  66. for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
  67. customizer.customize(configuration);
  68. }
  69. }
  70. factory.setConfiguration(configuration);
  71. }
  72.  
  73. @Bean
  74. @ConditionalOnMissingBean
  75. public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
  76. ExecutorType executorType = this.properties.getExecutorType();
  77. if (executorType != null) {
  78. return new SqlSessionTemplate(sqlSessionFactory, executorType);
  79. } else {
  80. return new SqlSessionTemplate(sqlSessionFactory);
  81. }
  82. }

关键类对应表:

mybatis mybatis-plus
  1. SqlSessionFactoryBean
  1. MybatisSqlSessionFactoryBean
  1. Configuration
  1. MybatisConfiguration
  1. SqlSessionTemplate
  1. SqlSessionTemplate
  1. 1. MybatisSqlSessionFactoryBean 并不是 SqlSessionFactoryBean 的继承类, 他是一个新类. 其中有很多属性和方法都是从 SqlSessionFactoryBean 中拷贝过来的,然后加了一些东西.
    2. MybatisConfiguration 继承自 Configuration 类, 其中加入了一个非常重要的属性: 
  1. /**
  2. * Mapper 注册
  3. */
  4. public final MybatisMapperRegistry mybatisMapperRegistry = new MybatisMapperRegistry(this);

与之对应的是  Configuration  中的:

  1. protected final MapperRegistry mapperRegistry = new MapperRegistry(this);

mybatis-plus - MybatisPlusAutoConfiguration的更多相关文章

  1. MyBatisPlus环境下使用MyBatis的配置类

    通过@Configuration使用MyBatis配置类的资料比较少,大部分都是通过XML的形式.找了好久,最终还是通过官方的文档找到了解决方法:http://www.mybatis.org/spri ...

  2. SpirngBoot整合Mybatis Plus多数据源

    导读 有一个这样子的需求,线上正在跑的业务,由于业务发展需要,需重新开发一套新系统,等新系统开发完成后,需要无缝对接切换,当初具体设计见草图. 添加依赖 <!--lombok--> < ...

  3. mybatis plus框架的@TableField注解不生效问题总结

    一.问题描述 最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空 数据库表结构: CREATE TABLE `client_role` ( ` ...

  4. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  5. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  6. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  7. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  8. mybatis plugins实现项目【全局】读写分离

    在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...

  9. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

随机推荐

  1. 0.5 Linux的联通性命令汇总

    linux下网络端口连通性测试命令汇总 一.telnet ip port 1.1 安装: 安装telnet服务 [centos.ubuntu]安装telnet命令的方法.] yum list teln ...

  2. MySQL表名大小写敏感性

    Linux版MySQL 库名与表名是严格区分大小写的: 表的别名是严格区分大小写的: 列名与列的别名在所有的情况下均是忽略大小写的: 变量名也是严格区分大小写的: 修改步骤如下: 1. 编辑[/etc ...

  3. Android实战项目——家庭记账本(三)

    今天完成的主要内容有: 1.主页面账单明细部分细节展示 2.对每个列表项,点击打开新的可编辑修改具体页面 3.实现了搜索页面的UI布局 4.优化了部分页面的UI,提升用户视觉和使用体验 实现效果如下: ...

  4. 剑指offer-面试题38-字符串的排列-全排列

    /* 题目: 输入字符串,打印字符串的所有排列. 输入acc,输出[acc, cac, cca]. */ /* 思路: 将字符串看作两部分,第一个字符串和后面的部分. 将第一个字符串与后面字符串依次交 ...

  5. comTest.json文件中内容,被NewsList.vue文件引入

    本文目标:就是把扩散名为.json文件中数据,传递给NewsList.vue文件.主要通过导出,并传递给data(){}变紧 新建文件名为:commTest.json { "schoolNa ...

  6. 【新人赛】阿里云恶意程序检测 -- 实践记录 11.24 - word2vec模型 + xgboost

    使用word2vec训练词向量 使用word2vec无监督学习训练词向量,输入的是训练数据和测试数据,输出的是每个词的词向量,总共三百个词左右. 求和:然后再将每行数据中的每个词的词向量加和,得到每行 ...

  7. JavaSE学习笔记(2)---面向对象基础

    JavaSE学习笔记(2)---面向对象基础 1.面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能.所以面向对象 ...

  8. C#的隐式类型、匿名类型、自动属性、初始化器

    1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...

  9. Java集合之Collections 剖析

    Collections工具类位于 java.util 包下,是一个比较常用的工具类,关于这个工具类,主要介绍其在使用过程中遇到的大坑!!! [事故现场] 在实际项目开发过程中,在前人代码的基础上,对于 ...

  10. BZOJ1040: [ZJOI2008]骑士 树套环DP

    题意:一个图n个点n条边保证点能互相到达,ab有边意味着ab互相厌恶,求一个集合,使得集合里元素最多而且没有人互相厌恶 删去环上一条边树形dp,比如删掉的边连着a,b,那么先dp出不选a的最大值,再d ...