目录

MybatisPlus运行原理

前言

xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, 因为 MyBatis 最终还是需要通过 SQL 语句操作数据。

前置知识: MyBatis 源码中比较重要的一些对象, MyBatis 框架的执行流程 Configuration MappedStatement ……..

Mybatis Plus启动注入 SQL 原理分析

  1. employeeMapper 的本质 org.apache.ibatis.binding.MapperProxy

  2. MapperProxy 中 sqlSession –>SqlSessionFactory

    http://img.cana.space/picStore/20201104222443.png

  3. SqlSessionFacotry 中 → Configuration→ MappedStatements 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件 中的一个 SQL。

    MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的mappedStatements 中,启动日志如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.insert
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.delete
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.deleteByMap
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.deleteById
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.deleteBatchIds
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.update
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.updateById
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectById
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectBatchIds
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectByMap
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectOne
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectCount
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectMaps
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectMapsPage
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectObjs
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectList
    20201104 22:08:34 [main] DEBUG com.baomidou.mybatisplus.core.MybatisConfiguration - addMappedStatement: com.eh.mp.dao.UserMapper.selectPage
    
  4. 添加MappedStatement,org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement()

  5. 关键类

    • Configuration: MyBatis 或者 MP 全局配置对象

    • MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个 select/update/insert/delete 节点,主要描述的是一条 SQL 语句

    • SqlMethod : 枚举对象 ,MP 支持的 SQL 方法

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      
      /**
       * MybatisPlus 支持 SQL 方法
       *
       * @author hubin
       * @since 2016-01-23
       */
      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;
          }
           
      }
      
    • TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息

    • SqlSource: SQL 语句处理对象

    • MapperBuilderAssistant: 用于缓存、SQL 参数、查询参数集结果集处理等. 通过 MapperBuilderAssistant 将每一个 mappedStatement 添加到 configuration 中的 mappedstatements 中。