目录
一、用前准备:
二、简单体验:
三、分页查询:
四、条件查询:
1、且条件查询:
2、或条件查询:
3、null值查询:
4、查询投影:
1)特定对象类型的投影查询:
2)map类型的投影查询:
3、分组统计:
4、eq等于查询:
5、模糊查询like:
6、映射匹配兼容性:
五、主键生成策略:
六、删除:
一)批量删除
二)逻辑删除:
一、用前准备:
在创建SpringBoot时只需要勾选 mySQL驱动即可
1、导入依赖:以下版本基于SpringBoot 2.6.2
com.baomidou
mybatis-plus-boot-starter
3.5.0
com.alibaba
druid-spring-boot-starter
1.2.8
mysql
mysql-connector-java
runtime
2、yml配置数据库:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/python?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
二、简单体验:
1、写一个Dao接口打上mapper注解。继承BaseMapper<>类,泛型写数据表对应的实体类。
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.springbootstudy.db.pojo.StudentInfo; import org.apache.ibatis.annotations.Mapper; @Mapper public interface testDao extends BaseMapper{ }
2、直接调用就会发现testDao的对象会有很多的内置方法:
三、分页查询:
1、书写一个配置类用于myBatis的拦截器:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class myBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor(){
//1、定义mp拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//2、添加拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2、书写分页查询代码:
@Test
void testByPage(){
IPage page = new Page(1,2);
tDao.selectPage(page,null);
System.out.println("当前页码:"+page.getCurrent());
System.out.println("每页显示条数:"+page.getSize());
System.out.println("页码总数:"+page.getPages());
System.out.println("数据总数:"+page.getTotal());
System.out.println("数据:"+page.getRecords());
}
四、条件查询:
前置知识:
| lt | less than 小于 |
| le | less than or equalto 小于等于 |
| eq | equal to等于 |
| ne | not equal 不等于 |
| ge | greater than or equal to 大于等于 |
| gt | greater then 大于 |
| between | 查询[a,b]的范围 |
1、且条件查询:
链式调用和分开写都是 且 的条件
@Test //且条件查询
void queryTest(){
//1、创建一个lambda查询器
LambdaQueryWrapper lqw =new LambdaQueryWrapper<>();
//2、书写条件 查询成绩大于90 且 小于100
lqw.lt(StudentInfo::getScore,100);
lqw.gt(StudentInfo::getScore,90);
//也可以链式写法:
//lqw.lt(StudentInfo::getScore,100).gt(StudentInfo::getScore,90);
//3、查询器传递给查询方法
List list = tDao.selectList(lqw);
System.out.println(list);
}
2、或条件查询:
@Test //或条件查询
void queryTest(){
//1、创建一个lambda查询器
LambdaQueryWrapper lqw =new LambdaQueryWrapper<>();
//2、书写条件 查询成绩大大于90 或 小于30
lqw.lt(StudentInfo::getScore,30).or().gt(StudentInfo::getScore,90);
//3、查询器传递给查询方法
List list = tDao.selectList(lqw);
System.out.println(list);
}
3、null值查询:
StudentInfo studentInfo = new StudentInfo();
studentInfo.setScore(30);
//判断前面的条件,如果是true就链接后面的条件
lqw.lt(null != studentInfo.getScore(), StudentInfo::getScore, 50);
4、查询投影:
StudentInfo studentInfo = new StudentInfo();
studentInfo.setScore(30);
//判断前面的条件,如果是true就链接后面的条件
lqw.lt(null != studentInfo.getScore(), StudentInfo::getScore, 50);
4、查询投影:
就是显示查询出来的部分字段,不是都显示全部字段
1)特定对象类型的投影查询:
@Test
//特定对象类型的投影查询
void queryTest() {
//1、创建一个lambda查询器
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2、书写条件 分数 和 姓名
lqw.select(StudentInfo::getScore,StudentInfo::getStuname);
//3、查询器传递给查询方法
List list = tDao.selectList(lqw);
System.out.println(list);
}
2)map类型的投影查询:
(查询总数count(*)必须用这种方法)
@Test
//map类型投影查询
void queryTest2(){
//1、创建一个查询器
QueryWrapper qw =new QueryWrapper<>();
// qw.select("count(*) as count"); 查询所有
qw.select("stuName","score");
//2、查询器传递给查询方法
List
3、分组统计:
@Test
//分组统计:
void queryTest2(){
//1、创建一个lambda查询器
QueryWrapper qw =new QueryWrapper<>();
qw.select("count(*) as count","score");
//2、分组条件
qw.groupBy("score");
//3、查询器传递给查询方法
List
4、eq等于查询:
用于密码验证等场景
@Test
//LambdaQueryWrapper方式查询
void queryTest() {
//1、创建一个lambda查询器
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2、查询分数为99且id为1的学生
lqw.eq(StudentInfo::getScore,99).eq(StudentInfo::getId,1);
//3、查询器传递给查询方法
StudentInfo one = tDao.selectOne(lqw); //selectOne专门用于查询一条数据
//查出来返回对象,查不出来返回null
System.out.println(one);
}
@Test
//QueryWrapper方式查询
void queryTest3(){
//1、创建一个lambda查询器
QueryWrapper qw =new QueryWrapper<>();
//2、查询条件
qw.eq("score",99);
//3、查询字段
qw.select("stuName","score");
//4、查询器传递给查询方法
List
5、模糊查询like:
对于Bottom来说like("B")表示B%,llike("B")表示%B.
@Test
//LambdaQueryWrapper方式模糊匹配
void queryTest() {
//1、创建一个lambda查询器
LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
//2、查询李*的学生
lqw.like(StudentInfo::getStuname,"李");
//3、查询器传递给查询方法
List list = tDao.selectList(lqw);
System.out.println(list);
}
6、映射匹配兼容性:
查询我们会发现:
1、数据库的表名与实体类的表名不一致
2、实体类有的字段表中不存在这个字段
3、实体类属性的名称与表的名称不匹配
对于Bottom来说like("B")表示B%,llike("B")表示%B.
查询我们会发现:
1、数据库的表名与实体类的表名不一致
2、实体类有的字段表中不存在这个字段
3、实体类属性的名称与表的名称不匹配
五、主键生成策略:
主要策略:
| lAUTO(0) | 使用数据库id自增策略控制id生成 |
| lNONE(1) | 不设置id生成策略 |
| lINPUT(2) | 用户手工输入id |
| lASSIGN_ID(3) | 雪花算法生成id(可兼容数值型与字符串型) |
| lASSIGN_UUID(4) | 以UUID生成算法作为id生成策略 |
雪花算法:
1、由64位二进制数组成
2、首位是0保证生成的数是正数
3、41位由当前时间戳生成
4、当同一时间戳收到了多条请求后面再加一段机器号防止重复
5、防止同一计器在同一时间收到多条请求出现了序列号,表示当前设备的第几个请求。
使用时候只需要在id上打上注解即可:
上述的表前缀和主键策略可以全局配置:
六、删除:
一)批量删除
之前在使用MyBatis的时候想要实现动态的批量删除需要使用forEach标签,操作十分复杂,有了MyBatis-Plus之后,我们只需要调用相应的API然后传入一个List即可实现批量删除。
二)逻辑删除:
逻辑删除:表面上好像是删除了,但是实际上执行的是update语句,是用一个字段作为标志,来表示这个数据是否被删除。
当执行查询语句时将不会再查询出来被逻辑删除的数据,因为Mybatis-Plus会自动加上一句 where deleted=0
下面的deleted字段就表示逻辑删除字段,1表示数据被删除,0表示数据没有被删除。
1、直接在实体类的属性上加注解:(不常用)
2、通用配置形式:
我们只需要在yml中进行配置即可:
1、在数据库中要有对应的deleted字段
2、一定要给deleted字段选上默认值选项



