mybatis-plus底层原理
- 格式:doc
- 大小:10.84 KB
- 文档页数:2
mybatis-plus tablename 注解原理MyBatis-Plus是一款优秀的MyBatis增强工具,它提供了许多方便的注解和功能,其中包括支持在实体类上使用 tableName 注解指定表名。
这个注解的原理和应用场景将在本文中进行详细介绍。
一、原理概述MyBatis-Plus的 tableName 注解允许开发者在实体类上指定一个字符串值,这个值将被用作该实体类对应的数据库表名。
这是通过MyBatis-Plus的拦截器机制实现的,当Mapper扫描到对应的实体类时,拦截器会自动解析出该类对应的表名。
二、工作原理1. 实体类定义:在定义实体类时,通过使用 MyBatis-Plus 的 @Entity 注解标记该类为一个实体类,并使用 @TableName 注解指定表名。
2. 拦截器机制:MyBatis-Plus 通过在运行时拦截 Mapper 的方法调用,解析出实体类信息。
当 Mapper 扫描到对应的实体类时,拦截器会自动获取该类的表名信息。
3. 动态SQL生成:MyBatis-Plus 使用反射机制动态生成 SQL 语句,其中包括根据实体类的属性和表名生成的 SQL 语句。
这些语句可以在 SqlSession 中执行,或者通过 MyBatis 的映射文件进行映射。
三、应用场景tableName 注解在很多场景下都非常有用,例如:1. 跨库查询:当一个实体类同时存在于多个数据库中时,可以使用tableName 注解指定具体的表名,避免歧义和混淆。
2. 表迁移:在数据库迁移过程中,可能需要将一个实体类的表从一个数据库迁移到另一个数据库。
通过 tableName 注解,可以轻松地指定迁移后的表名。
3. 分表分库查询:当数据库按照某种规则进行分表或分库时,可以通过tableName 注解指定具体的表名,实现按表查询和分页等功能。
四、注意事项在使用 tableName 注解时,需要注意以下几点:1. 表名必须唯一:同一个实体类只能有一个表名,否则会导致歧义和混淆。
MyBatis-Plus分页插件——PageHelper和IPage原理介绍两个都⽤于分页,常⽤的应该是PageHelper了,理解了⼀下源码后发现IPage⽐PageHelper好⽤。
使⽤⽅法是 PageHelper.startPage()然后后边写sql就可以。
紧接着的⼀个sql起作⽤。
IPage则需要在dao层传⼊IPage的实现类Page对象,该对象实现了IPage。
区别:PageHelper内部原理是将传⼊的页码和条数赋值给了Page对象,保存到了⼀个本地线程ThreadLoacl中,然后会进⼊Mybatis的拦截器中。
然后再拦截器中获取本地线程中保存的分页的参数。
最后再将这些分页参数和原本的sql以及内部定义好的sql进⾏拼接完成sql的分页处理。
中间会进⾏判断该sql 的类型是查询还是修改操作。
如果是查询才会进⼊分页的逻辑并判断封装好的Page对象是否是nullnull则不分页,否则分页。
IPage内部原理也是基于拦截器,但是这个拦截的是⽅法以及⽅法中的参数,这个也会判断是否是查询操作。
如果是查询操作,才会进⼊分页的处理逻辑。
进⼊分页逻辑处理后,拦截器会通过反射获取该⽅法的参数进⾏判断是否存在IPage对象的实现类。
如果不存在则不进⾏分页,存在则将该参数赋值给IPage对象。
然后进⾏拼接sql的处理完成分页操作。
但是使⽤IPage需要注⼊⼀个bean拦截器交给spring进⾏管理。
如下。
否则不会进⾏拦截。
@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}pom: springboot使⽤的是2.1.0<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus.version}</version><!-- 3.2.0 --><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></exclusion></exclusions></dependency>IPage的好处:适⽤于多⽅⾔的数据库类型;例如 MySQL、Oracle、SqlServer等。
MyBatisPlus插件机制与执⾏流程原理分析详解MyBatis Plus插件MyBatis Plus提供了分页插件PaginationInterceptor、执⾏分析插件SqlExplainInterceptor、性能分析插件PerformanceInterceptor以及乐观锁插件OptimisticLockerInterceptor。
Mybatis 通过插件 (Interceptor) 可以做到拦截四⼤对象相关⽅法的执⾏ ,根据需求完成相关数据的动态改变。
四⼤对象是:ExecutorStatementHandlerParameterHandlerResultSetHandler四⼤对象的每个对象在创建时,都会执⾏interceptorChain.pluginAll(),会经过每个插件对象的 plugin()⽅法,⽬的是为当前的四⼤对象创建代理。
代理对象就可以拦截到四⼤对象相关⽅法的执⾏,因为要执⾏四⼤对象的⽅法需要经过代理。
① xml下插件的配置如下所⽰:<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"><!-- 数据源 --><property name="dataSource" ref="dataSource"></property><property name="configLocation" value="classpath:mybatis-config.xml"></property><!-- 别名处理 --><property name="typeAliasesPackage" value="com.jane.mp.beans"></property><!-- 注⼊全局MP策略配置 --><property name="globalConfig" ref="globalConfiguration"></property><!-- 插件注册 --><property name="plugins"><list><!-- 注册分页插件 --><bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor"></bean><!-- 注册执⾏分析插件 --><bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor"><property name="stopProceed" value="true"></property></bean><!-- 注册性能分析插件 --><bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"><property name="format" value="true"></property><!-- <property name="maxTime" value="5"></property> --></bean><!-- 注册乐观锁插件 --><bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor"></bean></list></property></bean>② springboot下注册插件这⾥以分页插件为例:@Bean public PaginationInterceptor paginationInterceptor(){PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页⾯⼤于最⼤页后操作, true调回到⾸页,false 继续请求默认false// paginationInterceptor.setOverflow(false);// 设置最⼤单页限制数量,默认 500 条,-1 不受限制// paginationInterceptor.setLimit(500);// 开启 count 的 join 优化,只针对部分 left joinpaginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));return paginationInterceptor;}③ SqlExplainInterceptorSQL执⾏分析拦截器,全类名是com.baomidou.mybatisplus.plugins.SqlExplainInterceptor,只⽀持 MySQL5.6.3以上版本。
mybatis plus saveorupdate实现原理MyBatisPlus是一款基于MyBatis的增强工具,提供了许多方便的CRUD操作。
其中,SaveOrUpdate方法是一个非常常用的功能,用于实现数据的增删改操作。
本文将介绍MyBatisPlusSaveOrUpdate实现原理,帮助读者更好地理解和使用该方法。
一、SaveOrUpdate方法简介SaveOrUpdate方法是MyBatisPlus提供的一个便捷方法,用于将一条数据插入或更新到数据库中。
该方法接收一个参数,即待插入或更新的数据对象。
如果该数据对象已经存在于数据库中,则更新该数据;如果不存在,则将其插入到数据库中。
二、实现原理1.判断数据对象是否为空在SaveOrUpdate方法中,首先需要判断传入的数据对象是否为空。
如果为空,则直接抛出异常;如果不为空,则进行下一步操作。
2.解析SQL语句MyBatisPlus通过XML或注解的方式配置SQL语句,SaveOrUpdate方法会根据传入的数据对象自动生成对应的SQL语句。
具体来说,会根据数据对象的字段和数据库表结构,生成对应的INSERT或UPDATE语句。
3.执行SQL语句生成SQL语句后,MyBatisPlus会通过MyBatis的执行机制,将SQL语句发送到数据库执行。
具体来说,会通过SqlSession执行器执行该SQL语句,并将结果返回给调用者。
4.事务处理在执行SQL语句的过程中,可能会涉及到多个数据库操作,因此需要使用事务进行处理。
MyBatisPlus会自动开启事务,并在操作完成后提交事务,以保证数据的一致性。
三、注意事项1.数据库表结构匹配为了保证SaveOrUpdate方法的正确性,需要确保数据库表结构和数据对象的字段匹配。
否则,可能会出现插入失败或更新错误的情况。
2.数据对象唯一性约束如果数据对象的某个字段具有唯一性约束(如主键),则需要在SQL语句中添加相应的约束条件,以确保插入或更新操作的正确性。
mybatis-plus-boot-starter原理MyBatis-Plus 是MyBatis 的增强工具,它简化了MyBatis 的开发,并提供了一些额外的功能。
`mybatis-plus-boot-starter` 是MyBatis-Plus 的Spring Boot Starter 模块,它为Spring Boot 项目集成MyBatis-Plus 提供了便利。
下面是`mybatis-plus-boot-starter` 的一些原理和关键特点:1. 自动配置: `mybatis-plus-boot-starter` 提供了自动配置,可以根据项目中的配置以及classpath 下的配置文件,自动配置MyBatis-Plus 的相关组件。
这样,开发者可以更方便地集成MyBatis-Plus,无需手动配置一些繁琐的内容。
2. 代码生成器: MyBatis-Plus 提供了一个代码生成器工具,能够根据数据库表生成实体类、Mapper 接口以及相关的XML 文件。
`mybatis-plus-boot-starter` 会自动配置这个代码生成器,使得开发者可以通过简单的配置来生成代码,减少手动编写的工作量。
3. 通用CRUD 方法: MyBatis-Plus 提供了一组通用的CRUD(Create, Read, Update, Delete)方法,可以通过简单的API 调用完成常见的数据库操作。
`mybatis-plus-boot-starter` 会自动配置这些通用方法,开发者无需手动编写这些基本的CRUD 操作。
4. 分页插件: MyBatis-Plus 集成了分页插件,可以方便地进行分页查询。
`mybatis-plus-boot-starter` 会自动配置这个分页插件,使得开发者可以通过简单的方法实现分页查询。
5. Wrapper 查询: MyBatis-Plus 提供了一种灵活的条件查询方式,称为Wrapper 查询,可以通过构建条件对象进行复杂的查询。
mybatis 底层原理MyBatis 底层原理解析介绍本文将深入解析 MyBatis 的底层原理,帮助读者理解 MyBatis 是如何工作的,以及它在数据访问层面的实现机制。
数据库连接•MyBatis 通过 JDBC(Java Database Connectivity)与数据库建立连接。
它使用 JDBC 的标准 API 进行数据库操作。
•JDBC 提供了一组接口,供 Java 程序和各种数据库进行交互。
•MyBatis 使用 JDBC 的 DataSource 接口实现连接池技术,通过连接池可以有效地管理多个数据库连接。
SQL 语句解析与封装•MyBatis 使用 SQL 语句与数据库进行交互。
•SQL 语句可以直接写在映射文件中,也可以通过注解方式写在Java 代码中。
•MyBatis 使用 ANTLR(Another Tool for Language Recognition)解析 SQL 语句,并将其转换为抽象语法树(AST)。
•AST 是一种以树形结构表示源代码的一种数据结构。
MyBatis 将SQL 语句解析后的 AST 封装为一个 MappedStatement 对象。
参数处理•MyBatis 能够处理不同类型的参数,包括基本类型、JavaBean、Map 等。
•参数处理分为两个阶段:静态参数解析(compile-time)和动态参数解析(runtime)。
•在静态参数解析阶段,MyBatis 会对参数进行类型检查和属性解析等操作。
•在动态参数解析阶段,MyBatis 根据参数的属性值判断是否需要生成动态 SQL 语句。
SQL 语句执行•在执行 SQL 语句之前,MyBatis 会先通过 ExecutorBuilder 创建一个 Executor 对象。
•Executor 是 MyBatis 中执行 SQL 语句的核心组件。
•Executor 负责处理 SQL 语句的执行过程,包括语句的预编译、参数绑定、结果集处理等操作。
mybatis-plus 原理MyBatis-Plus 是 MyBatis 的增强工具库,它简化了 MyBatis 的开发,提供了一系列增强功能和便捷的 API,使得数据访问层的开发更加高效和易用。
MyBatis-Plus 的原理主要包括以下几个方面:1. 代码生成器:MyBatis-Plus 提供了一个代码生成器,能够根据数据库表结构自动生成 Java 实体类、Mapper 接口以及 XML 映射文件。
代码生成器大大减少了手动编写重复代码的工作量,提高了开发效率。
2. CRUD 方法封装:MyBatis-Plus 封装了常用的 CRUD(增删改查)操作,如`selectById`、`selectList`、`insert`、`updateById`、`deleteById` 等。
这些方法不仅简化了代码,还通过泛型支持了通用的 CRUD 操作,无需手动编写 SQL。
3. 条件构造器:MyBatis-Plus 引入了 `Wrapper` 条件构造器的概念,用于构建动态SQL 查询条件。
通过 `Wrapper`,可以更加灵活地拼接查询条件,支持链式调用和各种逻辑操作。
4. 分页插件:MyBatis-Plus 提供了分页插件,支持多种数据库的分页查询。
开发者只需简单配置分页参数,MyBatis-Plus 就能自动处理分页查询,并返回分页结果。
5. 主键策略:MyBatis-Plus 支持多种主键策略,可以通过注解或全局配置来指定主键生成方式,包括自增主键、UUID、雪花算法等。
6. 元对象和元注解:MyBatis-Plus 引入了元对象的概念,用于在运行时记录实体对象的元信息。
同时,它还提供了元注解,用于更加灵活地配置实体对象与数据库表之间的映射关系。
7. 性能优化:MyBatis-Plus 在某些情况下能够对 SQL 进行改写和优化,以提升数据库查询性能。
MyBatis-Plus 并不是替代 MyBatis,而是在 MyBatis 的基础上提供了更多便捷和增强功能。
MyBatis-Plus是一款强大的MyBatis扩展插件,它提供了很多实用的功能,包括但不限于简化SQL语句的生成、自动映射、乐观锁、分页等。
在MyBatis-Plus中,JoinSqlBuilder是用于生成join sql的类,其内部实现原理如下:
1. 收集关联信息:首先,从Mapper接口或者XML文件中解析出需要关联的属性,包括外键、关联表、关联字段等信息。
这些信息将被用于后面的SQL语句生成。
2. 构建查询条件:根据要查询的主表和关联表,以及给定的条件(如where、order by等),构建查询条件。
查询条件可能包括主表和关联表的字段,也可能包括一些常量或函数。
3. 生成join语句:使用收集到的关联信息和查询条件,生成join SQL语句。
生成的SQL语句可能会包含多个join,例如cross join、natural join、inner join或left join等。
4. 处理特殊情况:MyBatis-Plus对一些特殊情况进行了处理,例如在join语句中使用函数或者常量、使用子查询等。
这些特殊情况下生成的SQL语句可能会与常规的SQL语句略有不同。
5. 格式化SQL语句:最后,会对生成的SQL语句进行格式化,包括添加必要的空格、换行符等,以保证生成的SQL语句在执行时可以正确执行。
需要注意的是,JoinSqlBuilder最终生成的SQL语句并不完全由
MyBatis-Plus控制,它依赖于数据库的类型和版本等因素。
因此,在实际使用中,可能需要根据具体的数据库进行调整和优化。
+ mybatis-plus 批量插入原理MyBatis-Plus 是一个基于 MyBatis 的增强工具,它封装了一些常用的操作,如分页、删除、更新等。
批量插入是 MyBatis-Plus 提供的另一个比较常用的功能,它可以大大提高数据插入的效率。
下面我将介绍 MyBatis-Plus 批量插入的原理以及使用方式。
一、MyBatis-Plus 批量插入原理在 MyBatis-Plus 中,批量插入使用的是 JDBC 的批处理方式,即将多条 SQL 语句打包发送给数据库一次性执行,这种方式可以减少数据库与应用之间的网络传输次数,提高数据插入的效率。
具体实现方式如下:1. 使用 PreparedStatement 对象预编译插入语句;2. 使用 addBatch() 方法向批处理列表中添加 SQL 语句;3. 调用 executeBatch() 方法批量执行所有添加的 SQL 语句;4. 使用 clearBatch() 方法清空批处理列表中的 SQL 语句。
MyBatis-Plus 封装了以上的操作,在插入多条数据时,会自动根据数据库类型生成对应的批量插入语句,然后使用 JDBC 的批处理方式执行 SQL 语句,从而实现批量插入的功能。
二、MyBatis-Plus 批量插入使用方法MyBatis-Plus 提供了两种方式实现批量插入,一种是使用自动生成的 SQL,另一种是使用自定义的 SQL。
下面我将分别介绍这两种方式的使用方法。
1. 自动生成 SQL使用自动生成的 SQL 可以让 MyBatis-Plus 根据实体类的属性自动生成插入语句,从而简化操作。
具体使用方法如下:(1)创建实体类假设我们要批量插入的实体类是 User,创建实体类如下:```public class User {private Long id;private String name;private String age;//省略getter、setter等方法}```(2)调用 insertBatch 方法在使用 insertBatch 方法前,需要先创建一个 List,然后将需要插入的数据添加到List 中。
Mybatis-Plus 是一个Mybatis 的扩展工具包,提供了许多便捷的方法和功能,可以使得Mybatis 的使用更加简单和高效。
其中,BaseService 是Mybatis-Plus 提供的一个基础服务类,提供了常用的增删改查操作,简化了开发人员对数据库的操作。
BaseService 的原理是封装了Mybatis 的CRUD 操作,实现了通用的数据访问方法。
在BaseService 中,通过反射机制获取泛型类型,进而获取对应的Mapper 接口,并调用Mapper 接口中的相应方法来完成数据的增删改查操作。
例如,在BaseService 中,我们可以使用以下方法进行数据插入操作:
Copy Code
public boolean save(T entity) {
return baseMapper.insert(entity) > 0;
}
这里的baseMapper 可以看作是一个通用的Mapper 对象,其类型是根据BaseService 的泛型参数进行自动注入的。
在这个方法中,我们直接调用了baseMapper 对象的insert 方法,将实体对象插入到数据库中。
类似的,BaseService 还封装了许多其他的常用方法,比如updateById、deleteById、selectById 等,这些方法都是通过反射机制调用Mapper 接口中相应的方法实现的。
总之,BaseService 的原理就是通过反射机制获取Mapper 接口,并封装了常用的数据访问方法,使得开发人员可以更加方便地进行数据库操作。
mybatis-plus底层原理
MyBatis Plus是一个基于MyBatis的CRUD框架,旨在简化开发者对数据库的操作。
它封装了MyBatis的底层原理,并提供了一系列的便捷的操作方法和增强功能。
MyBatis Plus的底层原理主要有以下几个方面:
1. 注解和XML配置:MyBatis Plus支持使用注解和XML配置两种方式配置数据库操作。
注解方式使用了MyBatis的注解,配置方式使用了MyBatis的XML 配置。
2. 代码生成器:MyBatis Plus提供了一个代码生成器,可以根据数据库表结构自动生成实体类、Mapper接口和XML配置文件。
开发者只需要定义好数据表结构和一些生成相关的配置,代码生成器就会自动生成相应的代码。
3. 通用Mapper:MyBatis Plus提供了一系列的通用Mapper接口,包括了常见的增删改查操作。
这些通用Mapper接口使用了泛型,可以自动根据实体类和数据库表进行映射,简化了CRUD操作。
4. 自动填充:MyBatis Plus提供了自动填充功能,可以在插入和更新实体时自动填充某些字段的值,比如创建时间和更新时间等。
开发者只需要定义好填充规则,MyBatis Plus就会在执行操作时自动填充相应的字段值。
5. 逻辑删除:MyBatis Plus支持逻辑删除功能,可以通过注解或配置的方式实现逻辑删除。
开发者只需要定义好逻辑删除字段和删除标识,MyBatis Plus就会自动在执行删除操作时进行逻辑删除。
6. 分页查询:MyBatis Plus支持分页查询功能,可以通过与SpringBoot等框架整合,方便地实现分页查询。
开发者只需要传入分页参数,MyBatis Plus就会自动进行分页查询,并返回查询结果。
总之,MyBatis Plus通过封装了MyBatis的底层原理,并提供了一系列的便捷的操作方法和增强功能,大大简化了数据库操作的开发工作。