目录
1、快速入门
适用于单表操作
注解 | MyBatis-Plus (baomidou.com)
1.1 引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
复制代码
如果实体类不符合上方小黑板的规范?
1.2 常见注解
注:
以is开头的,布尔类型,mp会将isXxxx:去掉is,变量名就变为了Xxxx,这种就需要添加@TableField
1.3 常见配置
使用配置 | MyBatis-Plus (baomidou.com)
mybatis-plus:
type-aliases-package: com.shunhai.entity # 别名扫描包
mappper-lcations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值
configuration:
map-underscore-to-camel-case: ture # 是否开启下划线和驼峰命名的映射
cache-enabled: false # 是否开启二级缓存
global-config:
db-config:
id-type: auto/assign_id # id为雪花算法生成
update-strategy: not_null # 更新策略:只更新非空字段
复制代码
2、核心功能
2.1 条件构造器
案例
Lamda类型
总结
2.2 自定义SQL
案例
手写SQL
即可不在逻辑层编写sql
"ew"可以使用Constants.WRAPPER代替
2.3 Service接口
简单的案例就可以直接在controller层直接调用service返回数据。
Service
Serviceimpl
总结
Service开发基础业务接口
controller层
@Apioperation ("新增用户接口")
@PoStMapping
public void saveUser (@Reques tBody UserFormDTO userDTO){
// 1.把DTO拷贝到PO
User user = BeanUtil. copyProperties (userDTO, User .class) ;
// 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.查询用户PO
User user = userService.getById(id);
// 2.把PO拷贝到VO返回
return BeanUtil.copyProperties(user, UserVO.class);
}
@Apioperation ("根据ids查询用户接口")
@GetMapping
public List<UserVO> queryUserByIds(@ApiParam ("用户id集合") @RequestParam ("ids") List<Long> ids){
// 1.查询用户PO
List<User> users = userService.ListByIds(ids);
// 2.把PO拷贝到VO返回
return BeanUtil.copyToList(users, UserVO.class);
}
复制代码
需要编写自定义逻辑
controller层
@Apioperation ("扣减用户余额接口")
@PutMapping ("/{id}/deduction/{money}")
public void deductMoneyUserByIds(
@ApiParam ("用户id") @PathVariable ("id") Long id,
@ApiParam ("扣减的金额") @PathVariable ("money") Long id){
userService.deductBalance(id, money);
}
复制代码
Service
public interface UserService extends IService<User>{
void deductBalance(Long id, Integer money);
}
复制代码
ServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IuserService{
@Override
void deductBalance(Long id, Integer money){
// 1.查询用户
// 自己就有getById()
User user = getById(id)
// 2.校验用户状态(2:冻结)
if(user == null || user.getStatus() == 2){
throw new RuntimeException("用户状态异常");
}
// 3.校验余额是否充足
if(user.getBalance < money){
throw new RuntimeException("用户余额不足");
}
// 4.扣减余额(update tb_user set balance = balance - money)
baseMapper.deductBalance(id, money);
}
}
复制代码
UserMapper
public interface Usermapper extents BaseMapper<User> {
@Update ("update tb_user set balance = balance - #{money} where id = #{id}")
void deductBalance(@Param ("id") Long id, @Param ("money") Integer money);
}
复制代码
Lambda方法
原生
mp更改后
实体类
@Data
@ApiModel (description = "用户查询条件实体")
public class UserQuery {
@ApiModclPropcrty ("用户名关键字")
private String name;
@ApiModelProperty ("用户状态: 1--正常,2--冻结")
private Integer status;
@ApiModelProperly ("余额最小值")
private Integer minBalance;
@ApiModelproperty ("余额最大值")
private Integer maxBalance;
}
复制代码
controller
@Apioperation ("根据复杂条件查询用户接口")
@GetMapping ("/list")
public List<UserVO> queryUserByIds(UserQuery query){
// 1.查询用户PO
List<User> users = userService.queryUsers(query.getName(), query.getStatus(), query.getMinBalance(),query.getMaxBalance());
// 2.把PO拷贝到VO返回
return BeanUtil.copyToList(users, UserVO.class);
}
复制代码
impl中
@override
public List<user> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
return lamdaQuery()
.like(name != null, User::getUsername, name)
.eq(status != null, User::getStatus, status)
.ge(minBalance != null, User::getBalance, minBalance)
.le(maxBalance != null, User::getBalance, maxBalance)
.list();
}
复制代码
ServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IuserService{
@Override
@Transactional
void deductBalance(Long id, Integer money){
// 1.查询用户
// 自己就有getById()
User user = getById(id)
// 2.校验用户状态(2:冻结)
if(user == null || user.getStatus() == 2){
throw new RuntimeException("用户状态异常");
}
// 3.校验余额是否充足
if(user.getBalance < money){
throw new RuntimeException("用户余额不足");
}
// 4.扣减余额(update tb_user set balance = balance - money)
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();
}
}
复制代码
在yml文件的数据库datesoure的url后面拼一个:
Shanghai &rewriteBatchedStatements = true
3、扩展功能
3.1 代码生成
IDEA插件
代码生成
3.2 静态工具
在UserService层需要调用AddressService层(最好含有for循环的情况)的情况建议使用
3.3 逻辑删除
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体类字段名, 字段类型可以是booolean、intager
logic-delete-value: 1 # 逻辑已删除的值(默认为1)
logic-delete-delete-value: 0 # 逻辑未删除的值(默认为0)
复制代码
3.4 枚举处理器
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handler.MybatisEnumTypeHandler
复制代码
总结
3.5 JSON处理器
4、插件功能
4.1 分页插件
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor pageInterceptor = new paginationInnterceptor(DbType.MYSQL);
pageInterceptor.setMaxLimit(1000L); // 设置分页上限
interceptor.addInnterceptor(pageInterceptor);
return interceptor;
}
}
复制代码
4.2 通用分页实体
4.3 通用分页实体与MP转换
在PageQuery中添加方法,直接获取Page