MyBiats plus

MyBatis-Plus (baomidou.com)

目录

1、快速入门

1.1 引入依赖

1.2 常见注解

1.3 常见配置

2、核心功能

2.1 条件构造器

案例

Lamda类型

总结

2.2 自定义SQL

案例

2.3 Service接口

总结

Service开发基础业务接口

Lambda方法

3、扩展功能

3.1 代码生成

3.2 静态工具

3.3 逻辑删除

3.4 枚举处理器

总结

3.5 JSON处理器

4、插件功能

4.1 分页插件

4.2 通用分页实体

4.3 通用分页实体与MP转换


1、快速入门

适用于单表操作

image.png

image.png

注解 | 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 常见注解

image.png

注:
以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 条件构造器

image.png

案例

image.png

image.png

image.png

image.png

Lamda类型

image.png

总结

image.png

2.2 自定义SQL

image.png

案例

手写SQL

image.png

即可不在逻辑层编写sql

image.png

"ew"可以使用Constants.WRAPPER代替

2.3 Service接口

简单的案例就可以直接在controller层直接调用service返回数据。

image.png

image.png

Service

image.png

Serviceimpl

image.png

总结

image.png

Service开发基础业务接口

image.png

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方法

image.png

原生

image.png

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();
}
复制代码

image.png

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();
    }
}
复制代码

image.png

在yml文件的数据库datesoure的url后面拼一个:
Shanghai &rewriteBatchedStatements = true

3、扩展功能

3.1 代码生成

IDEA插件

image.png

image.png

image.png

代码生成

image.png

image.png

3.2 静态工具

在UserService层需要调用AddressService层(最好含有for循环的情况)的情况建议使用

image.png

image.png

3.3 逻辑删除

image.png

image.png

mybatis-plus:
    global-config:
        db-config:
            logic-delete-field: deleted # 全局逻辑删除的实体类字段名, 字段类型可以是booolean、intager
            logic-delete-value: 1 # 逻辑已删除的值(默认为1)
            logic-delete-delete-value: 0 # 逻辑未删除的值(默认为0)
复制代码

image.png

3.4 枚举处理器

image.png

image.png

image.png

image.png

mybatis-plus:
    configuration:
        default-enum-type-handler: com.baomidou.mybatisplus.core.handler.MybatisEnumTypeHandler
复制代码

image.png

总结

image.png

3.5 JSON处理器

image.png

image.png

image.png

4、插件功能

4.1 分页插件

image.png

@Configuration
public class MybatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor pageInterceptor = new paginationInnterceptor(DbType.MYSQL);
        pageInterceptor.setMaxLimit(1000L); // 设置分页上限
        interceptor.addInnterceptor(pageInterceptor);
        return interceptor;
    }
}
复制代码

image.png

4.2 通用分页实体

image.png

image.png

image.png

image.png

4.3 通用分页实体与MP转换

image.png

在PageQuery中添加方法,直接获取Page

image.png

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值