Spring Boot学习篇(五)
mybatis-plus使用
1.1 配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>boot-plus</artifactId>
<version>1.0-SNAPSHOT</version>
<!--①继承springboot项目-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.7.2</version>
</parent>
<!--② 导入相关依赖-->
<dependencies>
<!--2.1 导入springboot所需要的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--2.2 导入mysql数据库依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--2.3 导入lombok依赖,便于写实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--2.4 导入mybatisPlus所需依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--2.5 导入springboot项目中单元测试所需依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--2.6 导入代码生成器所需要的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
</project>
1.2 在java文件夹下面创建com包.zlz包,其目录结构如下所示
1.3 在zlz包下创建PlusStart类,其内容如下所示
package com.zlz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PlusStart {
public static void main(String[] args) {
SpringApplication.run(PlusStart.class);
}
}
1.4 在zlz包下创建代码生成器类MyGenerator
1.4.0 复制java文件夹绝对路径小技巧
1.4.1 内容如下
package com.zlz;
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;
public class MyGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3305/db0618", "root", "root")
.globalConfig(builder -> {
builder.author("zlz") // 设置作者
.dateType(DateType.ONLY_DATE) // 时间策略,日期以什么样子的类型去生成
.outputDir("F:\\boot\\boot-plus\\src\\main\\java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.zlz") // 设置父包名
.pathInfo(Collections.singletonMap(OutputFile.xml, "F:\\boot\\boot-plus\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径,
// 注意:这个mapper文件夹是可以不存在的,运行该main方法会自动创建的
})
.strategyConfig(builder -> {
//开启lombok
builder.entityBuilder().enableLombok();
//覆盖现有文件
builder.entityBuilder().fileOverride();
builder.addInclude("songs"); // 设置需要生成的表名,想一次性生成多张表,就用逗号隔开,如:addInclude("songs","music")
})
.execute();
}
}
1.5 运行MyGenerator类方法
1.5.1 运行前目录结构
1.5.2 运行后
a 弹出一个如下所示的文件资源管理器,直接叉掉即可
b 运行后目录结构
1.6.微改一下生成的实体类Songs
package com.zlz.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;
import lombok.*;
/**
* <p>
*
* </p>
*
* @author zlz
* @since 2023-01-02
*/
//①改动地方1
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Songs implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String singerName;
private String album;
private String albumImg;
private String name;
//②改动地方2,调成日期形式,就不用转型了
private String releaseDate;
}
1.7.在resources文件夹下创建application.yml,其内容如下所示
spring:
datasource
url: jdbc:mysql://127.0.0.1:3305/db0618
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
mybatis-plus:
type-aliases-package: com.zlz.entity #实体别名扫描
#配置日志 查看具体的sql执行语句
logging:
level:
com.zlz.mapper: debug
1.8 在zlz包下创建config包,并创建PlusConfig类
1.8.1 目录结构如下所示
1.8.2 PlusConfig类的内容如下所示
package com.zlz.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.zlz.mapper")//mapper接口扫描,@MapperScan也可以放在启动类PlusStart上面(启动类也算配置类)
public class PlusConfig {
}
1.9.测试类环境准备
import com.zlz.PlusStart;
import com.zlz.service.ISongsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = PlusStart.class,
webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class MyTest {
@Autowired
ISongsService songsService;
}
1.10 查询
A 根据主键查询单条
a 示例代码
@Test
public void findOne(){
Songs byId = songsService.getById(666);
System.out.println(byId);
}
b.运行截图
B 查询全部
a 示例代码
@Test
public void findAll(){
List<Songs> list = songsService.list();
for (Songs songs : list) {
System.out.println(songs);
}
}
b 运行截图
C 带条件的查询(queryWrapper)
a 相等查询
a.1 示例代码
//带上条件的查询(使用场景:商城商品的关键字搜索)
@Test
public void findByCondition(){
//查询条件构造器
String search="张学友";
QueryWrapper<Songs> qw = new QueryWrapper<>();
//第一个参数是条件,如果条件为真就带上第三个参数,为假就不带上,第二个参数是表的字段名
qw.eq(search!=null, "singer_name",search);
List<Songs> list = songsService.list(qw);
for (Songs songs : list) {
System.out.println(songs);
}
}
a.2 运行截图
b 范围查询between
b.1 示例代码
@Test
public void findByCondition(){
//范围查找between
QueryWrapper<Songs> qw = new QueryWrapper<>();
qw.between("release_date", "2000-1-1","2020-1-1");
List<Songs> list = songsService.list(qsw);
for (Songs songs : list) {
System.out.println(songs);
}
}
b.2 运行截图
c 模糊查询 like
c.1 示例代码
@Test
public void findByCondition(){
//查询条件构造器
QueryWrapper<Songs> qw = new QueryWrapper<>();
//查询歌曲表中歌手名字以张开头的所有歌手信息
qw.likeRight("singer_name", "张");
List<Songs> list = songsService.list(qw);
for (Songs songs : list) {
System.out.println(songs);
}
}
c.2 运行截图
e 查询指定的一些列
e.1 示例代码
public void findByCondition(){
//查询条件构造器
QueryWrapper<Songs> qw = new QueryWrapper<>();
//查询某些列是用逗号去进行分开,然后查到了的数据才有值,没有查到的数据就都是null值
qw.select("id,name");
List<Songs> list = songsService.list(qw);
for (Songs songs : list) {
System.out.println(songs);
}
}
e.2 运行截图
f 分组查询
f.1 示例代码
@Test
public void findByGroup(){
//统计歌曲表中每个歌手唱了多少首歌
//① 创建QueryWrapper对象
QueryWrapper<Songs> qw = new QueryWrapper<>();
//② 指定分组字段
qw.groupBy("singer_name");
//下面的select方法相当于的sql语句是 select singer_name,count(*) num from songs group by singer_name;
//③指定要查询出来的列
qw.select("singer_name,count(*) num");
//因为是多条数据,一条数据就相当于一个map,所以需要用List<Map<String, Object>>来进行接受
//④使用listMaps方法去进行查询
List<Map<String, Object>> maps = songsService.listMaps(qw);
for (Map<String, Object> map : maps) {
System.out.println(map);
}
}
f.2 日志显示最终使用的sql语句
f.3 查询出来的结果展示
g 排序查询
g.1 示例代码
//排序的使用
@Test
public void findByOrder(){
//把歌曲表按照日期降序排列
QueryWrapper<Songs> qw = new QueryWrapper<>();
//如果想要指定多个字段排序,那么可以使用逗号隔开,如orderByDesc("字段1,字段2...")
qw.orderByDesc("release_date");
songsService.list(qw).forEach(System.out::println);
}
9.2 运行截图
D 分页查询
a 在PlusConfig中加入如下代码
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//设置分页插件,别的拦截器也是addInnerInterceptor加入进去
PaginationInnerInterceptor pi = new PaginationInnerInterceptor();
pi.setDbType(DbType.MYSQL);//设置数据库类型为MySQL
pi.setOverflow(true);//溢出分页处理,默认是false不处理,需要设置成true,保证分页合理化
interceptor.addInnerInterceptor(pi);
return interceptor;
}
b 完整的PlusConfig类内容
package com.zlz.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.zlz.mapper")//mapper接口扫描,@MapperScan也可以放在启动类PlusStart上面(启动类也算配置类)
public class PlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//设置分页插件,别的拦截器也是addInnerInterceptor加入进去
PaginationInnerInterceptor pi = new PaginationInnerInterceptor();
pi.setDbType(DbType.MYSQL);//设置数据库类型为MySQL
pi.setOverflow(true);//溢出分页处理,默认是false不处理,需要设置成true,保证分页合理化
interceptor.addInnerInterceptor(pi);
return interceptor;
}
}
c 条件构造器实现分页
c.1 测试代码
@Test
public void findByPage(){
//创建分页对象
IPage<Songs> page = new Page<>(1, 5);
//条件构造器
QueryWrapper<Songs> qw = new QueryWrapper<>();
qw.like("name", "天");
//如果有条件的话,就把条件构造器对象丢到它的第二个形参就是的
songsService.page(page,qw);
//输出
List<Songs> records = page.getRecords();
for (Songs record : records) {
System.out.println(record);
}
//页码相关
System.out.println("当前页码:"+page.getCurrent());
System.out.println("总条数:"+page.getTotal());
System.out.println("总页数:"+page.getPages());
}
c.1 运行截图
d 自定义sql实现分页
d.1 在SongsMapper接口里面写上自定义方法
List<Songs> find(IPage<Songs> page, String album);
d.2 在SongsMapper.xml里面写自定义sql语句
<select id="find" resultType="songs">
SELECT * FROM songs WHERE album like #{album}
</select>
d.3 测试代码
//自定义分页,要注入自己的mapper
@Autowired
SongsMapper songsMapper;
@Test
public void findByCustomPage(){
//创建分页对象
IPage<Songs> page = new Page<>(1, 5);
String search="年";
List<Songs> songs = songsMapper.find(page, "%" + search + "%");
System.out.println(songs);
//页码相关
System.out.println("当前页码:"+page.getCurrent());
System.out.println("总条数:"+page.getTotal());
System.out.println("总页数:"+page.getPages());
}
d.4 运行截图