目录
1、ActiveRecord
1.1 开启AR之旅(根据主键 id 进行查询)
1.2 新增数据
1.3 更新操作
1.4 删除操作
1.5 根据条件查询
2、Oracle 主键 Sequence
2.1 部署Oracle环境
2.2 创建表以及序列
2.3 jdbc驱动包
2.4 修改application.properties
2.5 配置序列
2.6 测试
3、MyBatis-Plus的插件
3.1 mybatis的插件机制
3.2 执行分析插件
3.3 性能分析插件
3.4 乐观锁插件
3.4.1 主要适用场景
3.4.2 插件配置
3.4.3 注解实体字段
3.4.4 测试
3.4.5 特别说明
4、SQL注入器实现自定义全局变量
4.1 编写MyBaseMapper
4.2 编写MySqlInjector
4.3 编写FindAll
4.4 注册到Spring容器(自定义的SQL注入器 MySqlInjector)
4.5 测试
5、自动填充功能
5.1 添加@TableField注解
5.2 编写MyMetaObjectHandler
5.3 测试
6、逻辑删除(标记隐藏展示)
6.1 修改表结构
6.2 配置
6.3 测试
7、通用枚举
7.1 修改表结构
7.2 定义枚举
7.3 配置
7.4 修改实体
7.5 测试
8、代码生成器
8.1 创建工程
8.2 代码
8.3 测试
9、MyBatisX 快速开发插件
1、ActiveRecord
ActiveRecord(简称AR)一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于ActiveRecord 往往只能感叹其优雅,所以我们也在 AR 道路上进行了一定的探索,喜欢大家能够喜欢
1.1 开启AR之旅(根据主键 id 进行查询)
在MP中,开启AR非常简单,只需要将实体对象继承Model即可 |
在Model中实现了各种各样的方法: 因此我们可以直接通过User对象来调用CURD方法 |
测试用例:(根据主键 id 进行查询) |
但虽然我们在测试用例中没有显式的使用Mapper方法,但在Model的CURD的底层实现中依然是需要使用我们之前创建的继承了BaseMapper的UserMapper来进行操作,所以Mapper接口是不能省略的,一定要切记! |
测试结果: |
1.2 新增数据
测试用例: |
测试结果: |
数据库表结果: |
1.3 更新操作
测试用例: |
结果: |
1.4 删除操作
测试用例: |
结果: |
1.5 根据条件查询
测试用例: |
结果: |
2、Oracle 主键 Sequence
在mysql中,主键往往是自增长的,这样使用起来是比较方便的,如果使用的是Oracle数据库,那么就不能使用自增长了,就得使用Sequence 序列生成id值了
2.1 部署Oracle环境
为了简化环境部署,这里使用Docker环境进行部署安装Oracle
# 拉取镜像 docker pull sath89/oracle-12c # 创建容器 docker create --name oracle -p 1521:1521 sath89/oracle-12c # 启动 docker start oracle && docker logs -f oracle # 部分启动过程省略 …… PL/SQL procedure successfully completed. Starting import from '/docker-entrypoint-initdb.d': ls: cannot access /docker-entrypoint-initdb.d/*: No such file or directory Import finished Database ready to use. Enjoy! ;) # 通过用户名密码即可登录 用户名和密码为: system/oracle |
下面使用navicat12进行连接并操作oracle: |
需要注意的是:由于安装的Oracle是64位版本,所以navicat也是需要使用64为版本,否则连接不成功。 |
2.2 创建表以及序列
建表语句: |
--创建表,表名以及字段名都要大写 CREATE TABLE "TB_USER" ( "ID" NUMBER(20) VISIBLE NOT NULL , "USER_NAME" VARCHAR2(255 BYTE) VISIBLE , "PASSWORD" VARCHAR2(255 BYTE) VISIBLE , "NAME" VARCHAR2(255 BYTE) VISIBLE , "AGE" NUMBER(10) VISIBLE , "EMAIL" VARCHAR2(255 BYTE) VISIBLE ) --创建序列 CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1 |
2.3 jdbc驱动包
由于版权原因,我们不能直接通过maven的中央仓库下载oracle数据库的jdbc驱动包,所以我们需要将驱动包安装到本地仓库: |
安装成功: |
安装完成后的坐标:(测试是否可以成功导入) |
导入成功: |
2.4 修改application.properties
对于application.properties的修改,需要修改2个位置,分别是:
2.5 配置序列
使用Oracle的序列需要做2件事情:
Ⅰ、需要配置MP的序列生成器到Spring容器: |
Ⅱ、在实体对象(pojo)中指定序列的名称:(这里clazz为long是因为id的类型也为long) |
2.6 测试
测试用例: |
结果: |
3、MyBatis-Plus的插件
3.1 mybatis的插件机制
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: |
1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 2. ParameterHandler (getParameterObject, setParameters) 3. ResultSetHandler (handleResultSets, handleOutputParameters) 4. StatementHandler (prepare, parameterize, batch, update, query) |
我们看到了可以拦截Executor接口的部分方法,比如update,query,commit,rollback等方法,还有其他接口的一些方法等 |
总体概括为: 1. 拦截执行器的方法 2. 拦截参数的处理 3. 拦截结果集的处理 4. 拦截Sql语法构建的处理 |
拦截器示例:(测试运行,会先进入对象代理plugin方法(此时它获取的target是一个MybatisSimpleExecutor对象),只会才会被intercept方法拦截,拦截到update方法之后,我们可以通过proceed()方法对其放行,然后再次进入plugin方法(此时它获取的target是一个MybatisDefaultParameterHandler对象),在这个过程中plugin方法一共会被执行四次,因为MyBatis 允许使用插件来拦截的方法就包括四种,所以每种都会在plugin方法中进行一次包装)
注入到Spring容器: |
或者通过xml配置,mybatis-config.xml: |
3.2 执行分析插件
在MP中提供了对SQL执行的分析的插件,可用作阻断全表更新、删除的操作,注意:该插件仅适用于开发环境,不适用于生产环境
SpringBoot配置:(SQL分析插件) |
测试:(测试全表的更新,SQL分析器的阻断效果) |
结果:(可以看到,当执行全表更新时,会抛出异常,这样有效防止了一些误操作) |
这是一个禁止的操作 |
如果是非全表的更新,那么会怎么样呢?
测试方法: |
可以正常执行: |
3.3 性能分析插件
性能分析拦截器,用于输出每条 SQL 语句及其执行时间,可以设置最大执行时间,超过时间会抛出异常 注意:该插件只用于开发环境,不建议生产环境使用 |
配置:(Mybatis-config.xml),其也可以在MybatisPlusConfig中进行配置 |
执行结果:(可以看到,执行时间为11ms。如果将maxTime设置为1,那么,该操作会抛出异常) |
超时,抛出异常: |
3.4 乐观锁插件
3.4.1 主要适用场景
意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式:
|
3.4.2 插件配置
spring xml: |
spring boot: |
3.4.3 注解实体字段
需要为实体字段添加@Version注解
Ⅰ、为表添加version字段,并且设置初始值为1: |
Ⅱ、为User实体对象(pojo)添加version字段,并且添加@Version注解(表示它是一个乐观锁): |
3.4.4 测试
测试用例:(测试乐观锁) |
执行日志: |
可以看到,更新的条件中有version条件,并且更新的version为2。 如果再次执行,更新则不成功。这样就避免了多人同时更新时导致数据的不一致 |
3.4.5 特别说明
|
4、SQL注入器实现自定义全局变量
我们已经知道,在MP中,通过AbstractSqlInjector将BaseMapper中的方法注入到了Mybatis容器,这样这些方法才可以正常执行
那么,如果我们需要扩充BaseMapper中的方法,又该如何实现呢?
下面我们以扩展findAll方法(自定义方法)为例进行学习
4.1 编写MyBaseMapper
其他的Mapper都可以继承该Mapper,这样实现了统一的扩展 |
如: |
4.2 编写MySqlInjector
如果直接继承AbstractSqlInjector的话,原有的BaseMapper中的方法将失效,所以我们选择继承DefaultSqlInjector进行扩展
4.3 编写FindAll
4.4 注册到Spring容器(自定义的SQL注入器 MySqlInjector)
4.5 测试
输出的SQL: |
至此,我们实现了全局扩展SQL注入器 |
5、自动填充功能
有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version 等。在MP中提供了这样的功能,可以实现自动填充
5.1 添加@TableField注解
为password添加自动填充功能,在新增数据时有效。 FieldFill提供了多种模式选择: |
5.2 编写MyMetaObjectHandler
插入数据时填充: // 先获取到password的值,再进行判断,如果为空,就进行填充,如果不为空,就不做处理 更新数据时填充: |
5.3 测试
结果:(默认在插入时填充密码为123456) |
6、逻辑删除(标记隐藏展示)
开发系统时,有时候在实现功能时,删除操作需要实现逻辑删除,所谓逻辑删除就是将数据标记为删除,而并非真正的物理删除(非DELETE操作),查询时需要携带状态条件,确保被标记的数据不被查询到。这样做的目的就是避免数据被真正的删除
MP就提供了这样的功能,方便我们使用,接下来我们一起学习下:
6.1 修改表结构
为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除: |
同时,也修改User实体,增加deleted属性并且添加@TableLogic注解: |
6.2 配置
application.properties: |
6.3 测试
执行的SQL: |
数据库表: |
测试查询: |
执行的SQL: 已经查询不出来了,可见,已经实现了逻辑删除。 |
7、通用枚举
解决了繁琐的配置,让 mybatis 优雅的使用枚举属性
7.1 修改表结构
7.2 定义枚举
7.3 配置
7.4 修改实体
7.5 测试
测试插入数据: |
SQL: |
数据库表: |
查询:(这里的插件可以将枚举和1,2进行转化)
结果: |
从测试可以看出,可以很方便的使用枚举了 查询条件时也是有效的: |
SQL: |
8、代码生成器AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率 8.1 创建工程
8.2 代码
8.3 测试
9、MyBatisX 快速开发插件
| |||||||||||||||
| |||||||||||||||