然后在spring boot配置文件中配置好数据源以及mybatis-plus配置:
如:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl注意:导入mybatis-Plus后不要在导入任何的mybatis以来了
创建与数据库表中相对性的JavaBean实体对象,如果表中字段带有下划线例如user_name,对象属性以驼峰形式来接,mybatis-plus,会自动进行匹配。
编写对应的mapper接口,要继承BaseMapper<T>,这个类中已经实现了我们常用的CRUD操作,只调用即可,而且也不用再写相对应的对象Mapper.xml了,Sql语句我们也不用管理了,下面是BaseMapper<T>中一些方法的使用:
意图:
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
取出记录时,获取当前version更新时,带上这个version执行更新时, set version = newVersion where version = oldVersion如果version不对,就更新失败乐观锁配置需要2步 记得两步
插件配置
1spring boot:
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }2.注解实体字段 @Version 必须要!
@Version private Integer version;特别说明:
支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime整数类型下 newVersion = oldVersion + 1newVersion 会回写到 entity 中仅支持 updateById(id) 与 update(entity, wrapper) 方法在 update(entity, wrapper) 方法下, wrapper 不能复用!!! int id = 100; int version = 2; User u = new User(); u.setId(id); u.setVersion(version); u.setXXX(xxx); if(userService.updateById(u)){ System.out.println("Update successfully"); }else{ System.out.println("Update failed due to modified by others"); }示例SQL原理
update tbl_user set name = 'update',version = 3 where id = 100 and version = 2说明:
只对自动注入的sql起效:
插入: 不作限制查找: 追加where条件过滤掉已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段更新: 追加where条件防止更新到已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段删除: 转变为 更新例如:
删除: update user set deleted=1 where id = 1 and deleted=0查找: select id,name,deleted from user where deleted=0字段类型支持说明:
支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()附录:
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。用法:
步骤1: 配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig
例: application.yml mybatis-plus: global-config: db-config: logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)步骤2: 实体类字段上加上@TableLogic注解
@TableLogic private Integer deleted;另外;
QueryWrapper<User> wrapper = new QueryWrapper<>();能够对查询条件做一些筛选用法:
//条件查询 @Test void contextLoads() { //查询name不为空并且邮箱也不为空,而且年龄大于等于10 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.isNotNull("name") .isNotNull("email"); wrapper.between("age", 12, 22); List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println); } //模糊查询 @Test void test(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); //LikeRight 表示%在右边 wrapper.notLike("name", "熊") //%熊% .likeRight("age", 1);//1% List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println); } /** * ==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND (name NOT LIKE ? AND age LIKE ?) * ==> Parameters: %熊%(String), 1%(String) * <== Columns: id, name, age, email, create_time, update_time, version, deleted * <== Row: 23, 翠花, 16, 17029228@qq.com, 2020-10-05 11:03:03, 2020-10-05 14:27:40, 1, 0 * <== Row: 24, 小明, 16, 13029228@qq.com, 2020-10-05 11:04:16, 2020-10-05 11:04:16, 1, 0 * <== Row: 29, 小李, 15, , 2020-10-05 15:33:14, 2020-10-05 15:33:19, 1, 0 * <== Total: 3 */ //子查询 @Test void test1(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.inSql("id","select id from user where id>17"); List<Object> objects = userMapper.selectObjs(wrapper); objects.forEach(System.out::println); }
