一、什么是MybatisPlus
二、入门案例
2.1 引入依赖
2.2 定义Mapper
BaseMapper提前封装了许多写好的sql语句
三、常见注解
四、常用配置
五、mybatisPlus使用流程
六、条件构造器
6.1 案例(基于QueryWrapper)的查询
@Test
void testQueryWrapper(){
//1.构建查询条件
QueryWrapper<User> wapper=new QueryWrapper<User>()
.select("id","username","info","balance")
.like("username","o")
.ge("balance",1000);
//2.查询
List<User> users = userMapper.selectList(wapper);
users.forEach(System.out::println);
}
//用lamda可以避免硬编码
@Test
void testLambdaQueryWrapper(){
//1.构建查询条件
LambdaQueryWrapper<User> wapper=new LambdaQueryWrapper<User>()
.select(User::getId,User::getUsername,User::getInfo,User::getBalance)
.like(User::getUsername,"o")
.ge(User::getBalance,1000);
//2.查询
List<User> users = userMapper.selectList(wapper);
users.forEach(System.out::println);
}
@Test
void testUpdateWrapper(){
//1.要更新的数据
User user = new User();
user.setBalance(2000);
//1.构建更新条件
QueryWrapper<User> wapper=new QueryWrapper<User>()
.eq("username","jack");
//2.更新
userMapper.update(user,wapper);
}
@Test
void testUpdateWrapper(){
//1.构建更新条件
// List<Long> ids=List.of(1L,2L,3L,4L);
List<Long> ids =new ArrayList<>();
ids.add(1L);
ids.add(2L);
ids.add(4L);
UpdateWrapper<User> wrapper=new UpdateWrapper<User>()
.setSql("balance=balance-200")
.in("id",ids);
//2.更新
userMapper.update(null,wrapper);
}
七、自定义sql
八、Service接口
Service接口继承IService Service接口的实现类继承IService的实现类(ServiceImpl)
九、案例(基于Restful风格实现下列接口)
9.1 Controller 层
ackage com.itheima.mp.Controller;
import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "用户管理")
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final IUserService userService;
@ApiOperation("新增用户接口")
@PostMapping
public void saveUser(@RequestBody UserFormDTO userDTO) {
//1.把DTO拷贝到PO
User user = new User();
BeanUtils.copyProperties(userDTO, user);
//2.新增
userService.save(user);
}
@ApiOperation("删除用户接口")
@DeleteMapping("{id}")
public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
userService.removeById(id);
}
@ApiOperation("根据id查询用户接口")
@GetMapping("{id}")
public UserVO QueryUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
//1.根据id查询用户
User user = userService.getById(id);
//2.把PO拷贝到vo
return BeanUtil.copyProperties(user, UserVO.class);
}
@ApiOperation("根据id批量查询用户接口")
@GetMapping
public List<UserVO> QueryUserByIds(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) {
//1.根据id查询用户
List<User> users = userService.listByIds(ids);
//2.把PO拷贝到vo
return BeanUtil.copyToList(users, UserVO.class);
}
@ApiOperation("根据id扣减余额")
@PutMapping("/{id}/deduction/{money}")
public void deductMoneyByid(
@ApiParam("用户id") @PathVariable("id") Long id,
@ApiParam("扣减金额") @PathVariable("money") Integer money) {
userService.deductBalance(id, money);
}
}
9.2 Service层
ackage com.itheima.mp.Controller;
import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "用户管理")
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
private final IUserService userService;
@ApiOperation("新增用户接口")
@PostMapping
public void saveUser(@RequestBody UserFormDTO userDTO) {
//1.把DTO拷贝到PO
User user = new User();
BeanUtils.copyProperties(userDTO, user);
//2.新增
userService.save(user);
}
@ApiOperation("删除用户接口")
@DeleteMapping("{id}")
public void deleteUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
userService.removeById(id);
}
@ApiOperation("根据id查询用户接口")
@GetMapping("{id}")
public UserVO QueryUserById(@ApiParam("用户id") @PathVariable("id") Long id) {
//1.根据id查询用户
User user = userService.getById(id);
//2.把PO拷贝到vo
return BeanUtil.copyProperties(user, UserVO.class);
}
@ApiOperation("根据id批量查询用户接口")
@GetMapping
public List<UserVO> QueryUserByIds(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) {
//1.根据id查询用户
List<User> users = userService.listByIds(ids);
//2.把PO拷贝到vo
return BeanUtil.copyToList(users, UserVO.class);
}
@ApiOperation("根据id扣减余额")
@PutMapping("/{id}/deduction/{money}")
public void deductMoneyByid(
@ApiParam("用户id") @PathVariable("id") Long id,
@ApiParam("扣减金额") @PathVariable("money") Integer money) {
userService.deductBalance(id, money);
}
}
十、案例 (IService的Lambda查询)
10.1 Controller
@ApiOperation("根据复杂条件查询用户接口")
@GetMapping("/list")
public List<UserVO> QueryUsers(UserQuery userQuery) {
//1.根据id查询用户
List<User> users = userService.queryUsers(userQuery.getName(),
userQuery.getStatus(),
userQuery.getMinBalance(),
userQuery.getMaxBalance());
//2.把PO拷贝到vo
return BeanUtil.copyToList(users, UserVO.class);
}
}
10.2 Service层
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
return lambdaQuery()
.like(name!= null,User::getUsername, name)
.eq(status!= null,User::getStatus, status)
.gt(minBalance!= null,User::getBalance, minBalance)
.le(maxBalance!= null,User::getBalance, maxBalance)
.list();
}
十一、案例(IService的Lambda更新)
10.1 Service层
@Override
@Transactional
public void deductBalance(Long id, Integer money) {
//1.查询用户
User user = this.getById(id);
//2.校验用户状态
if (user == null || user.getStatus()==2) {
throw new RuntimeException("用户不存在或状态异常");
}
//3.校验余额是否充足
if (user.getBalance() < money) {
throw new RuntimeException("余额不足");
}
//4.扣减余额
int remainBalance = user.getBalance() - money;
lambdaUpdate()
.set(User::getBalance, remainBalance)
.set(remainBalance == 0,User::getStatus,2)
.eq(User::getId, id)
.eq(User::getBalance,user.getBalance())//乐观锁
.update();
}
十二、IService批量新增
十三、 扩展功能
13.1 代码生成
13.2 静态工具
13.3 逻辑删除
13.4 枚举处理器
13.5 JOSN处理器
13.6 分页插件