Mybatis-plus

一、MyBatis-Plus 是什么?

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

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

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

1. 添加依赖
<!-- Spring Boot -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>
</dependency>
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<User> { 
    // 继承 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("alice@example.com");
        userMapper.insert(user); // 自动生成 INSERT 语句
    }

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

    // 分页查询
    @Test
    void testPage() {
        Page<User> 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<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20) // WHERE age > 20
       .like("name", "张") // AND name LIKE '%张%'
       .orderByDesc("create_time");
List<User> users = userMapper.selectList(wrapper);

LambdaQueryWrapper(避免字段硬编码):

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

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

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

// 使用示例:
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(User::getAge, 18);
List<User> users = userMapper.selectAll(wrapper);
2. XML 方式
<!-- UserMapper.xml -->
<select id="selectByCustom" resultType="User">
    SELECT id, name FROM user ${ew.customSqlSegment}
</select>

五、核心重点总结

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

六、避坑指南

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值