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坑过的举个手♂)