简介
快速入门
案例
一、原工程启动
1.创建microService空工程147
2.new module from existing
3.创建mp库表
二、升级MabtisPlus
常见注解
小结
常见配置
核心功能
条件构造器
案例QueryWrapper
@SpringBootTest
public class WrapperTest {
@Autowired
private UserMapper userMapper;
/**
* 查询名字带o的,存款大于1000的
*/
@Test
public void testqueryWrapper() {
// 查询
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
// 查询列
userQueryWrapper.select("id", "username", "info", "balance" );
// 查询条件
// 名字带 o
userQueryWrapper.like("username", "o");
// 存款大于1000
userQueryWrapper.ge("balance", 1000);
List<User> users = userMapper.selectList(userQueryWrapper);
users.forEach(System.out::println);
}
/**
* 更新名字为“jack"的余额为2000
*/
@Test
public void testUpdateWrapper() {
User user = new User();
user.setBalance(2000);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
useQueryeWrapper.eq("username", "Jack");
userMapper.update(user, userQueryWrapper);
}
}
案例UpdateWrapper
/**
* id为 1,2,4的用户余额,扣200
*/
@Test
public void testUpdateWrapper() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 自定义更新语句
updateWrapper.setSql("balance = balance-200");
updateWrapper.in("id", 1,2,4);
userMapper.update(null, updateWrapper);
}
案例LambdaQueryWrapper
/**
* 查询名字带o的,存款大于1000的
*/
@Test
public void testLambdaWrapper() {
// 查询
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 查询列
lambdaQueryWrapper.select(User::getId, User::getUsername, User::getInfo, User::getBalance);
// 查询条件
// 名字带 o
lambdaQueryWrapper.like(User::getUsername, "o");
// 存款大于1000
lambdaQueryWrapper.ge(User::getBalance, 1000);
List<User> users = userMapper.selectList(lambdaQueryWrapper);
users.forEach(System.out::println);
}
自定义SQL
IService接口
案例:基于Restful实现下面接口
验证Knife4j配置
<!-- 引入 knife4j 文档-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
Knife4j:
enable: true # 开启
openapi:
title: 用户接口管理
description: 用户接口管理文档
version: 1.0.0
contact: djzhou
group:
default:
group-name: default
api-rule: package
api-rule-resources:
- com.itheima.mp.controller
IService的Lambda应用
IService的LambdaQuery
方式一
@ApiOperation("根据条件查询用户列表")
@PostMapping("/list")
public List<UserVO> queryList(@RequestBody UserQuery query){
String userName = query.getName();
Integer status = query.getStatus();
Integer minBalance = query.getMinBalance();
Integer maxBalance = query.getMaxBalance();
QueryWrapper<User> wrapper = new QueryWrapper<User>();
// if(StringUtils.isNotBlank(userName)) {
// wrapper.lambda().like(User::getUsername, userName);
// }
// 条件成立,才会设置当前条件到where中
wrapper.lambda().like(StringUtils.isNotBlank(userName), User::getUsername, userName)
.eq(User::getStatus, status)
.ge(ObjectUtils.isNotEmpty(minBalance), User::getBalance, minBalance)
.le(ObjectUtils.isNotEmpty(maxBalance), User::getBalance, maxBalance);
List<User> list = userService.list(wrapper);
return BeanUtil.copyToList(list, UserVO.class);
}
方式二
List<User> list = userService.lambdaQuery()
.like(StringUtils.isNotBlank(userName), User::getUsername, userName)
.eq(User::getStatus, status)
.ge(ObjectUtils.isNotEmpty(minBalance), User::getBalance, minBalance)
.le(ObjectUtils.isNotEmpty(maxBalance), User::getBalance, maxBalance)
.list();
IService的LambdaUpdate
public void deductBalanceById(Long id, Integer amount) {
User user = this.getById(id);
if(user == null || user.getStatus() == UserStatusEnum.FREEZE) {
throw new RuntimeException("用户不存在或者用户已冻结");
}
if (user.getBalance() < amount) {
throw new RuntimeException("用户余额不足");
}
// 扣减
// 获取扣减后的余额
int remainBalance = user.getBalance() - amount;
// update user set balance = ? where id = ?
// update user set balance = ?, status = ? where id = ?
this.lambdaUpdate()
.set(User::getBalance, remainBalance)
// 余额为0时候,状态改为2
.set(remainBalance == 0, User::getStatus, UserStatusEnum.FREEZE)
.eq(User::getId, id)
.update();
// xml 方式
// userMapper.deductBalanceById(amount, id);
}
批量插入数据的优化
小结
拓展功能
代码生成
IDEA插件
代码方式
小结
静态工具类Db
Dbtest
@SpringBootTest
public class DbTest {
// 1.根据id查询用户
@Test
public void testGetById() {
User user = Db.getById(5L, User.class);
System.out.println(user);
}
// 2.查询名字包含o的用户,余额大于等于1000用户
@Test
public void testGetByMap() {
// 创建条件
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getUsername, "o")
.ge(User::getBalance, 1000);
// 查询
List<User> result = Db.list(lambdaQueryWrapper);
System.out.println(result);
}
// 3.更新用户Rose余额为@SpringBootTest
public class DbTest {
// 1.根据id查询用户
@Test
public void testGetById() {
User user = Db.getById(5L, User.class);
System.out.println(user);
}
// 2.查询名字包含o的用户,余额大于等于1000用户
@Test
public void testGetByMap() {
// 查询
List<User> result = Db.lambdaQuery(User.class)
.like(User::getUsername, "o")
.ge(User::getBalance, 1000)
.list();
System.out.println(result);
}
// 3.更新用户Rose余额为800
@Test
public void testUpdate() {
Db.lambdaUpdate(User.class)
.eq(User::getUsername, "Rose")
.set(User::getBalance, 800)
.update();
}
}
静态工具查询
单个id查询
批量查询
枚举处理器
案例
步骤
小结
JSON处理器
案例
步骤
分页插件
插件功能
分页插件
// 测试分页查询
@Test
public void testPageQuery() {
// 1. 创建分页对象
Page<User> page = new Page<>(1, 5);
// 2. 执行分页查询
Page<User> userPage = userService.page(page);
// 3. 获取分页结果
List<User> records = userPage.getRecords();
records.forEach(System.out::println);
System.out.println(userPage.getCurrent());
System.out.println(userPage.getPages());
System.out.println(userPage.getTotal());
}
逻辑删除
@TableLogic注解:
插入一条数据
@Test public void testInsert() {
User user = new User(); user.setName("字母哥");
user.setAge(18);
int row = userMapper.insert(user);
}
插入数据的时候,不需要为deleted字段赋值
删除一条记录:
userMapper.deleteById(1286797255805796354L);
查看数据库可以发现这条数据仍然存在,只不过逻辑删除字段值被设置为1:
查询记录
userMapper.selectList(null);
会自动添加过滤条件WHERE deleted=0
全局配置参数
#逻辑已删除值(默认为 1) #逻辑未删除值(默认为 0)
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0