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);
}
}新增注解
你提到的“实体类加注解”是 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_time和update_time,可以通过配置在插入或更新时自动赋值,不需要手动set。逻辑删除: 只需一个
@TableLogic注解,delete操作就会自动变成update set deleted = 1,查询时也会自动过滤掉已删除数据。