mybatis-plus 基础CRUD用法

insert

	@Test
	void insertTest() {
		User user = new User();
		user.setName("元元");
		user.setAge(19);
		user.setEmail("[email protected]");
		int insert = userMapper.insert(user); 	// 帮我们自动生成 id
		System.out.println(insert);	// 受影响的行数
		System.out.println(user);	// 发现id会自动回填
	}

设置主键用到的注解 @TableId(type = IdType.AUTO)

@Data
public class User {

    // 对应数据库中的主键
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private int age;
    private String email;
    @TableField(fill = FieldFill.INSERT)    // 插入时
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)     // 更新时
    private Date updateTime;
}

设置主键可以用哪些

    AUTO(0), // 数据库 id 自增
    NONE(1), // 未设置主键、
    INPUT(2), // 手动输入
    ID_WORKER(3),// 默认的全局唯一 id
    UUID(4), // 全局唯一id uuid
    ID_WORKER_STR(5) // 字符串表示法

updateById

// updateById 更新方法
	@Test
	void updateById() {
		User user = new User();
		user.setId(1456219805576073217l);
		user.setName("更新");
		int i = userMapper.updateById(user);
		System.out.println(i);
	}

updateById() 中传入的是一个对象而不是一个 id 串

自动填充

例如:在表中自动插入和更新时间
首先需要在 pojo 层添加字段属性@TableField

@Data
//@AllArgsConstructor
//@NoArgsConstructor
public class User {

    // 对应数据库中的主键
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private int age;
    private String email;
    @TableField(fill = FieldFill.INSERT)    // 插入时
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)     // 更新时
    private Date updateTime;
}

然后需要实现元对象处理器接口
mybatis-plus 基础CRUD用法_第1张图片

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill....");
        // setFieldValByName 的三个参数分别是 字段名,字段值,metaObject
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill....");
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

这样就可以实现在插入或更新时自动插入或更新 “创建时间字段和更新时间字段” 的时间了!

乐观锁

数据库增加 version 字段
实体类中添加对应的字段并在该字段上添加乐观锁注解@Version

 @Version
  private Integer version;

编写配置类作为mybatis-plus的配置类
这里可以将主启动类的扫描mapper包的注解放在mybati-plus配置雷中
mybatis-plus 基础CRUD用法_第2张图片

@MapperScan("com.example.demo1.mapper")     // 扫描 mapper 文件
@EnableTransactionManagement    // 自动管理事务
@Configuration  // 配置类注解
public class MyBatisPlusConfig {

    // 注册乐观锁插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}

至此乐观锁配置完毕

乐观锁的测试

// 测试乐观锁
	// ======》 成功的情况
	@Test
	void lockVersionSuccess() {
		User user = userMapper.selectById(1456227126960230406l);
		user.setName("测试乐观锁success");
		userMapper.updateById(user);
	}
	// =======》 失败的情况
	@Test
	void lockVersionDefault() {
		// 模拟多线程情况下 user1 没有执行完毕的时候被 user2 插队先执行
		// 如果没有乐观锁的情况下,Name 字段更新后的值应该是 “乐观测试1”
		// 有乐观锁的情况下, Name 字段更新后的值是 “乐观测试2”
		User user1 = userMapper.selectById(1456227126960230406l);
		user1.setName("测试乐观锁1");
		User user2 = userMapper.selectById(1456227126960230406l);
		user2.setName("测试乐观锁2");
		userMapper.updateById(user2);
		userMapper.updateById(user1);
	}

查询方法

基础查询

查询该表全部记录

// 查询单表全部记录
	@Test
	void selectListTest() {
		// 查询全部用户
		List<User> users = userMapper.selectList(null);
		users.forEach(System.out::println);
	}

根据 id 查询单条数据======> 放入的参数是一个 id

// 测试单条查询
	@Test
	void selectByIdTest() {
		User user = userMapper.selectById(1456219805576073217l);
		System.out.println(user);
	}

根据 id 列表进行批量查询 ====> 放入的参数是一个 id 列表

// 测试批量查询
	@Test
	void selectBatchIdsTest() {
		List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
		System.out.println(users);
	}

根据 map 中的条件进行查询======> 放入的参数是一个 HashMap

// 测试条件查询 ==》 使用 map 的方法
	@Test
	void selectByMapTest() {
		HashMap<String, Object> map = new HashMap<>();
		map.put("name","更新");
		map.put("age",18);
		List<User> users = userMapper.selectByMap(map);
		System.out.println(users);
	}

分页查询

首选配置类中添加分页插件配置====> 和乐观锁等配置在一起即可

@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        //分页配置
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }

测试分页查询

// 测试分页查询
	@Test
	void selectPageTest() {
		// Page 的参数 1 为当前页   Page 的参数 2 为页面大小
		Page<User> page = new Page<>(1,3);
		Page<User> userPage = userMapper.selectPage(page, null);
		userPage.getRecords().forEach(System.out::println);
		// getTotal() 获取总数
		System.out.println(userPage.getTotal());
	}

分页查询中Page中的方法

mybatis-plus 基础CRUD用法_第3张图片

删除

// 测试根据 id 删除
	@Test
	void deleteByIdTest() {
		userMapper.deleteById(1456227126960230401l);
	}

	// 测试根据 id 列表批量删除
	@Test
	void deleteBatchIdsTest() {
		userMapper.deleteBatchIds(Arrays.asList(123l,1456219805576073217l));
	}

	// 测试按 map 条件删除
	@Test
	void deleteByMapTest() {
		HashMap<String, Object> map = new HashMap<>();
		map.put("name","元元");
		map.put("age",20);
		userMapper.deleteByMap(map);
	}

逻辑删除(软删除)
实体类上对应的软删除标记字段上增加软删除注解 @TableLogic

 @TableLogic
    private Integer deleted;

yml 配置

mybatis-plus:
  # 配置日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 配置逻辑删除(软删除)
  global-config:
    db-config:
      logic-delete-value: 1  # 已删除的标记
      logic-not-delete-value: 0  # 未删除的标记

条件构造器

例如:查询 name 和 email 不为空且 age 大于18 岁

   @Test
    void test1() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.isNotNull("name").isNotNull("email").ge("age",19);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }
    

具体使用官网很详细
https://mp.baomidou.com/guide/wrapper.html#abstractwrapper

你可能感兴趣的:(mybatis)