MyBatis-plus

BaseMapper

正如你所说,MyBatis 需要你为每一个简单的增删改查(CRUD)编写 SQL(通常在 XML 中)。而 MyBatis-Plus 通过 BaseMapper<T> 接口,将这些操作封装成了 Java 函数。

  • MyBatis: 你需要定义接口,并在 XML 中写 SELECT * FROM user WHERE id = #{id}

  • MyBatis-Plus: 你的 Mapper 只需要继承 BaseMapper<User>,就可以直接调用 userMapper.selectById(1)

原理: MP 在启动时会根据你的实体类(Entity)信息,自动生成注入这些基础的 SQL 语句。

具体示例

 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 ​
 public interface UserMapper extends BaseMapper<User> {
     // 无需任何实现,继承BaseMapper就获得了CRUD能力
     
     // 如果需要自定义方法可以在这里声明
     // 例如:根据用户名查询
     User selectByUsername(@Param("username") String username);
 }
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.springframework.stereotype.Service;
 ​
 @Service
 public class UserService {
     
     @Autowired
     private UserMapper userMapper;
     
     // 1. 插入用户
     public int addUser(User user) {
         return userMapper.insert(user); // 返回影响行数
     }
     
     // 2. 根据ID查询
     public User getUserById(Long id) {
         return userMapper.selectById(id);
     }
     
     // 3. 更新用户
     public int updateUser(User user) {
         return userMapper.updateById(user);
     }
     
     // 4. 删除用户(逻辑删除)
     public int deleteUser(Long id) {
         return userMapper.deleteById(id);
     }
     
     // 5. 条件查询
     public List<User> getUsersByAge(Integer age) {
         QueryWrapper<User> wrapper = new QueryWrapper<>();
         wrapper.eq("age", age)
                .orderByDesc("create_time");
         return userMapper.selectList(wrapper);
     }
     
     // 6. 分页查询
     public Page<User> getUsersByPage(Integer pageNum, Integer pageSize) {
         Page<User> page = new Page<>(pageNum, pageSize);
         return userMapper.selectPage(page, null);
     }
 }

方法名

说明

对应SQL

insert(T entity)

插入

INSERT INTO...

deleteById(Serializable id)

按ID删除

DELETE FROM...WHERE id=...

updateById(T entity)

按ID更新

UPDATE...WHERE id=...

selectById(Serializable id)

按ID查询

SELECT * FROM...WHERE id=...

selectBatchIds(Collection ids)

批量ID查询

SELECT * FROM...WHERE id IN...

selectList(Wrapper wrapper)

条件查询

SELECT * FROM...WHERE...

selectPage(Page page, Wrapper wrapper)

分页查询

SELECT * FROM...LIMIT...

新增注解

你提到的“实体类加注解”是 MP 实现自动化 SQL 的基础。

  • @TableName: 指定实体类对应的数据库表名。

  • @TableId: 指定主键,并可以配置主键生成策略(如雪花算法、自增等)。

  • @TableField: 处理字段名与数据库列名不一致的情况,或者排除非数据库字段。

这种方式极大地减少了 ResultMap 的配置工作,让代码更加整洁。

Wrapper

这是 MP 的灵魂。它允许你通过 Java 代码动态构建复杂的 WHERE 条件,而不需要在 XML 里写大量的 <if> 标签。

 // 多条件查询
 QueryWrapper<User> wrapper = new QueryWrapper<>();
 wrapper.like("username", "张")  // 用户名包含"张"
        .between("age", 20, 30)  // 年龄20-30岁
        .isNotNull("email")      // 邮箱不为空
        .orderByDesc("create_time"); // 按创建时间降序
 ​
 List<User> users = userMapper.selectList(wrapper);

内置的分页插件

  • MyBatis: 通常需要引入 PageHelper 插件。

  • MyBatis-Plus: 自带分页插件,你只需要配置一个 Interceptor,然后在代码里传一个 Page 对象即可。

自动填充与逻辑删除

  • 自动填充: 比如 create_timeupdate_time,可以通过配置在插入或更新时自动赋值,不需要手动 set

  • 逻辑删除: 只需一个 @TableLogic 注解,delete 操作就会自动变成 update set deleted = 1,查询时也会自动过滤掉已删除数据。


比较是偷走幸福的小偷