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;
在对象类中添加对应注解即可,例如下面这样
下面我们具体说一下每个主键:
设置自增主键
设置完全采用数据库自增主键方式。
-
设置mysql数据库主键为自增
-
修改User对象:
@TableId(value = "ID", type = IdType.AUTO) private Long id; 或: @TableId(value = "ID") private Long id;
-
程序中不用设置主键
设置输入主键:
手动设置主键值。
- mysql数据库主键为自增或不是自增都可以
- 修改User对象:
@TableId(value = "ID",type = IdType.INPUT) private Long id;
- 程序中需要设置主键
UUID:
生成全局唯一ID。
-
mysql数据库主键为字符串类型,不是自增类型。
-
修改User对象。
@TableId(value = "ID",type = IdType.UUID) private String id;
-
程序中不用设置主键
ID_WORKER_STR:
采用雪花片算法(雪花算法生成的ID是纯数字且具有时间顺序,适合分布式场景)生成全局唯一ID,字符串类型。
-
mysql数据库主键为字符串类型,不是自增类型。
-
修改User对象。
@TableId(value = "ID",type = IdType.ID_WORKER_STR) private String id;
-
程序中不用设置主键
ID_WORKER:
采用雪花片算法生成全局唯一ID,数值类型。
- mysql数据库主键为数值类型,不是自增类型。
- 修改User对象。
@TableId(value = "ID",type = IdType.ID_WORKER) private Long id;
- 程序中不用设置主键
更新操作
根据id更新
方法定义:
/**
*根 据 ID 修 改
*
*@param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) T entity);
方法步骤
根据id更新操作步骤:
- 首先需要设置对象的主键属性值。
- 再设置要更新的属性值。
- 根据主键找到对象,更新设置属性值。
- 返回影响的记录数。
注意:只能将对象中不为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更新一次只能更新一条记录,根据条件更新可实现批量更新。
更新步骤:
根据条件更新步骤:
- 在对象中设置要更新的属性值。
- 设置QueryWrapper,设置更新条件,可以设置多个。
- 返回影响的记录数。
注意:只能将对象中不为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);
删除步骤:
- 指定要删除记录的主键值。
- 调用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);
删除步骤:
根据条件删除步骤:
- 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件注意:删除条件只匹配对象中不为NULL的属性值
- 设置QueryWrapper
- 执行删除
测试案例:
@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);
删除步骤:
批量删除操作步骤:
- 指定 id列表
- 执行删除
测试案例:
删除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查询步骤:
- 设置查询记录的主键值。
- 执行查询。
- 查询结果返回一个对象。
注意:这里返回的就是对象了,之前都是返回影响的行数。
测试用例:
@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列表查询:
- 设置id列表
- 执行查询
- 查询对象返回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);
查询步骤:
- 设置QueryWrapper对象,设置查询条件,可以设置多个条件
- 执行查询
注意:如果查询结果为多条记录则报错(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详解及代码案例的主要内容,如果未能解决你的问题,请参考以下文章