MybatisPlus自定义SQL查询及分页查询和通用Service的使用

上一篇写的是MybatisPlus之MP注解的使用

(跟上一篇是同一个项目)先来创一个Springboot测试项目

创建一个数据库

-- 创建表
CREATE TABLE t_employee(
   id INT(11) PRIMARY KEY AUTO_INCREMENT,
   user_name VARCHAR(50),
   email VARCHAR(50),
   gender CHAR(1),
   age INT
);
INSERT INTO t_employee(user_name,email,gender,age) VALUES('Tom','[email protected]',1,22);
INSERT INTO t_employee(user_name,email,gender,age) VALUES('Jerry','[email protected]',0,25);
INSERT INTO t_employee(user_name,email,gender,age) VALUES('Black','[email protected]',1,30);
INSERT INTO t_employee(user_name,email,gender,age) VALUES('White','[email protected]',0,35);

创建一个实体类

记得给get、set和tostring

//名称一致时,此注解可以省略
public class t_employee {
	//主键生成策略,value属性可选,当属性名与表中的列名不一致,必填
    private Integer id;//编号
    private String userName;//用户名
    private String email;//邮箱
    private Integer gender;//性别
    private Integer age;//年龄
    ...
    记得给get、set和tostring

Mapper接口

在dao包下创建EmployeeMapper接口,继承BaseMapper接口,不用编写xml映射文件

public interface EmployeeMapper extends BaseMapper<Employee> {
}

自定义SQL查询及分页查询

自定义SQL查询

自定义SQL查询,常用的方式有注解方式和xml方式,与MyBatis的用法一致

注解方式
mapper接口
public interface EmployeeMapper extends BaseMapper<Employee> {

    /**
     * 查询员工数据
     * @return
     */
    @Select("select * from t_employee")
    List<Employee> findEmployeeList();
}
测试
@Test
public void testFindEmpList() {
    List<Employee> list = this.employeeMapper.findEmployeeList();
    for (Employee employee : list) {
        System.out.println(employee);
    }
}
xml方式
mapper接口
public interface UserMapper extends BaseMapper<User> {
    /**
     * 查询用户列表
     * @return
     */
    List<User> findUserList(); 
}
mapper映射文件

如果在mapper接口相同目录下创建与接口同名的mapper映射文件,application.properties配置文件则不用进行任何配置

如果mapper映射文件是放在resource资源文件夹下的mapper目录,application.properties配置文件需要进行加载映射文件

#加载映射文件
mybatis-plus.mapper-locations=classpath:mapper/*.xml

resource/mapper目录下的UserMapper映射文件:



<mapper namespace="com.kazu.mybatisplus.dao.UserMapper">
    <select id="findUserList" resultType="com.kazu.mybatisplus.entity.User">
        select * from user
    select>
mapper>
测试
@Test
public void testFindUserList() {
    //调用自定义查询方法
    List<User> users = userMapper.findUserList();
    for (User user : users) {
        System.out.println(user);
    }
}

分页查询

概述

MyBatisPlus支持分页插件(非PageHelper分页插件)

MyBatisPlus3+版本不支持PageHelper插件

使用MyBatisPlus分页插件需要编写配置类

分页插件配置类

在config包下创建分页插件配置类

@EnableTransactionManagement//开启事务
@Configuration
@MapperScan("com.kazu.mybatisplus.dao")//加载mp接口
public class MyBatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}
测试分页插件
@Test
public void testSelectPage() {
    //创建条件构造器
    QueryWrapper<Employee> queryWrapper = new QueryWrapper<Employee>();
    queryWrapper.ge("age",15);
    //创建分页对象
    Page<Employee> page = new Page<Employee>(1,2);
    //分页查询
    IPage<Employee> iPage = employeeMapper.selectPage(page,queryWrapper);
    System.out.println("当前页码:" + iPage.getCurrent());
    System.out.println("每页显示数量:" + iPage.getSize());
    System.out.println("总记录数:" + iPage.getTotal());
    System.out.println("总页数:" + iPage.getPages());
    List<Employee> employeeList = iPage.getRecords();//员工数据集合
    for (Employee employee : employeeList) {
        System.out.println(employee);
    }
}
案例-使用接口的方式实现分页

第一步:定义分页插件配置类

第二步:定义mapper接口

第三步:测试

定义分页插件配置类

配置类代码同上

定义mapper接口
    /**
     * 分页查询
     * @param page
     * @return
     */
    @Select("select * from t_employee")
    IPage<Employee> findEmployeeListByPage(Page<Employee> page);
测试
@Test
public void testFindEmployeeListByPage() {
    //创建分页对象
    Page<Employee> page = new Page<Employee>(1,2);
    //分页查询
    IPage<Employee> iPage = employeeMapper.findEmployeeListByPage(page);
    System.out.println("当前页码:" + iPage.getCurrent());
    System.out.println("每页显示数量:" + iPage.getSize());
    System.out.println("总记录数:" + iPage.getTotal());
    System.out.println("总页数:" + iPage.getPages());
    List<Employee> employeeList = iPage.getRecords();//员工数据集合
    for (Employee employee : employeeList) {
        System.out.println(employee);
    }
}

通用Service

概述

说明:

  • 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除``list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
  • 对象 Wrapper 为 条件构造器
  • 使用通用Service进行CRUD操作,业务层接口只需继承IService接口即可,其中T为泛型。

通用Service的使用

自定义Service接口

自定义Service接口,继承IService接口

public interface UserService extends IService<User> {

}
测试通用Service接口

添加测试类,注入自定义Service接口

@RunWith(SpringRunner.class)
@SpringBootTest
public class Mybaitsplus02ApplicationTests {

    //注入UserService
    @Resource
    private UserService userService;

    /**
     * 新增
     */
    @Test
    public void testSave() {
        User user = new User();
        user.setAge(20);
        user.setEmail("[email protected]");
        user.setName("test");
        //调用新增方法
        boolean flag = userService.save(user);
        System.out.println(flag ? "新增成功" :"新增失败");
    }

    /**
     * 批量新增
     */
    @Test
    public void testSaveBatch() {
        User user1 = new User();
        user1.setAge(22);
        user1.setEmail("[email protected]");
        user1.setName("露西");

        User user2 = new User();
        user2.setAge(20);
        user2.setEmail("[email protected]");
        user2.setName("露露");
        //调用新增方法
        boolean flag = userService.saveBatch(Arrays.asList(user1,user2));
        System.out.println(flag ? "新增成功" :"新增失败");
    }
    /**
     * 批量新增或修改
     */
    @Test
    public void testSaveOrUpdateBatch() {
        User user1 = new User();
        user1.setId(9L);
        user1.setAge(22);
        user1.setEmail("[email protected]");
        user1.setName("肉丝");

        User user2 = new User();
        user2.setAge(20);
        user2.setEmail("[email protected]");
        user2.setName("harry");
        //调用新增方法
        boolean flag = userService.saveOrUpdateBatch(Arrays.asList(user1,user2));
        System.out.println(flag ? "成功" :"失败");
    }

    /**
     * 查询唯一
     */
    @Test
    public void testGetOne() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
        queryWrapper.eq("age",20);
        //会报错
        //User user = userService.getOne(queryWrapper);
        //不会报错,但会发出警告
        User user = userService.getOne(queryWrapper,false);
        System.out.println(user);
    }
}

注意:其余方法类似,不一一进行代码演示,具体方法可参考IService接口源码或参考官方文档

下一篇《MyBatisPlus代码生成器》

你可能感兴趣的:(mybatis,plus)