框架:MyBatisPlus进阶笔记

续基础笔记 https://blog.csdn.net/weixin_42236404/article/details/83751027

5.代码生成器  

5.1 代码生成器介绍

1) MP 提供了大量的自定义设置,生成的代码完全能够满足各类型的需求

2) MP 的代码生成器  和 Mybatis MBG 代码生成器:

MP 的代码生成器都是基于 java 代码来生成。

MBG 基于 xml 文件进行代码生成

MyBatis 的代码生成器可生成: 实体类、Mapper 接口、Mapper 映射文件

MP 的代码生成器可生成: 实体类(可以选择是否支持 AR)、Mapper 接口、Mapper 映射文件、 Service 层、Controller 层.
 
3) 表及字段命名策略选择 在 MP 中,我们建议数据库表名 和 表字段名采用驼峰命名方式, 如果采用下划 线命名方式 请开启全局下划线开关,如果表名字段名命名方式不一致请注解指定,我 们建议最好保持一致。
 
这么做的原因是为了避免在对应实体类时产生的性能损耗,这样字段不用做映射就能直 接和实体类对应。当然如果项目里不用考虑这点性能损耗,那么你采用下滑线也是没问 题的,只需要在生成代码时配置 dbColumnUnderline 属性就可以.

5.2 代码生成器依赖

1) 模板引擎 MP 的代码生成器默认使用的是 Apache 的 Velocity 模板,当然也可以更换为别的模板 技术,例如 freemarker。此处不做过多的介绍。 需要加入 Apache Velocity 的依赖.

       
    org.apache.velocity     
    velocity-engine-core     
    2.0 

5.3MP 代码生成器示例代码

 

@Test  
public void testGenerator() { 
    //全局配置 
    GlobalConfig config = new GlobalConfig();  
    config.setActiveRecord(true)   //是否支持AR模式 
             .setAuthor("CrazyJA") //作者 
             .setOutputDir("D:\\workspace_my\\mp03\\src\\main\\java")//生成路径
             .setFileOverride(true)//文件覆盖  
             .setServiceName("%sService")  //设置生成的service接口名 首字母是否为I
             .setIdType(IdType.AUTO); //主键策略 
        
     //数据源配置   
    DataSourceConfig dsConfig = new DataSourceConfig();
    dsConfig.setDbType(DbType.MYSQL)     
             .setUrl("jdbc:mysql://localhost:3306/javaEE_0228")                                                               
             .setDriverName("com.mysql.jdbc.Driver")    
             .setUsername("root")     
             .setPassword("1234");    
     //策略配置   
    StrategyConfig  stConfig = new StrategyConfig(); 
    stConfig.setCapitalMode(true) // 全局大写命名     
             .setDbColumnUnderline(true)  //表名 字段名 是否使用下滑线命名
             .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 
             .setInclude("tbl_employee")  //生成的表 
             .setTablePrefix("tbl_"); // 表前缀 
    //包名策略 
    PackageConfig pkConfig = new PackageConfig();   
    pkConfig.setParent("com.itaem.mp") 
             .setController("controller")     
             .setEntity("beans")    
             .setService("service"); 

    AutoGenerator ag  = new AutoGenerator()
             .setGlobalConfig(config)          
             .setDataSource(dsConfig)          
             .setStrategy(stConfig)          
             .setPackageInfo(pkConfig);   
    ag.execute();  
}   

  

6.插件扩展

6.1 Mybatis 插件机制简介

1) 插件机制: Mybatis 通过插件(Interceptor) 可以做到拦截四大对象相关方法的执行,根据需求,完 成相关数据的动态改变。 Executor StatementHandler ParameterHandler ResultSetHandler

2) 插件原理 四大对象的每个对象在创建时,都会执行 interceptorChain.pluginAll(),会经过每个插件对象的 plugin()方法,目的是为当前的四大对象创建代理。代理对象就可以拦截到四 大对象相关方法的执行,因为要执行四大对象的方法需要经过代理.

6.2 分页插件    

1) com.baomidou.mybatisplus.plugins.PaginationInterceptor

6.3 执行分析插件


1) com.baomidou.mybatisplus.plugins.SqlExplainInterceptor

2) SQL 执行分析拦截器,只支持 MySQL5.6.3 以上版本

3) 该插件的作用是分析 DELETE  UPDATE 语句,防止小白 或者恶意进行 DELETE  UPDATE 全表操作

4) 只建议在开发环境中使用,不建议在生产环境使用

5) 在插件的底层 通过 SQL 语句分析命令:Explain 分析当前的 SQL 语句,根据结果集中的 Extra 列来断定当前是否全表操作。
 

6.4 性能分析插件

1) com.baomidou.mybatisplus.plugins.PerformanceInterceptor

2) 性能分析拦截器,用于输出每条 SQL 语句及其执行时间

3) SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题

6.5 乐观锁插件

1) com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor

2) 如果想实现如下需求: 当要更新一条记录的时候,希望这条记录没有被别人更新

3) 乐观锁的实现原理: 取出记录时,获取当前 version 2 更新时,带上这个 version 2 执行更新时,setversion = yourVersion+1 where version = yourVersion  如果 version 不对,就更新失败

4) @Version 用于注解实体字段,必须要有。

 

7.自定义全局操作

根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自 定义 Mybatisplus 自动注入的方法。  

 
之前需要在 xml 中进行配置的 SQL 语句,现在通过扩展 AutoSqlInjector 在加载 mybatis 环境 时就注入。

7.1  AutoSqlInjector  

1) 在 Mapper 接口中定义相关的 CRUD 方法

2) 扩展 AutoSqlInjector   inject 方法,实现 Mapper 接口中方法要注入的 SQL

3) 在 MP 全局策略中,配置 自定义注入器

7.2 自定义注入器的应用之 逻辑删除

 

假删除、逻辑删除: 并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据 中的一个逻辑删除字段置为删除状态. tbl_user   logic_delete = 1   →  -1  
1) com.baomidou.mybatisplus.mapper.LogicSqlInjector

2) logicDeleteValue   逻辑删除全局值

3) logicNotDeleteValue  逻辑未删除全局值

4) 在 POJO 的逻辑删除字段 添加 @TableLogic 注解

5) 会在 mp 自带查询和更新方法的 sql 后面,追加『逻辑删除字段』 = 『LogicNotDeleteValue 默认值』

    删除方法: deleteById()和其他 delete 方法,

    底层 SQL 调用的是 update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue 默认值』

 

8.公共字段自动填充

8.1 元数据处理器接口

com.baomidou.mybatisplus.mapper.MetaObjectHandler
 
insertFill(MetaObject metaObject)   

updateFill(MetaObject metaObject)
 
metaobject:  元对象.  是 Mybatis 提供的一个用于更加方便,更加优雅的访问对象的属性, 给对象的属性设置值 的一个对象. 还会用于包装对象.  支持对 Object 、Map、Collection 等对象进行包装    本质上 metaObject 获取对象的属性值或者是给对象的属性设置值,最终是要 通过 Reflector 获取到属性的对应方法的 Invoker, 最终 invoke.

8.2 开发步骤

1) 注解填充字段  @TableFile(fill = FieldFill.INSERT)   查看 FieldFill

2) 自定义公共字段填充处理器  

3) MP 全局注入  自定义公共字段填充处理器

 

9. Idea 快速开发插件

MybatisX 辅助 idea 快速开发插件,为效率而生. 可以实现 java 与 xml 跳转,根据 Mapper 接口中的方法自动生成 xml 结构.
 
官方安装: File -> Settings -> Plugins -> Browse Repositories.. 输入 mybatisx 安装下载
 
Jar 安装:  File -> Settings -> Plugins -> Install plugin from disk.. 选中 mybatisx..jar 安装

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(技术干货)