mybatisPlus基本的CRUD操作接口 和 物理分页

在MybatisPlus官网的文档中分Mapper 即dao层的CRUD 和

Service层的CRUD                  文档链接:mapper-crud-接口

另外官网推荐慕课网的视频教程链接:MybatisPlus从不会到熟练使用

下面是前提: 

Mapper层 首先得定义一个 interface类去继承MybatisPlus的BaseMapper类

并且  指定一个泛型 (即 实体类 对应  数据库里的表)相当于这个接口是对这张表操作的。

例如:泛型User类,dao层的接口 UserMapper继承BaseMapper如下

User.java 类

import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data   // lombok的注解 自动生产 get、set、toString方法
public class User {
  @TableId    //mybatisplus的主键注解
  private long id;
  private String name;
  private long age;
  private String email;
  private long managerId;
  private java.sql.Timestamp createTime;
}

UserMapper.java   接口类            泛型:就是 User类 

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.entity.User;

@Mapper
public interface UserMapper extends BaseMapper {

}

另外注意:

mybatis-plus 提供了一些通用的查询方法比如通过  上面的UserMapper的实例对象调用,userMapper.

Wrapper是条件构造器,如果后面用到了学会用即可 

下面是实际的操作,按照官网的方法顺序进行讲解

使用方式都是通过接口的实体类调用例如

import com.example.mybatisplus.dao.UserMapper;
import com.example.mybatisplus.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class MybatisplusApplicationTests {
    @Autowired
    UserMapper userMapper;

    @Test
    void test() {
        List users = userMapper.selectList(null);//调用 selectList
        System.out.println(users.toString());
    }

}

下面的所有方法都是通过BaseMapper的继承接口userMapper的实例进行调用的

插入

添加记录 

int insert(T entity);

------返回插入成功的记录条数,需要传入一个实体类,这个实体类的属性要通过用户自己注入属性值,然后MP

(指MybatisPlus,后面全部用简称)会根据这个实体类的属性值 自动转换成SQL,然后会执行并且得到返回值。

删除

 根据主键删除记录----------关于主键,实体类必须加上@TableId主键表明该属性是主键

int deleteById(Serializable id);

 ------顾名思义,只需要传入主键值即可删除记录。同时返回删除记录的条数。

根据Map删除  相当于将Map转换成SQL的条件 对应这sql中的where条件

Map的key对应表中的列名,value对应列名对应的值

int deleteByMap(Map map);

-------Map的形式是key是数据库表字段名,value是值。对应上面的

例如:

@Test
void test() {
    Map map=new HashMap<>();
    map.put("name","张雨琪");//可以添加多个字段,相当于条件 ‘与’ 的结果
    int rows=userMapper.deleteByMap(map);
    System.out.println("删除了"+rows+"条记录");
}


根据条件构造器Wrapper方式删除

int delete(Wrapper wrapper);

下面是创建条件构造器和使用条件构造器 

@Test
void test() {
    LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery();// 创建一个条件构造器,下面使用,添加条件参数
    lambdaQuery.eq(User::getName,"刘红雨").or().gt(User::getAge,41); // 姓名是留红雨,或者 年龄大于41的
    int rows=userMapper.delete(lambdaQuery);//将条件构造器传入执行delete操作
    System.out.println("删除条数"+rows);
}


注意:这里的eq是equals条件构造器,具体可以去官网查看,都可以根据名称猜出意思

条件构造器链接:https://mp.baomidou.com/guide/wrapper.html#eq

删除多条记录。这里用到了Java8的Collection API,实际上就是要传入一个列表而已

int deleteBatchIds(Collection idList);

传入存有主键的列表,删除多条记录。注意sql语法以及外键约束等条件

例如:

@Test
void test() {
   int rows=userMapper.deleteBatchIds(Arrays.asList(1094590409767661570L,1088250446457389058L));
    System.out.println("删除了"+rows+"条记录");
}


更新 

根据主键更新记录-----主键值一定要通过entity的set方法设置,其它字段根据需求设置

int updateById(T entity);

-----该方法会根据entity的属性自动生成update语句,但是主键id必须给定。返回更新条数

举例:

@Test
void test() {
    User user=new User();
    user.setId(1094590409767661570L);
    user.setEmail("testUpdateById");
    int rows = userMapper.updateById(user);
    System.out.println("更新了"+rows+"条");
}


 根据条件构造器更新记录------创建条件构造器和之前的删除一样使用条件构造器

int update(T entity,Wrapper updateWrapper);

前面的一个参数传要更新的数据,后面传条件 

@Test
void test() {
    UpdateWrapper  updateWrapper=new UpdateWrapper<>();
    updateWrapper.eq("name","李艺伟").eq("age",28);
    User user=new User();
    user.setEmail("testUpdateWraper");
    int rows = userMapper.update(user,updateWrapper);
    System.out.println("更新条数"+rows);
}

当更新的字段比较少时可以用set设置跟新的数据 例如

@Test
void test() {
    UpdateWrapper  updateWrapper=new UpdateWrapper<>();
    updateWrapper.eq("name","李艺伟").eq("age",28).set("age",31);

    int rows = userMapper.update(null,updateWrapper);
    System.out.println("更新条数"+rows);
}

使用Lambda表达式 有防误写功能

@Test
void test() {
    LambdaUpdateWrapper lambdaUpdate=Wrappers.lambdaUpdate();
    lambdaUpdate.eq(User::getName,"李艺伟").eq(User::getId,1088250446457389058L)
            .set(User::getAge,32);
    int rows = userMapper.update(null,lambdaUpdate);
    System.out.println("更新条数"+rows);
}

使用  链式Lambda表达式,特点一条语句完成

@Test
void test() {
    boolean update = new LambdaUpdateChainWrapper(userMapper).eq(User::getName, "李艺伟")
            .eq(User::getId, 1088250446457389058L).set(User::getAge, 30).update();
    System.out.println("更新"+update);
}

 

查询

根据主键查询------注意在类属性的主键添加 @TableId注解

T selectById(Serializable id);
@Test
void test() {
    User user = userMapper.selectById(1088250446457389058L);
    System.out.println(user.toString());
}

批量查询-------传入一个id的列表,返回与列表对应的 记录

List selectBatchIds(Collection idList);
@Test
void test() {
    List ids=Arrays.asList(1088248166370832385L,1088250446457389058L,1094590409767661570L);
    List userList = userMapper.selectBatchIds(ids);
    userList.forEach(System.out::println);
}

 根据Map查询(map的key是数据库的列名,而value则是列名对应的值)

List selectByMap(Map columnMap);
@Test
void test() {
    Map map=new HashMap<>();
    map.put("id",1094590409767661570L);
    map.put("name","张雨琪");
    List userList = userMapper.selectByMap(map);
    userList.forEach(System.out::println);
}

只返回一条记录,传入条件构造器,返回一条记录

T selectOne(Wrapper queryWrapper);
@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.likeRight("name", "张").lt("age", 41);// lessthan小于41、likeRight  张%
    User user = userMapper.selectOne(queryWrapper);
    System.out.println(user.toString());

}

返回满足条件的条数

Integer selectCount(Wrapper queryWrapper);
@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.lt("age", 31);// lessthan小于41
    Integer rows = userMapper.selectCount(queryWrapper);
    System.out.println("小于31岁的有"+rows+"个");

}

返回满足条件的所有记录(通过条件构造器)

List selectList(Wrapper queryWrapper);
@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.lt("age", 31);// lessthan小于41
    List userList = userMapper.selectList(queryWrapper);
    userList.forEach(System.out::println);

}

返回Map类型的 所有满足条件的记录

List> selectMaps(Wrapper queryWrapper);
@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.lt("age", 31);// lessthan小于41
    List> userList = userMapper.selectMaps(queryWrapper);
    userList.forEach(System.out::println);

}

返回Object类型的 所有满足条件的记录   注意:只返回第一个字段的值

List selectObjs(Wrapper queryWrapper); 
   

分页查询

首先你得加一个插件进去,新建一个configuration包,在包里面建一个MybatisPlusConfig类

如下、 下面的注意作用是让springboot 托管插件 Paginationintercepter

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

然后就可以使用下面的方法进行分页查询 

IPage selectPage(IPage page, Wrapper queryWrapper);

示例代码:

@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.ge("age", 25);// greaterEquals大于等于25
    Page page=new Page<>(1,2);//当前页是1,每页2条记录
    IPage userIPage = userMapper.selectPage(page, queryWrapper);
    System.out.println("总页数"+userIPage.getPages());
    System.out.println("总记录数数"+userIPage.getTotal());
    List userList=userIPage.getRecords();
    userList.forEach(System.out::println);

}

示例结果展示:

分页查询二、返回Map类型的数据

IPage> selectMapsPage(IPage page,Wrapper queryWrapper);
@Test
void test() {
    QueryWrapper queryWrapper=new QueryWrapper();
    queryWrapper.ge("age", 25);// greaterEquals大于等于25
    Page page=new Page<>(1,1);//当前页是1,每页1条记录
    IPage> userIPage = userMapper.selectMapsPage(page, queryWrapper);
    System.out.println("总页数"+userIPage.getPages());
    System.out.println("总记录数数"+userIPage.getTotal());
    List> userList=userIPage.getRecords();
    userList.forEach(System.out::println);

}

结果展示、

 

 

你可能感兴趣的:(SpringBoot)