顾乔芝士网

持续更新的前后端开发技术栈

【MyBatis-Plus】3小时解锁持久层开发!原来SQL还能这样玩?

Day01学习成果报告 | 附打鸡血学习秘籍

今日技术干货提炼(精华版)

一、灵魂三连击:常用注解全掌握

  • @TableName:实体类与数据库表的"红娘",轻松解决表名映射难题
  • @TableId:主键标识神器,雪花算法自动填充ID不是梦(type = IdType.ASSIGN_ID)
  • @TableField:字段映射万金油,解决驼峰转下划线、逻辑删除等疑难杂症

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    @TableField(is_married")
    private Boolean isMarried;
    @TableField("`concat`")
    private String concat;
}

二、条件构造器:告别SQL拼接噩梦

  • QueryWrapper:字符串式条件构造(当心字段名手抖写错!)
  • LambdaQueryWrapper:λ表达式真香警告!编译期检查保平安
@Test
void testQueryWrapper() {
    // 1.构建查询条件 where name like "%o%" AND balance >= 1000
    QueryWrapper wrapper = new QueryWrapper()
            .select("id", "username", "info", "balance")
            .like("username", "o")
            .ge("balance", 1000);
    // 2.查询数据
    List users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}
@Test
void testLambdaQueryWrapper() {
    // 1.构建条件 WHERE username LIKE "%o%" AND balance >= 1000
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.lambda()
            .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
            .like(User::getUsername, "o")
            .ge(User::getBalance, 1000);
    // 2.查询
    List users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

三、自定义SQL:自由与规范的完美平衡

  • XML中${ew.customSqlSegment}接收Wrapper条件
  • 复杂查询与MP的优雅结合(分页插件真香!)

四、Service接口:CRUD从未如此优雅

  • IService:批量操作、链式查询等开箱即用
  • 链式调用:list().eq().like()行云流水
List users = userService.lambdaQuery()
                            .eq(User::getStatus, 1)
                            .like(User::getName, "王")
                            .list();
@Override
@Transactional
public void deductBalance(Long id, Integer money) {
    // 1.查询用户
    User user = getById(id);
    // 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 - ?
    int remainBalance = user.getBalance() - money;
    lambdaUpdate()
            .set(User::getBalance, remainBalance) // 更新余额
            .set(remainBalance == 0, User::getStatus, 2) // 动态判断,是否更新status
            .eq(User::getId, id)
            .eq(User::getBalance, user.getBalance()) // 乐观锁
            .update();
}
  • 我的打鸡血学习法(亲测有效!)
  • 今天的3小时高效学习验证了一个真理:状态决定效率!边看视频边对照官方文档,双线程输入让理解更立体。学习感悟:当思维处于活跃峰值时,抽象的技术概念会像拼图一样自动拼接成型。特别是理解Wrapper的设计思想时,突然顿悟到"把条件封装成对象"的OOP精髓,这种开窍瞬间让人欲罢不能!
  • 互动话题:你在学习MyBatis-Plus时踩过哪些坑?评论区说出你的故事~ (被@TableField坑过的举个手♂)





控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言