MyBatis-Plus 使用这么方便,底层是如何处理的呢?

作者&投稿:江固 (若有异议请与网页底部的电邮联系)
~ MyBatis-plus是完全基于MyBatis开发的一个增强工具,是在MyBatis的基础上做增强的框架,为简化开发、提高效率而生。

它在MyBatis原本的框架上增加了很多实用性功能,比如乐观锁插件、字段自动填充功能、分页插件、条件构造器、sql 注入器等等。使用 MyBatis-plus 可以完全不写任何 XML 文件,直接使用继承了BaseMapper 接口的类对象完成对数据库的映射操作

基于映射的原理,MyBatis-plus 必然要实现 Mapper中的方法与 SQL 语句的对应转化,以下即为 MyBatis-plus 重要流程图例

1.在 MyBatis-plus 中, MybatisPlusAutoConfiguration 自动配置类的 sqlSessionFactory() 方法为 Spring提供创建 sqlSession 的工厂类对象,对 sqlSessionFactory 进行定义的定义类变为了 MybatisSqlSessionFactoryBean 。

在 sqlSessionFactory() 方法中,除了注入 MyBatis本身的组件,还会注入MyBatis-plus 的 主键生成器、SQL 注入器等组件,最后通过 MybatisSqlSessionFactoryBean#getObject() 方法获取到 sqlSessionFactory 对象

2. MybatisSqlSessionFactoryBean#getObject() 执行懒加载策略,最后通过 buildSqlSessionFactory() 方法创建 SqlSessionFactory 工厂类对象。这个方法的流程很长,不过大致可以分为两个步骤:

3. MybatisXMLConfigBuilder#parse() 会去解析配置文件,最后会调用到其内部方法 mapperElement() 。这个方法完成解析 Mapper工作,并将其添加到配置类 MybatisConfiguration 中

4. MybatisConfiguration#addMapper() 方法其实是去调用 MybatisMapperRegistry#addMapper() 方法,其核心是 MybatisMapperAnnotationBuilder#parse()

5. MybatisMapperAnnotationBuilder#parse() 方法真正开始完成 Mapper 接口中的方法与 SQL 语句的映射,其中 parseStatement() 方法是解析 @Select/@Update 等注解写入的 SQL语句,而代码 GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type ) 通过 MaBatis-plus的 SQL 注入器完成 Mapper 方法与 SQL 语句的转化

6. AbstractSqlInjector#inspectInject() 会完成 BaseMapper 接口中提供的通用方法对应的 SQL 语句准备,这部分主要通过 AbstractMethod#inject() 方法完成

7. AbstractMethod#inject() 方法并没有什么特别的操作,只是调用其子类实现 injectMappedStatement() 方法。以 SelectOne#injectMappedStatement() 为例,其 SQL 语句的核心在于 SqlMethod 类,这个枚举类中缓存了可以动态拼接的 SQL 语句脚本,只需要填上参数 format 就可以得到 SQL 语句的执行脚本。

以上过程结束,只需要将所有信息通过 addInsertMappedStatement() 方法封装成 MappedStatement 对象并将其加入到容器中,这样 Mapper接口方法调用时,就可以通过 动态代理 的方式找到其对应执行的 SQL 脚本,至此 SQL 语句准备及配置解析就完成了。

最后拼接的 SQL 语句 脚本形式如下示例,实际执行数据库操作时会解析这个脚本完成变量替换,从而得到可执行的 SQL 语句

8. SqlSessionFactory 对象的创建需要回到 MybatisSqlSessionFactoryBean#buildSqlSessionFactory() 方法中,很容易追踪到 MybatisSqlSessionFactoryBuilder#build() 方法,最后其实是通过 SqlSessionFactoryBuilder#build() 方法创建了一个 DefaultSqlSessionFactory 对象返回

1. @MapperScan 注解通过 @Import(MapperScannerRegistrar.class) 引入扫描注册的类 MapperScannerRegistrar ,该类实现了 ImportBeanDefinitionRegistrar 接口并重写 registerBeanDefinitions() 方法,在该方法中注册了 MapperScannerConfigurer 类

2. MapperScannerConfigurer 是 Mapper接口的扫描配置类,实现了 BeanDefinitionRegistryPostProcessor 接口,其 postProcessBeanDefinitionRegistry() 方法会在容器启动过程中被回调,通过 ClassPathMapperScanner#scan() 方法完成 Mapper 的扫描注册

3. ClassPathMapperScanner#processBeanDefinitions() 将扫描到的 Mapper接口生成的对应 BeanDefinition 的 beanClass 属性替换为 MapperFactoryBean ,这样每次获取 Mapper 实例实际是通过 MapperFactoryBean 的实例去获取

此处体现了 FactoryBean 的定位,即用于获取同一类 bean 的工厂 bean。

4. @Autowired 自动注入 Mapper 触发容器获取 bean 的方法,调用到 MapperFactoryBean#getObject() 方法,最终调用到 sqlSessionTemplate#getMapper() 方法

5.MyBatis-plus 使用的配置类是 MybatisConfiguration ,最终调用到 MybatisMapperRegistry#getMapper() 方法,这里就进入了动态代理获取 MapperProxy 实例的流程

6. MybatisMapperProxyFactory#newInstance() 方法给自动注入返回一个 MybatisMapperProxy 代理对象

7.调用 Mapper 接口的方法触发代理对象的 MybatisMapperProxy#invoke() ,此时根据 Mapper 对象被调用的方法生成 MybatisMapperMethod 对象,通过 MybatisMapperMethod#execute() 去真正地执行 SQL 语句,从而完成数据库操作。


简历上的项目描述(JAVA)怎么写
4.熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的核心API,对Hibernate的关联映射、继承映射、组件映射、缓存机制、事务管理以及性能调优等有深入的理解。 5.熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)...

java工程师面试时最看重的是什么?
熟练的使用HTML、CSS和JavaScript进行Web前端开发,熟悉jQuery和Bootstrap,对Ajax技术在Web项目中的应用有深入理解,有使用前端MVC框架(AngularJS)和JavaScript模板引擎(HandleBars)进行项目开发的经验。 熟悉常用的关系型数据库产品(MySQL、Oracle),熟练的使用SQL和PL\/SQL进行数据库编程。 熟悉面向对象的设计原则,对GoF设计模...

面试的窍门是什么?面试时,企业最看重的是什么?
对Spring的IoC容器和AOP原理有深入了解,熟练的运用Spring框架管理各种Web元件及其依赖关系,熟练的使用Spring进行事务、日志、安全性等的管理,有使用SpringMVC作为表示层技术以及使用Spring提供的持久化支援进行Web专案开发的经验,熟悉Spring对其他框架的整合。 熟练的使用Hibernate、MyBatis等ORM框架,熟悉Hibernate和MyBatis的...

学习Java软件工程师未来有哪些就业方向?
Java开发的就业方向一:Java企业级应用开发目前Java在许多行业的企业信息应用方面的应用非常多,比如OA、邮箱、股票、金融、考试、物流、医疗、矿山等信息方面的系统。该方向和行业密切相关,所以,这是一个经验型的发展方向。Java开发者在这方面的需求也非常大,待遇也相当不错,有三到五年工作经验的年薪在...

面试的窍门是什么?面试时,企业最看重的是什么?
(面向切面程式设计)技术; L目前广泛使用的有memcached和Redis; M的选择方案很多,最有可能的是hibernate和MyBatis,也可以两种技术同时运用,但通常是将增删改交给hibernate来处理,而复杂的查询则由MyBatis完成,此外TopLink、jOOQ也是优秀的持久层解决方案; N底层的资料存取传统上是使用关系型资料库,可以是MySQL、Oracle...

措勤县15594534837: mybatis plus怎么使用 -
訾卓枯草: IntelliJ idea 发工具相关资料少加家入手难度今mybatis插件安装做示例能于已经用值提于我些资般刚始使用我想些帮助 安装步骤: 一.载插件 mybatis 插件 插件载完毕存放指定位置文件名默认应该:mybatis-plus.jar 二.打Intellij idea工具打菜单 File --> settings 选择 Plugs点击Install plug from disk选择刚刚载插件jar文件确认直接显示mybatis插件其信息表示安装功 三.插件安装打settings,Mybatis

措勤县15594534837: Idea怎么安装Mybatis Generator插件 -
訾卓枯草: mybatis generator插件安装方法 1、首先解压文件,然后将其中的“features”文件夹和“plugins”文件夹复制到eclipse的安装目录. 2、然后打开我们的eclipse,点击file,选择new,然后找到其中的other,点击. 3、然后选择我们的插件

措勤县15594534837: mybatis plugin 怎么用 -
訾卓枯草: mybatis支持插件来插入自定制的处理过程,所有的plugin都需实现Interceptor接口,自定制的处理过程可以在Executor,ParameterHandler,ResultSetHandler,StatementHandler四个处理过程中插入,原理是在使用这四中类型处理数据的时候使用的都是经过plugin处理过的代理对象.同一个处理过程支持配置多个plugin,则plugin的执行顺序是根据包装的顺序,从最外部向内部执行,直到执行到目标对象的调用方法.包装的顺序是根据配置顺序,也就是说配置越靠前,包装的越深,越后执行

措勤县15594534837: 如何优雅的使用mybatis -
訾卓枯草: mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置.当然mybatis也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和dao层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了,自动管理dao层和配置文件等,发展到最顶端就是今天要讲的这种模式了,mybatis-spring-boot-starter就是springboot+mybatis可以完全注解不用配置文件,也可以简单配置轻松上手.

措勤县15594534837: 使用mybatis怎么自动映射 -
訾卓枯草: mybatis本来就配置文件比较少,就配置一个实体映射文件,对应实体字段和数据库的匹配可以选择mybatis自动匹配,可以节约大量代码和时间,再来就只有写xml的数据库语句

措勤县15594534837: mybatis的jdbctype和javatype什么时候用怎么用 -
訾卓枯草: 使用MyBatis框架做更新操作时,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType.至于什么时候要使用到javaType我还没遇到过,而且我也没有听说过要使用javaType.

措勤县15594534837: 利用mybatis自动生成代码后,怎么使用这些代码实例 -
訾卓枯草: MyBatis中,可以使用Generator自动生成代码,包括DAO层、 MODEL层 、MAPPING SQL映射文件. 第一步:下载MyBatis的Generator工具 htt p:/ /mybati s.gith ub.i o/generator/ 第二步:配置自动生成代码所需的XML配置文件,例如(...

措勤县15594534837: “mybatis”中怎么执行“truncate”? -
訾卓枯草: mybaits是对jdbc的封装,一样可以执行sql语句,而truncate也算sql语句,所以直接写sql语句配置在mapper.xml中,再用你惯用额方式调用即可.1:在Mybatis配置文件中加上以下配置: <!-- 选择log4j为Mybatis的记录日志文件--> <settings> ...

措勤县15594534837: mybatis sql语句怎么使用&apos -
訾卓枯草: 配置showsql=true 在log4j.properties 添加 log4j.rootLogger=DEBUG, Console MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github.iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

措勤县15594534837: mybatis怎么用list集合 -
訾卓枯草: select * from student 这是mybatis的sqlmap映射文件配置sql的语句.接收的时候直接是public listselectall() { sqlsession session = sqlsessionfactory.opensession(); list list = session.selectlist("selectall"); return list; } 这是dao层的方法,就可以返回list集合了.希望能帮到你!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网