MybatisPlus插件:
- 代码生成器
- 分页插件
- 执行分析插件SqlExplainInteerceptor
- 性能分析插件PerformanceInterceptor
- 自动填充
- 逻辑删除
- 通用枚举
- ……
一,MybatisPlus分页
MybatisPlus的分页比Mybatis简单许多
MybatisPlus不需要导入pagehelper依赖,它自己写了有分页组件跟pagehelper不太一样,功能也很强大
一,分页的简单使用
MybatisPlus和Mybatis的分页功能是一样的,但底层实现是不一样的,MybatisPlus的分页是它们自己开发的已经嵌入到了MybatisPlus,而Mybatis的分页是第三方开发的,需要进行依赖导入
步骤:
- 配置分页
- 使用分页
1,配置分页:
@Configuration public class page_config { @Bean//配置分页 public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2)); return interceptor; }}
2,使用分页:
① pojo类
@Data @ToString @TableName("mybatistest") public class activerecord_pojo{ @TableId(type = IdType.AUTO) int id; String name; int sex; int age; }
② 映射接口
public interface mybatisplus_mapper extends BaseMapper<mybatisplus_pojo> { @Override <E extends IPage<mybatisplus_pojo>> E selectPage(E page, @Param("ew")Wrapper<mybatisplus_pojo> queryWrapper); }
③ 测试
@Test void selectpage() { //设置分页对象Page Page<mybatisplus_pojo> pojoPage = new Page<>(1,1); //设置条件查询 QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name","da"); //分页查询并获取分页查询对象 Page<mybatisplus_pojo> pojoPage1 = mapper.selectPage(pojoPage, queryWrapper); System.out.println("查询的总页数:"+pojoPage1.getPages()); System.out.println("查询的总条数:"+pojoPage1.getTotal()); System.out.println("当前页数:"+pojoPage1.getCurrent()); //通过分页查询对象获取当前页的数据 List<mybatisplus_pojo> records = pojoPage1.getRecords(); for(mybatisplus_pojo m :records){ System.out.println(m); } }
④ 结果
二,Page对象
Page对象是Mybatispuls为实现分页提供的对象
它的类图:
Page的构造:
- Page(long current, long size, long total)
- Page(long current, long size)
- ……
Page的构造参数:
- current:当前页
- size:指定一页有多少条数据
- total:指定总页数(这个无需指定)
Page的方法:
- hasNext:判断是否有下一页
- getRecords:将当前页数据转化为list数据并返回
- setRecords:将list数据传入page对象
- getTotal:获取总页数
- setTotal:设置总页数
- getSize:获取每一页的数据量
- setSize:设置每一页的数据量
- getCurrent:获取当前页
- setCurrent:设置当前页
- ……具体可以看它的源码,设置还要很多,我例举的只是常用的
二,MybatisPlus代码生成器
MybatPlus的代码生成器和Mybatis的逆向工程功能一样,都是负责把数据库表转化为Mapper,pojo等
MybatisPlus代码生成器和Mybatis Generator逆向工程对比:
- MP代码生成器基于java代码来实现,Mybatis Generator基于XML实现
- Mybatis Generator可生成:实体类,mapper接口,mapper映射文件
- MP代码生成器:实体类,mapper接口,mapper映射文件,Service层,Controller层
- MP代码生产器的功能比MBG的功能更加强大
表及字段的策略选择(只是选择):
- 在MP中,建议数据库表名和表字段名采用驼峰命名方式,如果下划线命名方式,需要开启全局下划线配置,如果表名字段命名方式不一用@TableName和@TbaleField修改即可
- 上述策略的原因是为了避免在产生对应实体类时性能耗损,这样字段不用做映射就能直接和实体类对应
在MP的官方文件提供两个版本的代码生成器,3.5.1版本之前的历史版本和3.5.1之后的新版本
一,MP生成器的使用(历史版本)
导入依赖:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency>
生产器需要除了依赖还需要导入模板引擎:它提供了三种模板引擎
- Velocity(默认)
- FreeMaker
- Beetl
① Velocity
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency>
② FreeMaker
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency>
③ Beetl
<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.9.0.RELEASE</version> </dependency>
MP代码生产器的编写分为5个部分:
- 全局部分:GlobalConfig
- 数据源部分:DataSourceConfig
- 策略部分:StrategyConfig
- 包名策略部分:PackageConfig
- 整合部分:AutoGenerator
注:除了AutoGenerator这些类在com.baomidou.mybatisplus.generator.config包下,注意别导错
GlobalConfig的方法:
- setActiveRecord():是否AR模式
- setAuthor():设置作者
- setOutputDir():生成工程的路径
- setFileOverride():是否文件覆盖
- setIdType():设置主键策略
- setBaseResultMap():是否开启即可的ResultMap
- setBaseColumnList():是否生成表的列集合
- setEnableCache():是否开启缓存
- ……
- setDbType():设置数据库的类型
- setUsername():用户名
- setPassword("123") : 设置数据库密码
- setUrl():设置url
- setDriverName():数据库驱动
- ……
- setCapitalMode():是否全局大写命名
- setTablePrefix():生成表的前缀
- setNaming():数据库表映射到实体类的命名策略
- setInclude():需要生成的表名
- ……
- setParent():设置父包路径
- setEntity():实体类的包名
- setMapper():设置mapper接口包名
- setXml():这是接口的映射文件,包名和接口一样
- setServiceImpl():service接口文件
- setService():server文件
- setController():controller文件包名
- ……
- setGlobalConfig():加入全局配置
- a.setDataSource():加入数据源
- a.setPackageInfo():加入包配置
- a.setStrategy():加入策略配置
- execute():执行
- ……
@SpringBootTest public class testgenerator { @Test void generator(){ //全局部分 GlobalConfig gc = new GlobalConfig(); gc.setActiveRecord(true);//是否AR模式 gc.setAuthor("WQL");//设置作者 gc.setOutputDir("C:\\Users\\wql\\Desktop\\fq");//生成工程的路径 //数据源部分 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL);//设置数据库的类型 dataSourceConfig.setUsername("root");//用户名 dataSourceConfig.setPassword("123");;//设置数据库密码 dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/wql");//url dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");//数据库驱动 //策略部分 StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setCapitalMode(true);//是否全局大写命名 strategyConfig.setTablePrefix("wql_");//生成表的前缀 strategyConfig.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体类的命名策略 strategyConfig.setInclude("bm");//需要生成的表名 //包名策略部分 PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("com.generator");//设置父包路径 packageConfig.setEntity("pojo");//实体类的包名 packageConfig.setMapper("mapper");//设置mapper接口包名 packageConfig.setXml("mapper");//这是接口的映射文件,包名和接口一样 packageConfig.setServiceImpl("service");//service接口文件 packageConfig.setService("service");//server文件 packageConfig.setController("controller");//controller文件包名 //整合部分并运行 AutoGenerator a = new AutoGenerator(); a.setGlobalConfig(gc);//加入全局配置 a.setDataSource(dataSourceConfig);//加入数据源 a.setPackageInfo(packageConfig);//加入包配置 a.setStrategy(strategyConfig);//加入策略配置 a.execute();//执行 }}
② 生成结果
二,MP生成器的使用(新版本3.5.1+
新版本对老版本的代码进行了重构,但功能基本没有变,新版本使用了大量的创建者模式提供Builder进行对象的构建
Maven依赖:
新版本和老版本API基本没有变,只是写法改变了,具体配置去官方文档看
文档地址:mp.baomidou.com/guide/generator-new.html#%E5%AE%89%E8%A3%85
例:
FastAutoGenerator.create("url", "username", "password") .globalConfig(builder -> { builder.author("baomidou") // 设置作者 .enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir("D://"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名 .moduleName("system") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("t_simple") // 设置需要生成的表名 .addTablePrefix("t_", "c_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute();}
三,MybatisPlus通用枚举
枚举对某些特定值的操作很方便,比如在表性别字段上,一般使用数字代替,在插入和更新时都需要填写,可以把这些常量封装导enum
步骤:
- 新建枚举类,标注数据库存的值是那个属性
- POJO类,使用通用枚举,返回值也要是enum
- 配置枚举类包的位置
- 使用枚举进行操作
通过枚举属性:数据库具体要存的是枚举的那个属性
1,创建枚举类并声明通用枚举属性
方式一: 使用 @EnumValue 注解枚举属性
例:
public enum GradeEnum { PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中"); GradeEnum(int code, String descp) { this.code = code; this.descp = descp; } @EnumValue//标记数据库存的值是code private final int code; //。。。 }
方式二: 枚举属性,实现 IEnum 接口
例:
public enum AgeEnum implements IEnum<Integer> { ONE(1, "一岁"), TWO(2, "二岁"), THREE(3, "三岁"); private int value; private String desc; @Override public Integer getValue() { return this.value; } }
2,配置枚举包位置
mybatis-plus: type-enums-package: 包位置信息
例:以表中sex字段为例,使用通过枚举进行查询和删除
① 新建enum类并标注通用枚举属性
@ToString public enum myenum implements IEnum<Integer> { NAN(0,"男"), NV(1,"女"); private int num; private String sex; myenum(int num, String sex) { this.num = num; this.sex = sex; } @Override public Integer getValue() { return this.num; } }
② pojo类
@Data @ToString @TableName("mybatistest") public class mybatisplus_pojo { @TableId(type = IdType.AUTO) int id; @TableField(fill = FieldFill.INSERT) String name; myenum sex; int age; int deleteid; }
③ 配置枚举包的位置
mybatis-plus: type-enums-package: com.example.springboot_mybatisplus_dome.myenum
④ 实现插入
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void insert(){ mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); mybatisplusPojo.setAge(20); mybatisplusPojo.setName("lalala"); //使用枚举进行设置 mybatisplusPojo.setSex(myenum.NAN); int insert = mapper.insert(mybatisplusPojo); if(insert!=0){ System.out.println("插入数据成功!:"+mybatisplusPojo.getId()); }else { System.out.println("插入数据失败!"); } }
⑤ 实现查询
@Test void selectlist() { QueryWrapper<mybatisplus_pojo> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("sex",myenum.NAN); List<mybatisplus_pojo> mybatisplus_pojos = mapper.selectList(queryWrapper); for(mybatisplus_pojo m :mybatisplus_pojos){ System.out.println(m); } }
四,MybatisPlus逻辑查询
逻辑删除就是将数据标记为删除状态,而并非真正删除数据库中的数据,查询时需要携带状态条件,在开发中,实现某个功能时,不想真正删除物理数据可以这样操作
逻辑删除的基本概念:使用标记方式,需要删除时将数据标记为删除,不删除数据库中的物理数据
逻辑删除需要修改表结构,为表增加一个deleteid(名字任意)的字段
MP实现逻辑删除的步骤:
- 在表中添加一个逻辑删除的字段
- 在创建POJO实体类时,在逻辑删除字段添加一个@TableLogic
- 在配置文件中配置已删除数据和未删除数据对应的值(如:字段值0表示删除,字段值未1表示正常)
例:
① 在表中添加逻辑删除字段
② POJO类
@Data @ToString @TableName("mybatistest") public class mybatisplus_pojo { @TableId(type = IdType.AUTO) int id; @TableField(fill = FieldFill.INSERT) String name; int sex; int age; @TableLogic//标记逻辑删除字段 int deleteid; }
③配置
mybatis-plus: global-config: db-config: logic-delete-value: 1 #已删除字段值为1 logic-not-delete-value: 0 #正常,字段值为2
④ 删除测试
@SpringBootTest class SpringbootMybatisplusDomeApplicationTests { @Autowired mybatisplus_mapper mapper; @Test void deleteid(){ int i = mapper.deleteById(2); System.out.println(i); }}
⑤ 结果
五,MyBatisPlus自动填充功能
有些时候我们可能会有这样的需求,插入或者更新数据时,希望有些字段可以自动填充数据,比如密码,version等,在MP中提供了这样的功能,可以实现自动填充
实现步骤:
- 使用@TableField注解进行标注
- 实现MetaObjectHandler接口对标注字段进行填充
自动填充依赖于@TableField和它的Fill属性,假如需要字段填充,就把注解标准在那个属性字段上面
FieldFill:
- DEFAULT:默认值,不进行填充
- INSERT:插入操作填充
- UPDATE:更新操作填充
- INSERT_UPDATE:插入和更新填充
需要实现MetaObjectHandler接口:
- insertFill(MetaObject metaObject):插入填充方法
- updateFill(MetaObject metaObject):更新填充方法
例:
① POJO
@Data @ToString @TableName("mybatistest") public class mybatisplus_pojo { @TableId(type = IdType.AUTO) int id; @TableField(fill = FieldFill.INSERT) String name; int sex; int age; }
② MetaObjectHandler接口
@Component//需要将它放入容器中 public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { //获取被标注字段属性的值 Object name = getFieldValByName("name", metaObject); //判断是否为空 if(name==null){ //对字段进行填充 setFieldValByName("name","GUN",metaObject); } } @Override public void updateFill(MetaObject metaObject) { }}
③ 测试(插入操作不加name属性)
@Test void insert(){ mybatisplus_pojo mybatisplusPojo = new mybatisplus_pojo(); mybatisplusPojo.setAge(20); mybatisplusPojo.setSex(0); int insert = mapper.insert(mybatisplusPojo); if(insert!=0){ System.out.println("插入数据成功!:"+mybatisplusPojo.getId()); }else { System.out.println("插入数据失败!"); } }
④ 结果
六,SqlExplainInteerceptor执行分析插件
SqlExplainInteerceptor是MP中提供了对SQL执行的分析插件,它可以阻断全表更新,删除的操作
SqlExplainInteerceptor的作用:防止用户的不安全操作(例如全表的删除等)
注:该插件仅适合于开发环境,不适合于生成环境
配置SqlExplainInteerceptor执行解析器:
@Configuration @MapperScan(basePackages = "com.example.springboot_mybatisplus_dome.dao.mapper") public class page_config { @Bean//配置执行分析插件 public SqlExplainInterceptor sqlExplainInterceptor(){ //创建SQL执行解析器 SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor(); List<ISqlParser> sqlParserList = new ArrayList<>(); //攻击SQL,阻断解析器 sqlParserList.add(new BlockAttackSqlParser()); sqlExplainInterceptor.setSqlParserList(sqlParserList); return sqlExplainInterceptor; } }
例:执行一个全表更新
① 全表更新
@Test void updatewrapper(){ int update = mapper.update(null,null); System.out.println(update); }
② 结果
七,PerformanceInterceptor性能分析插件
PerformanceInterceptor性能分析插件,用于输出每条SQL语句及其执行的时间,可以设置最大执行时间,超过时间就会抛出异常
注:和执行分析插件一样也只适合于开发环境,不适合生产环境
配置:
@SpringBootApplication @MapperScan("com.aiyi.springbootplus.dao") public class SpringbootPlusApplication { /** * SQL执行效率插件 */ @Bean public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); return new PerformanceInterceptor(); } }
如果该性能分析插件是3.2.0 以上版本移除推荐使用第三方扩展 执行 SQL 分析打印 功能
@SpringBootApplication @MapperScan("com.aiyi.springbootplus.dao") public class SpringbootPlusApplication { /** * SQL执行效率插件 */ @Bean public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); // maxTime 指的是 sql 最大执行时长 performanceInterceptor.setMaxTime(5000); //SQL是否格式化 默认false performanceInterceptor.setFormat(true); return new PerformanceInterceptor(); } }
执行一段查询:
八,MybatisX快速开发插件
MybatisX是一款基于IDEA的快速开发的插件,为效率而生
安装步骤:进入IDEA --> Setting --> Plugins --> Marketolace --> 输入MybatisX搜索并安装
MybatisX可实现的功能:
- java和xml文件的调用跳转
- Mapper方法的自动生成
自动生成代码:可视化执行Mybatisplus代码生成器:
- 选中需要自动生成实体类、XxxMapper.java、XxxService.java、XxxServiceImpl.java及XxxMapper.xml文件的表--->右击--->选择MybatisX-Generator
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109