Mybatis-plus

一、MyBatis-Plus 是什么?

一句话:MyBatis 的“超强外挂”,让数据库操作更简单!

  • 核心功能:自动生成基本 CRUD 代码,避免手写重复 SQL。
  • 优势:开发效率提升 50%,代码更简洁。
  • 特色
    • 自动分页
    • 注解配置表字段映射
    • 智能化条件构造器
    • 支持主流数据库(MySQL、PostgreSQL 等)

二、快速上手:5 分钟实现增删改查

1. 添加依赖


    com.baomidou
    mybatis-plus-boot-starter
    3.5.7




    mysql
    mysql-connector-j
    8.0.33

2. 配置数据源(application.yml)
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_test?useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启 SQL 日志
3. 编写实体类和 Mapper
@Data
@TableName("user_info") // 实体类对应表名
public class User {
    @TableId(type = IdType.AUTO) // 主键自增
    private Long id;
    private String name;
    private Integer age;
    @TableField("email") // 字段名映射(解决驼峰与下划线问题)
    private String email;
}
@Mapper
public interface UserMapper extends BaseMapper { 
    // 继承 BaseMapper 后,自动获得 CRUD 方法
}
4. 使用 MyBatis-Plus 的 CRUD
@SpringBootTest
public class UserTest {

    @Autowired
    private UserMapper userMapper;

    // 新增
    @Test
    void testInsert() {
        User user = new User();
        user.setName("Alice");
        user.setAge(25);
        user.setEmail("[email protected]");
        userMapper.insert(user); // 自动生成 INSERT 语句
    }

    // 查询
    @Test
    void testSelect() {
        User user = userMapper.selectById(1L); // SELECT * FROM user WHERE id=1
        List users = userMapper.selectList(null); // 查询所有
    }

    // 分页查询
    @Test
    void testPage() {
        Page page = new Page<>(1, 10); // 第1页,每页10条
        userMapper.selectPage(page, null); // 分页自动处理
    }

    // 更新
    @Test
    void testUpdate() {
        User user = new User();
        user.setId(1L);
        user.setAge(30);
        userMapper.updateById(user); // UPDATE user SET age=30 WHERE id=1
    }
}

三、高级功能:注解与条件构造器

1. 常用注解
  • @TableName:指定表名(默认自动匹配)
  • @TableField:字段映射(解决属性名与字段名差异)
  • @TableId:标记主键,支持策略(如自增、UUID)
2. 条件构造器:动态构建 SQL

QueryWrapper(手动指定字段名):

QueryWrapper wrapper = new QueryWrapper<>();
wrapper.gt("age", 20) // WHERE age > 20
       .like("name", "张") // AND name LIKE '%张%'
       .orderByDesc("create_time");
List users = userMapper.selectList(wrapper);

LambdaQueryWrapper(避免字段硬编码):

LambdaQueryWrapper lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.gt(User::getAge, 20)
             .like(User::getName, "李")
             .orderByDesc(User::getCreateTime);
List users = userMapper.selectList(lambdaWrapper);
3. 更新操作的构造器
UpdateWrapper updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 1)
             .set("age", 30)
             .set("email", "[email protected]");
userMapper.update(null, updateWrapper); // UPDATE user SET age=30, email='..' WHERE id=1

四、自定义 SQL:复杂场景的解决方案

1. 注解方式
@Select("SELECT * FROM user ${ew.customSqlSegment}")
List selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);

// 使用示例:
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, 18);
List users = userMapper.selectAll(wrapper);
2. XML 方式


五、核心重点总结

  1. 快速开发:继承 BaseMapper,自动获得 CRUD 方法,无需手动写 XML。
  2. 条件构造器
    • QueryWrapper:适合简单条件,但字段名需写死。
    • LambdaQueryWrapper:通过 Lambda 表达式引用属性,避免字段名错误。
  3. 注解灵活映射:处理表名和字段名不一致问题。
  4. 自定义 SQL:结合条件构造器,处理复杂查询或更新。

六、避坑指南

  • 字段映射出错时:检查 @TableField 的值是否正确。
  • 分页失效:确保添加分页拦截器。
  • 自定义 SQL 参数:必须用 ew 或 @Param(Constants.WRAPPER) 

你可能感兴趣的:(mybatis,java,后端)