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); }