MyBatis-plus

此部分为开发中用到的mp实用操作

1.分页查询

1.配置mp拦截器和分页插件(两个注解)

@Configuration
public class MyBatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        //1.创建拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2.创建分页插件
        PaginationInnerInterceptor page = new PaginationInnerInterceptor(DbType.MYSQL);
        //3.添加分页插件
        mybatisPlusInterceptor.addInnerInterceptor(page);
        //4.返回
        return mybatisPlusInterceptor;
    }
}

2.service层调用

(1)封装Page对象,page和size

(2)构造条件构造器(如果有条件查询)

(3)给page对象设置order规则

(4)调用selectPage,处理返回结果

  @Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
        //1.构造分页器
        Page<Employee> page = Page.of(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());
        //2.构造查询条件
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(employeePageQueryDTO.getName())) {
            wrapper.like(Employee::getUsername, employeePageQueryDTO.getName());
        }
        //3.查询
        Page<Employee> p = baseMapper.selectPage(page, wrapper);
        //4.返回分页查询封装结果
        return new PageResult().builder()
                .total(p.getTotal())
                .records(p.getRecords())
                .build();
    }

2.条件构造器

LamdaQueryWrapper中通过 User::getId 类反射的方式获取 数据库中的列名 来避免硬编码 

3.自定义SQL

sql语句中复杂的where条件由service中的mp自动创建,将wrapper传入到mapper层,mp会将wrapper自动拼接到自定义的sql语句中

注:mapper层方法参数中wrapper需要使用@Param注解声明"ew"


以下部分为ssm课程中的mp笔记 

一.快速开发

1.mp开发

(1)创建项目导入依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

(2)配置文件

设置连接数据库参数

spring:
  profiles:
    active: dev
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db1
    username: root
    password: "123456"
  main:
    banner-mode: off
# 开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: false

(3)创建pojo实体类

(4)数据层接口

@Mapper
public interface BookService extends BaseMapper<Book> {

}

注:

1.mapper注解

2.继承basemapper,泛型为实体类 

(5)test测试

2.创建实体类注解工具---Lombok

(1)导入依赖

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.12</version>
</dependency>

(2)添加@Data注解

注:

该注解只提供无参构造方法,且手写有参构造后会覆盖无参(同默认情况),可以添加 

@NoArgsConstructor
@AllArgsConstructor

来实现 有/无参构造方法

3.标准CRUD开发

4.分页查询

(1)配置mp拦截器和分页拦截器(加两个注解)

@Configuration
public class mpconfig {
    @Bean
    public MybatisPlusInterceptor getceptor(){
        MybatisPlusInterceptor mp=new MybatisPlusInterceptor();
        mp.addInnerInterceptor(new PaginationInnerInterceptor());
        return mp;
    }
}

(2)测试分页查询

@Test
void getPage(){
    //IPage对象封装了分页操作相关的数据
    IPage page  = new Page(2,3);//当前页码数,每页数据数量
    bookService.selectPage(page,null);
    System.out.println("当前页码值:"+page.getCurrent());
    System.out.println("每页显示数:"+page.getSize());
    System.out.println("一共多少页:"+page.getPages());
    System.out.println("一共多少条数据:"+page.getTotal());
    System.out.println("数据:"+page.getRecords());
}

附:开启mp日志---yml文件配置


二.DQL

1.条件查询

    //方式一:按条件查询
        QueryWrapper qw = new QueryWrapper();
        qw.lt("age",18);
        List<User> userList = userDao.selectList(qw);
        

      //方式二:lambda格式按条件查询
        QueryWrapper<User> qw = new QueryWrapper<User>();
        qw.lambda().lt(User::getAge, 10);
        List<User> userList = userDao.selectList(qw);
     

      //方式三:lambda格式按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        lqw.lt(User::getAge, 10);
        List<User> userList = userDao.selectList(lqw);
      
        

      //并且与或者关系
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //并且关系:链式编程
        lqw.lt(User::getAge, 30).gt(User::getAge, 10);
        
        //或者关系:.or().
        lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);

2.条件查询null值的判定处理

第一位添加一个判断参数

 //模拟页面传递过来的查询数据
 UserQuery uq = new UserQuery();
 uq.setAge(10);
 uq.setAge2(30);


 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
 //先判定第一个参数是否为true,如果为true连接当前条件
 lqw.lt(null != uq.getAge2(), User::getAge, uq.getAge2());
 lqw.gt(null != uq.getAge(), User::getAge, uq.getAge());

3.查询投影

对查询出来的结果作处理:指定字段,分组,计数等

(1)查询结果包含模型类中部分属性

  //查询投影
  LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
  //方式1--指定列
  lqw.select(User::getId,User::getName,User::getAge);
  QueryWrapper<User> lqw = new QueryWrapper<User>();
  
  //方式2--指定列
  lqw.select("id","name","age","tel");
  List<User> userList = userDao.selectList(lqw);
  System.out.println(userList);

(2)查询结果包含模型类未定义属性

      QueryWrapper<User> lqw = new QueryWrapper<User>();
      lqw.select("count(*) as count, tel");
      lqw.groupBy("tel");
      List<Map<String, Object>> userList = userDao.selectMaps(lqw);
      System.out.println(userList);

4.查询条件

(1)取值查询

         //条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //等同于=
        lqw.eq(User::getName, "Jerry").eq(User::getPassword, "jerry");
        User loginUser = userDao.selectOne(lqw);
        System.out.println(loginUser);

(2)范围匹配

  LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //范围查询 lt le gt ge eq between
        lqw.between(User::getAge, 10, 30);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);

(3)模糊匹配

   @Test
    void testGetLike() {
        LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();
        //查找书名S开头
        //lqw.like(Book::getName,"S");
        //查找%论(left代表%位置)
        lqw.likeLeft(Book::getType, "论");
        List<Book> books = bookDao.selectList(lqw);
        System.out.println(books);
    }

5.映射匹配兼容性

(1)pojo类名和数据库名不同

@TableName("tbl_book")

(2)pojo属性和数据库字段名不同

@TableField(value = "...")

(3)pojo类中有数据库字段名没有的属性导致查询封装报错

(比如User的Online属性,数据库中不存在)

@TableField(exist = false)

(4)查询时隐藏某个属性名(隐私处理)

(比如从数据库查出pwd需要隐藏)

@TableField(select = false)

三.DML

1.主键生成策略控制

(1)pojo类中--@TableID(typ= ..)


(2)yml文件设定全局配置

# mp日志
mybatis-plus:
  global-config:
    db-config:
      # 设置id自增策略
      id-type: assign_id
      # 设置数据库表名前缀
      table-prefix: tbl_

2.多条删除

userDao.deleteBatchIds(list);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值