3.5、Repository层实现
分类: 搭建单体商城服务
Repository 层实现
Repository 层是数据访问层,负责与数据库交互。MyBatis-Plus 提供了 BaseMapper,大大简化了 Repository 层的实现。本节将学习如何实现 Repository 层。
本节将学习:BaseMapper 使用、自定义查询方法、分页查询,以及条件构造器。
BaseMapper 使用
BaseMapper 接口
BaseMapper 是 MyBatis-Plus 提供的通用 Mapper 接口,包含了基础的 CRUD 方法。
Mapper 接口定义
package com.example.ecommerce.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.ecommerce.entity.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { // BaseMapper 已经提供了基础的 CRUD 方法 // 无需手动编写 SQL }
BaseMapper 提供的方法
BaseMapper 常用方法:
int insert(T entity):插入一条记录int deleteById(Serializable id):根据 ID 删除int deleteBatchIds(Collection<? extends Serializable> idList):批量删除int updateById(T entity):根据 ID 更新T selectById(Serializable id):根据 ID 查询List<T> selectList(Wrapper<T> queryWrapper):条件查询列表Page<T> selectPage(Page<T> page, Wrapper<T> queryWrapper):分页查询
自定义查询方法
使用注解定义方法
package com.example.ecommerce.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.ecommerce.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @Mapper public interface UserMapper extends BaseMapper<User> { /** * 根据用户名查询用户 */ @Select("SELECT * FROM user WHERE username = #{username}") User selectByUsername(String username); /** * 根据邮箱查询用户 */ @Select("SELECT * FROM user WHERE email = #{email}") User selectByEmail(String email); }
使用 XML 定义方法
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.ecommerce.mapper.UserMapper"> <!-- 根据用户名和状态查询用户 --> <select id="selectByUsernameAndStatus" resultType="com.example.ecommerce.entity.User"> SELECT * FROM user WHERE username = #{username} AND status = #{status} </select> <!-- 统计活跃用户数 --> <select id="countActiveUsers" resultType="java.lang.Long"> SELECT COUNT(*) FROM user WHERE status = 1 </select> </mapper>
UserMapper.java:
@Mapper public interface UserMapper extends BaseMapper<User> { User selectByUsernameAndStatus(@Param("username") String username, @Param("status") Integer status); Long countActiveUsers(); }
分页查询
分页插件配置
package com.example.ecommerce.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
分页查询示例
// 创建分页对象 Page<User> page = new Page<>(1, 10); // 第1页,每页10条 // 无条件分页查询 Page<User> result = userMapper.selectPage(page, null); // 条件分页查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); Page<User> result = userMapper.selectPage(page, wrapper); // 获取分页结果 List<User> records = result.getRecords(); // 当前页数据 long total = result.getTotal(); // 总记录数 long pages = result.getPages(); // 总页数 long current = result.getCurrent(); // 当前页 long size = result.getSize(); // 每页大小
条件构造器
QueryWrapper 使用
QueryWrapper 是 MyBatis-Plus 提供的条件构造器,用于构建查询条件。
// 等值查询 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); // 模糊查询 wrapper.like("username", "admin"); // 范围查询 wrapper.between("create_time", startTime, endTime); // 排序 wrapper.orderByDesc("create_time"); // 组合条件 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1) .like("username", "admin") .between("create_time", startTime, endTime) .orderByDesc("create_time");
LambdaQueryWrapper 使用
LambdaQueryWrapper 使用 Lambda 表达式,避免字段名写错。
// 使用 Lambda 表达式 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getStatus, 1) .like(User::getUsername, "admin") .between(User::getCreateTime, startTime, endTime) .orderByDesc(User::getCreateTime);
条件构造器方法
完整 Repository 示例
UserMapper 完整示例
package com.example.ecommerce.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.ecommerce.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @Mapper public interface UserMapper extends BaseMapper<User> { /** * 根据用户名查询用户 */ @Select("SELECT * FROM user WHERE username = #{username}") User selectByUsername(@Param("username") String username); /** * 根据邮箱查询用户 */ @Select("SELECT * FROM user WHERE email = #{email}") User selectByEmail(@Param("email") String email); /** * 分页查询活跃用户 */ @Select("SELECT * FROM user WHERE status = 1 ORDER BY create_time DESC") IPage<User> selectActiveUsers(Page<User> page); }
使用示例
@Service public class UserService { @Autowired private UserMapper userMapper; public User getUserByUsername(String username) { return userMapper.selectByUsername(username); } public Page<User> getActiveUsers(Integer current, Integer size) { Page<User> page = new Page<>(current, size); return userMapper.selectActiveUsers(page); } }
官方资源
- MyBatis-Plus BaseMapper:https://baomidou.com/pages/49cc81/
- MyBatis-Plus 条件构造器:https://baomidou.com/pages/10c804/
- MyBatis-Plus 分页插件:https://baomidou.com/pages/97710a/
本节小结
在本节中,我们学习了:
第一个是 BaseMapper 使用。 BaseMapper 提供了基础的 CRUD 方法,无需手动编写 SQL。
第二个是自定义查询方法。 使用 @Select 注解或 XML 文件定义自定义查询方法。
第三个是分页查询。 使用 Page 对象和分页插件实现分页查询。
第四个是条件构造器。 使用 QueryWrapper 和 LambdaQueryWrapper 构建查询条件。
这就是 Repository 层实现。通过 MyBatis-Plus,我们可以大大简化数据访问层的代码。
在下一节,我们将学习如何实现 Service 层,封装业务逻辑。