Mybatis Plus是一个增强版的Mybatis框架,提供了许多开发效率和代码质量方面的改进。其中,Mybatis Plus Service层的封装是Mybatis Plus的一个重要特性。本文将会从以下几个方面对Mybatis Plus Service进行详细的阐述:
一、Mybatis Plus Service层简介
Mybatis Plus Service层是Mybatis Plus框架中的一个封装层,主要提供了对于单表的CRUD(增删改查)操作的封装。在Service接口中,Mybatis Plus提供了多种方法,可以很方便地完成对于单表的操作。同时,Mybatis Plus Service层还提供了对于分页查询、Lambda表达式等高级功能的支持,使得开发效率更高、代码质量更优。
二、Mybatis Plus Service层的使用
1、Mybatis Plus Service层的接口定义
在Mybatis Plus框架中,Service层接口的定义通常以 “BaseService
public interface BaseService<Entity> extends IService<Entity> { /** * 插入一条记录(选择字段,策略插入) * * @param entity 实体对象 * @return boolean */ boolean save(Entity entity); /** * 根据 ID 删除 * * @param id 主键ID * @return boolean */ boolean removeById(Serializable id); /** * 根据 ID 修改 * * @param entity 实体对象 * @return boolean */ boolean updateById(Entity entity); /** * 根据 ID 查询 * * @param id 主键ID * @return T */ Entity getById(Serializable id); /** * 查询多个id的记录 * * @param idList 主键ID列表 * @return List<T> */ List<Entity> listByIds(Collection<? extends Serializable> idList); /** * 查询所有记录 * * @return List<T> */ List<Entity> listAll(); }
2、Mybatis Plus Service层的实现
在使用Mybatis Plus Service层的时候,需要定义一个继承了IService的接口,并且实现对应的方法。Mybatis Plus提供了默认实现类,我们可以直接使用这些默认实现类来实现对应的Service层接口。比如ISchoolService的定义如下:
public interface ISchoolService extends IService<School> { }
我们可以直接使用ServiceImpl作为ISchoolService的实现类。具体的实现方法如下:
@Service public class SchoolServiceImpl extends ServiceImpl<SchoolMapper, School> implements ISchoolService { }
需要注意的是,在使用ServiceImpl作为Service层接口的实现类的时候,需要传递一个Mapper对象作为参数。我们可以通过@Autowired注解来注入对应的Mapper对象。
3、Mybatis Plus Service层的使用示例
假设我们有一个Student实体类,其对应的Mapper为StudentMapper。我们可以定义一个IStudentService服务层接口,实现对应的增删改查方法。其中,我们使用ServiceImpl作为IStudentService的实现类。具体的定义如下:
public interface IStudentService extends IService<Student> { /** * 根据学号查询学生信息 * @param studentNo 学号 * @return 学生信息 */ Student getByStudentNo(String studentNo); }
实现类StudentServiceImpl如下:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService { /** * 根据学号查询学生信息 * @param studentNo 学号 * @return 学生信息 */ public Student getByStudentNo(String studentNo) { QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Student::getStudentNo, studentNo); return this.getOne(queryWrapper); } }
在Service层接口中,我们定义了一个根据学号查询学生信息的方法。在实现类中,我们使用了Mybatis Plus提供的Lambda表达式进行条件查询,并使用getOne方法查询结果。
三、Mybatis Plus Service层的高级功能
1、分页查询
Mybatis Plus Service层提供了对于分页查询的支持。我们可以使用Page对象来进行分页查询。在Service层中,我们可以使用Service的list(Page page, Wrapper wrapper)方法来完成分页查询。其中,page对象代表当前分页的信息,wrapper对象代表查询条件(可以使用QueryWrapper或LambdaQueryWrapper进行组装)。具体的使用方法如下:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService { /** * 分页查询所有学生 * @param pageNo 当前页码 * @param pageSize 每页数量 * @return 分页信息 */ public Page<Student> listAllByPage(int pageNo, int pageSize) { Page<Student> page = new Page<>(pageNo, pageSize); QueryWrapper<Student> wrapper = new QueryWrapper<>(); return this.list(page, wrapper); } }
2、Lambda表达式
Mybatis Plus Service层还提供了对于Lambda表达式的支持。我们可以使用LambdaQueryWrapper代替QueryWrapper进行条件查询,使得我们的代码更加简洁。使用Lambda表达式,我们可以在编译期就进行语法检查,减少语法错误的出现。具体的使用方法如下:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService { /** * 根据姓名和年龄查询学生信息 * @param name 姓名 * @param age 年龄 * @return 学生信息 */ public List<Student> listByCondition(String name, int age) { LambdaQueryWrapper<Student> wrapper = new LambdaQueryWrapper<>() .eq(StringUtils.isNotBlank(name), Student::getName, name) .eq(age != 0, Student::getAge, age); return this.list(wrapper); } }
四、总结
Mybatis Plus的Service层封装是其特有的一个重要特性。在使用Mybatis Plus进行开发的时候,我们可以很方便地使用Service层接口进行单表的CRUD操作。同时,Service层还提供了对于分页查询、Lambda表达式等高级功能的支持,使得我们的开发效率更高、代码质量更优。