MyBatisPlus
Posted sp_wxf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatisPlus相关的知识,希望对你有一定的参考价值。
这里写目录标题
- 1.MyBatisPlus概述
- 2.MyBatisPlus的开发步骤
- 3.MyBatisPlus的DQL编程控制(select操作)
- 4.DML编程控制(增、删、改操作)
- 5.mybatisPlus封装乐观锁
- 6.快速开发-代码生成器
- 7.通用Service
1.MyBatisPlus概述
一、MyBatisPlus介绍
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具
,旨在简化开发、提高效率
官网:
https://mybatis.plus/
https://mp.baomidou.com/
二、MyBatisPlus特性
- 无侵入:只做增强不做改变,不会对现有工程产生影响
- 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
- 支持 Lambda:编写查询条件无需担心字段写错
- 支持主键自动生成
- 内置分页插件
- …
2.MyBatisPlus的开发步骤
前提:当前项目使用了mybatis作为持久层框架
步骤一:引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
步骤二:继承BaseMapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User>
2.1 MyBatisPlus的CRUD操作
/**
* 新增
* insert(T t);
*/
@Test
void save()
User user = new User();
user.setName("黑马程序员");
user.setPassword("itheima");
user.setAge(12);
user.setTel("4006184000");
userDao.insert(user);
/**
* 根据主键删除
* deleteById(Serializable id);
*/
@Test
void deleteById()
userDao.deleteById(1625801212297658370L);
/**
* 根据条件删除
* delete(@Param("ew") Wrapper<T> queryWrapper);
*/
@Test
void deleteByCondition()
QueryWrapper<User> query = new QueryWrapper<>();
query.eq("age", 12);
userDao.delete(query);
/**
* 根据主键修改
* updateById(@Param("et") T entity);
*/
@Test
void updateById()
User user = new User();
user.setId(2L);
// 仅对设置的字段进行修改
user.setName("王晓峰");
userDao.updateById(user);
/**
* 根据条件修改
* update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
*/
@Test
void updateByCondition()
// 修改内容:将name改为Mr.Wang
User user = new User();
user.setName("Mr.Wang");
// 修改条件:年龄为12岁
UpdateWrapper<User> update = new UpdateWrapper<>();
update.eq("age", 12);
userDao.update(user, update);
/**
* 查询所有
* selectList(@Param("ew") Wrapper<T> queryWrapper);
*/
@Test
void selectList()
// 方式一
List<User> users = userDao.selectList(null);
System.out.println(users);
// 方式二
List<User> users_2 = userDao.selectList(new QueryWrapper<>());
System.out.println(users_2);
/**
* 根据条件查询
* selectList(@Param("ew") Wrapper<T> queryWrapper);
*/
@Test
void selectListByCondition()
QueryWrapper<User> query = new QueryWrapper<>();
query.eq("age", 12);
List<User> users_2 = userDao.selectList(query);
System.out.println(users_2);
/**
* 根据条件分页查询
* 前提:需要设置分页拦截器
* selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
*/
@Test
void selectPageByCondition()
QueryWrapper<User> query = new QueryWrapper<>();
query.eq("age", 12);
Page<User> userPage = userDao.selectPage(new Page<>(1, 2), query);
System.out.println(userPage);
2.2 MyBatisPlus的分页查询
一、设置分页拦截器(交给Spring管理)
package com.itheima.config;
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 mybatisPlusInterceptor()
//1 创建MybatisPlusInterceptor拦截器对象
MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
//2 添加分页拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
二、执行分页查询
//分页查询
@Test
void testSelectPage()
//1 创建IPage分页对象,设置分页参数
IPage<User> page=new Page<>(1,3);
//2 执行分页查询
userDao.selectPage(page,null);
//3 获取分页结果
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());
三、开启MyBatisPlus日志
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
四、解决日志打印过多问题
- 取消初始化spring日志打印
做法:在resources下新建一个logback.xml文件,名称固定,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
- 取消SpringBoot启动banner图标
spring:
main:
banner-mode: off # 关闭SpringBoot启动图标(banner)
- 取消MybatisPlus启动banner图标
# mybatis-plus日志控制台输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off # 关闭mybatisplus启动图标
3.MyBatisPlus的DQL编程控制(select操作)
3.1 条件查询方式
MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
3.1.1 条件查询
一、按条件查询
//方式一:按条件查询
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
二、lambda格式按条件查询
//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge, 10);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
三、lambda格式按条件查询(推荐)
//方式三:lambda格式按条件查询
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
3.1.2 组合条件
一、并且关系(and)
//并且关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
二、或者关系(or)
//或者关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
3.1.3 Null值处理
一、if语句控制条件追加
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
if(minAge!=null)
lqw.gt(User::getAge, minAge);
if(maxAge!=null)
lqw.lt(User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
二、条件参数控制
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge);
lqw.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
三、条件参数控制(链式编程)
Integer minAge=10; //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null; //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge)
.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);
3.2 查询投影-设置【查询字段、分组、分页】
3.2.1 查询结果包含模型类中部分属性
/*LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getId, User::getName, User::getAge);*/
//或者
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("id", "name", "age", "tel");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
3.2.2 查询结果包含模型类中未定义的属性
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel");
lqw.groupBy("tel");
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);
3.4 字段映射与表名映射
一、表的字段和实体类的属性名不对应
在模型类属性上方,使用@TableField属性注解,通过value属性,设置当前属性对应的数据库表中的字段关系。
二、对象中添加了数据库中未定义的属性
在模型类属性上方,使用@TableField注解,通过exist属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用
三、采用默认查询开放了更多的字段查看权限
在模型类属性上方,使用@TableField注解,通过select属性:设置该属性是否参与查询。此属性与select()映射配置不冲突。
四、表名与编码开发设计不同步
@Data
@TableName("tbl_user")
public class User
/*
id为Long类型,因为数据库中id为bigint类型,
并且mybatis有自己的一套id生成方案,生成出来的id必须是Long类型
*/
private Long id;
private String name;
@TableField(value = "pwd",select = false)
private String password;
private Integer age;
private String tel;
@TableField(exist = false) //表示online字段不参与CRUD操作
private Boolean online;
4.DML编程控制(增、删、改操作)
4.1 id生成策略控制(Insert)
主键生成的策略有哪几种方式?
不同的表应用不同的id生成策略
- 日志:自增(1,2,3,4,……)
- 购物订单:特殊规则(FQ23948AK3843)
- 外卖单:关联地区日期等信息(10 04 20200314 34 91)
- 关系表:可省略id
- …
4.1.1 id生成策略控制(@TableId注解)
4.1.2 全局策略配置
mybatis-plus:
global-config:
db-config:
# 使用雪花算法生成id
id-type: assign_id
# 表名前置全局配置
table-prefix: tbl_
相当于
4.2 多记录操作(批量Delete/Select)
一、按主键删除多条记录
//删除指定多条数据
List<Long> list = new ArrayList<>();
list.add(1402551342481838081L);
list.add(1402553134049501186L);
list.add(1402553619611430913L)MybatisPlus 快速构建MybatisPlus 原生mybatis(分页查询) 通用枚举 service 封装 自动填充
MybatisPlus 快速构建MybatisPlus 原生mybatis(分页查询) 通用枚举 service 封装 自动填充