本篇文章基于狂神的教程,地址如下:
我们在文章:
Spring Cloud集成新版MyBaties-Plus_PigeonEssence的博客-CSDN博客
完成了基础的CRUD,我们继续研究更为简单的其他组件。
目录
性能分析:
在新版本的mybaties plus中移除了老版本的性能分析插件,官方的意思就是让我们使用Druid等工具进行性能分析。当然,在官方文档中给我们引入了一个新组件p6spy,用于执行sql分析打印。
该插件有性能损耗,不建议生产环境使用
1.引入依赖
<!--sql性能分析插件-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
2.切换数据源
spring:
datasource:
username: root
password: 123456
url: jdbc:p6spy:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncodeing=utf-8&serverTimezone=GMT%2B8
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
切换数据源两个注意的点:
1.driver-class-name 换成p6spy的 com.p6spy.engine.spy.P6SpyDriver
2.url在中间加上 p6spy:
其他的和以前的配置一样,没有变化
3.增加spy.properties 配置:
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
这样,就配置好了我们的性能分析插件
4.再执行一次查找方法:
在红色字体内,可以看到具体的运行时间等参数。
条件构造器:
Wrapper,在我的理解中,wapper就是一个构造器方法,帮助我们简单地去实现一些简单的sql。不用自己去写sql,而是用过方法调用传参实现,具体的使用我们可以当方法传参来理解。
具体方法参照官网文档:
条件构造器 | MyBatis-Plushttps://baomidou.com/pages/10c804/#alleq
1.条件构造器查询实例1:
@Test
public void contextLoads(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//Wrapper的用法就主要是调用其中的方法,我们查询name和email不为空,并且年龄大于21的用户
wrapper.isNotNull("name").isNotNull("email").ge("age",21);
//查询封装
List<User> users = userMapper.selectList(wrapper);
//遍历输出
users.forEach(System.out::println);
}
我们可以看到:
sql语句在执行的时候,(name IS NOT NULL AND email IS NOT NULL AND age >= ?)自动拼接上去了。这就是Wrapper的执行方式。
查询结果:
2.条件构造器查询实例2:
@Test
public void selectByName(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//Wrapper的用法就主要是调用其中的方法,我们查询一个name为Tom的用户
wrapper.eq("name","Tom");
//查询封装,查询一个
User user = userMapper.selectOne(wrapper);
//遍历输出
System.out.println(user);
}
3.条件构造器查询实例3:
@Test
public void selectAllCount(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//Wrapper的用法就主要是调用其中的方法,我们查询一个年龄在20-30岁之间的用户
wrapper.between("age",20,30);
//查询封装,查询结果数
Long total = userMapper.selectCount(wrapper);
//遍历输出
System.out.println(total);
}
4.条件构造器查询实例4:
@Test
public void selectMaps(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//Wrapper的用法就主要是调用其中的方法,我们查询一个名字不包含e的用户
//左和右表示百分号在左边还是右边
wrapper.notLike("name","e").likeLeft("email","t");
//查询封装,查询结果数
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
//遍历输出
maps.forEach(System.out::println);
}
5.条件构造器查询实例5:
@Test
public void selectLeft(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id在子查询中查出来
wrapper.inSql("id","select id from user where id<3");
//查询封装,查询结果数
List<Object> objects = userMapper.selectObjs(wrapper);
//遍历输出
objects.forEach(System.out::println);
}
6.条件构造器查询实例6:
@Test
public void selectOrder(){
//new一个Wrapper
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id在子查询中查出来
wrapper.orderByAsc("id");
//查询封装,查询结果
List<User> users = userMapper.selectList(wrapper);
//遍历输出
users.forEach(System.out::println);
}
以上就是条件构造器的具体用法,mybaties plus会增加单标构建与操作的便捷度。
代码生成器
3.5.1 及其以上版本使用了新的代码生成器,官方文档如下:
1.引入依赖
<!--代码生成器插件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 生成代码模板工具-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
2.创表
在mysql中创建表 article ,所有的字段将会由代码生成器创建CRUD已经注释
表结构如下:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for article
-- ----------------------------
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`isTop` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否置顶',
`banner` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '封面图',
`isHot` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '是否热门',
`pubTime` datetime(0) NULL DEFAULT NULL COMMENT '发布时间',
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标题',
`summary` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '简介',
`content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '内容',
`viewsCount` int(255) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '浏览量',
`commentsCount` int(0) NULL DEFAULT NULL COMMENT '评论量',
`crateTime` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`updateTime` datetime(0) NULL DEFAULT NULL COMMENT '上传时间',
`version` int(255) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '版本号',
`deleted` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '逻辑删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
上表可以是你设计好的任意表,表结构设计很重要,需要的字段都应该有
3.创建代码生成器
代码生成器的配置可以对照官方文档:
package space.pigeonessence;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import java.util.Collections;
/**
* @author Zeyu Wan
* @version 1.0.0
* @ClassName AutoGenerator.java
* @Description Auto Code Generator
* @createTime 2021年12月17日 16:31:00
*/
public class MyAutoGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8", "root", "123456")//设置数据源
/*全局配置*/
.globalConfig(builder -> {
builder.author("ZeyuWan") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("F:\\blog-background-parent\\mybaties-tese\\src\\main\\java") // 指定输出目录
//.disableOpenDir()//关闭开启目录
.dateType(DateType.ONLY_DATE)//只有日期
;
})
/*包的配置*/
.packageConfig(builder -> {
builder.parent("space.pigeonessence") // 设置父包名
.moduleName("blog") // 设置父包模块名
.mapper("mapper")
.service("service")
.controller("controller")
.entity("entity")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml,"F:\\blog-background-parent\\mybaties-tese\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("article") // 设置需要生成的表名(你新创建的表)
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
//.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
4.执行代码生成器
执行成功以后可以看到mybaites plus已经帮我们创建好了一些基本的类