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); }
数据库更新结果: