mybaits-plus通用CRUD详解及代码案例

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybaits-plus通用CRUD详解及代码案例相关的知识,希望对你有一定的参考价值。

文章目录

mybaitsplus通用CRUD

通过前面的学习,我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作,接下来我们将详细讲解这 些操作,下图是BaseMapper的各各方法:

插入操作

方法定义

/**
* 插入一条记录 
* ** 
* @param entity 实体对象 
*/ 
int insert(T entity);

该方法返回的result是受影响的行数,并不是自增后的id

测试用例

    //插入
    @Test
    public void testInsert()
        User user = new User();
		// user.setId(100L);
        user.setName("曹操");
        user.setPassword("111111");
        user.setAge(20);
        user.setUserName("caocao");
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-DD HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse("1990-01-01 00:00:00", dateTimeFormatter);
        user.setBirthday(localDateTime);
        int i = userMapper.insert(user);
        System.out.println(i);
        
        //自增后的id会回填到对象中
        System.out.println(user.getId());
    

mybaitsplus主键生成策略

上例中Mybatis-plus自动生成ID,如何设置id的生成策略呢?

MP支持的id策略如下:

package com.baomidou.mybatisplus.annotation; 
import lombok.Getter;
/**
 *生成ID类型枚举类
 *
 *@author hubin
 * @since 2015‐11‐10
 */ @Getter
public enum IdType 
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),

    /**
     * 全局唯一ID (idWorker)
     */
    ID_WORKER(3),
    /**
     * 全局唯一ID (UUID)
     */
    UUID(4),
    /**
     * 字符串全局唯一ID (idWorker 的字符串表示)
     */
    ID_WORKER_STR(5);

    private final int key;

    IdType(int key) 
        this.key = key;
    


在对象类中添加对应注解即可,例如下面这样

下面我们具体说一下每个主键:

设置自增主键

设置完全采用数据库自增主键方式。

  1. 设置mysql数据库主键为自增

  2. 修改User对象:

    @TableId(value = "ID", type = IdType.AUTO) 
    private Long id;:
    @TableId(value = "ID") 
    private Long id;
    
  3. 程序中不用设置主键

设置输入主键:

手动设置主键值。

  1. mysql数据库主键为自增或不是自增都可以
  2. 修改User对象:
    @TableId(value = "ID",type = IdType.INPUT) 
    private Long id;
    
  3. 程序中需要设置主键

UUID:

生成全局唯一ID。

  1. mysql数据库主键为字符串类型,不是自增类型。

  2. 修改User对象。

    @TableId(value = "ID",type = IdType.UUID) 
    private String id;
    
  3. 程序中不用设置主键

ID_WORKER_STR:

采用雪花片算法(雪花算法生成的ID是纯数字且具有时间顺序,适合分布式场景)生成全局唯一ID,字符串类型。

  1. mysql数据库主键为字符串类型,不是自增类型。

  2. 修改User对象。

    @TableId(value = "ID",type = IdType.ID_WORKER_STR) 
    private String id;
    
  3. 程序中不用设置主键

ID_WORKER:

采用雪花片算法生成全局唯一ID,数值类型。

  1. mysql数据库主键为数值类型,不是自增类型。
  2. 修改User对象。
    @TableId(value = "ID",type = IdType.ID_WORKER) 
    private Long id;
    
  3. 程序中不用设置主键

更新操作

根据id更新

方法定义:

/**
*根 据 ID 修 改
*
*@param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);

方法步骤

根据id更新操作步骤:

  1. 首先需要设置对象的主键属性值。
  2. 再设置要更新的属性值。
  3. 根据主键找到对象,更新设置属性值。
  4. 返回影响的记录数。

注意:只能将对象中不为NULL的属性更新到表中。

测试案例:

    @Test
    public void testUpdate()
        User user = new User();
        //更新记录的主键值
        user.setId(2L);
        user.setAge(100);//要更新的值
        user.setPassword("12222");//要更新的值
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.updateById(user);
        System.out.println(i);
        System.out.println(user);
    

运行结果:

数据库更新结果:

根据条件更新

方法定义:

/**
*根据 whereEntity 条件,更新记录
*
*@param entity	实体对象 (set 条件值,可以为 null)
*@param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
*/
int update(
	@Param(Constants.ENTITY) T entity, 
	@Param(Constants.WRAPPER) Wrapper<T> updateWrapper
);

根据ID更新一次只能更新一条记录,根据条件更新可实现批量更新。

更新步骤:

根据条件更新步骤:

  1. 在对象中设置要更新的属性值。
  2. 设置QueryWrapper,设置更新条件,可以设置多个。
  3. 返回影响的记录数。

注意:只能将对象中不为NULL的属性更新到表中。

测试用例:下次将name等于“曹操”的记录全部更新。

    //根据条件进行更新
    @Test
    public void testUpdate2()
        User user = new User();
        user.setAge(100);//要更新的值
        user.setPassword("12222");//要更新的值
        //设置条件
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("name","曹操");
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(user,queryWrapper);
        System.out.println(i);
    

数据库更新结果:

根据条件更新(可以更新NULL)

上边根据id更新 根据条件更新的方法只能将对象中不为NULL的属性更新到表中,下边通过UpdateWrapper进行更新,将birthday字段更新为NULL。

    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate3()
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    


还可以同时更新多个属性

    //根据条件进行更新,可以将为NULl的值更新到数据库
    @Test
    public void testUpdate4()
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","曹操").set("age", 999).set("birthday",null);
        //只将对象中不为NULL的值更新到数据库中
        int i = userMapper.update(null,updateWrapper);
        System.out.println(i);
    

删除操作

根据id删除

方法定义:

/**
*根 据 ID 删 除
*
*@param id 主键ID
*/
int deleteById(Serializable id);

删除步骤:

  1. 指定要删除记录的主键值。
  2. 调用deleteById方法执行删除。

测试用例:

@Test
public void testDeleteById() 
//执行删除操作
	int result = this.userMapper.deleteById(6L); 
	System.out.println("result = " + result);

根据 entity 条件删除

方法定义:

/**
*根据 entity 条件,删除记录
*
*@param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

删除步骤:

根据条件删除步骤:

  1. 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件注意:删除条件只匹配对象中不为NULL的属性值
  2. 设置QueryWrapper
  3. 执行删除

测试案例:

    @Test
    public void testDelete()
        //设置条件
        User user = new User();
        user.setAge(999);
        user.setName("曹操1");
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>(user);
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    

注意:定义QueryWrapper可以不包装模型对象,手动设置条件,如下:

    @Test
    public void testDelete()
        //设置条件
        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("age",999);
        queryWrapper.eq("name","曹操1");
        
        //根据条件删除
        int delete = userMapper.delete(queryWrapper);
        System.out.println(delete);
    

上面两种写法是一样的,运行结果如下:

影响了一行,看一下数据库前后,确实删掉了:

根据ID 批量删除

方法定义:

/**
*删除(根据ID 批量删除)
*
*@param idList 主键ID列表(不能为 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

删除步骤:

批量删除操作步骤:

  1. 指定 id列表
  2. 执行删除

测试案例:

删除id为101、102、103的

    //批量删除
    @Test
    public void testDelete2()

        //根据条件删除
        int delete = userMapper.deleteBatchIds(Arrays.asList(101L,102L,103L));
        System.out.println(delete);
    

查询操作

MP提供了多种查询操作,包括根据id查询 批量查询 查询单条数据 查询列表 分页查询等操作。

根据id查询

方法定义:

/**
*根 据 ID 查 询
*
*@param id 主键ID
*/
T selectById(Serializable id);

查询步骤:

根据id查询步骤:

  1. 设置查询记录的主键值。
  2. 执行查询。
  3. 查询结果返回一个对象。

注意:这里返回的就是对象了,之前都是返回影响的行数。

测试用例:

@Test
public void testSelectById() 
	//根据id查询数据
	User user = this.userMapper.selectById(2L);
	System.out.println("result = " + user);

查询结果:

根据id批量查询

方法定义:

/**
*查询(根据ID 批量查询)
*
*@param idList 主键ID列表(不能为 null 以及 empty)
*/
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

查询步骤:

根据id列表查询:

  1. 设置id列表
  2. 执行查询
  3. 查询对象返回List

注意:这里返回的就是对象list了

测试案例:

@Test
public void testSelectBatchIds() 
	//根据id集合批量查询
	List<User> users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L)); 
	for (User user : users) 
		System.out.println(user);
	

查询结果:

根据 entity 条件查询一条记录

方法定义:

/**
*根据 entity 条件,查询一条记录
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

查询步骤:

  1. 设置QueryWrapper对象,设置查询条件,可以设置多个条件
  2. 执行查询

注意:如果查询结果为多条记录则报错(TooManyResultsException)。

测试案例:

    @Test
    public void testSelectOne()

        QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
        queryWrapper.eq("name","张三");
        //根据条件查询,只能查询出一条记录,否则报错
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);
    

查询结果:

根据 Wrapper 条件查询总记录数

方法定义:

/**
*根据 Wrapper 条件,查询总记录数
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

测试案例:

@Test
public void testSelectCount() 
	QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
	wrapper.gt("age", 23); //年龄大于23岁

	//根据条件查询数据条数
	Integer count = this.userMapper.selectCount(wrapper); 
	System.out.println("count = " + count);

运行结果为:count = 2

点进gt方法的声明类里,还可以看到其的 Wrapper 条件:

根据 entity 条件查询全部记录

方法定义:

/**
*根据 entity 条件,查询全部记录
*
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

测试案例:

    @Test
    public void testSelectList() 
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.gt("age", 23);
        //年龄大于23岁
        // 根据条件查询数据
        List<User> users = this.userMapper.selectList(wrapper);
        for (User user : users) 
            System.out.println("user = " + user);
        
    

运行结果为:

根据 entity 条件查询全部记录(并翻页)

方法定义:

/**
*根据 entity 条件,查询全部记录(并翻页)
*
*@param page	分页查询条件(可以为 RowBounds.DEFAULT)
*@param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

以上是关于mybaits-plus通用CRUD详解及代码案例的主要内容,如果未能解决你的问题,请参考以下文章

Mybaits-Plus操作CRUD

SpringBoot2----MyBaits-Plus完成CRUD操作

mybaits-plus学习笔记整合

mybaits-plus常见配置

Mybatis-Plus 简介及入门案例

MyBatis-Plus入门教程及基本API使用案例