mp自动填充、乐观锁、分页、逻辑删除、Wapper

mp自动填充、乐观锁、分页、逻辑删除、Wapper,第1张

mp自动填充、乐观锁、分页、逻辑删除、Wapper 自动填充

 项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。 我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作

数据库表中添加自动填充字段 在User表中添加datetime类型的新的字段 create_time、update_time

实体上添加注解

@Data
public class User {
 ......
 
 @TableField(fill = FieldFill.INSERT)
 private Date createTime;
 //@TableField(fill = FieldFill.UPDATE)
 @TableField(fill = FieldFill.INSERT_UPDATE)
 private Date updateTime;
}

实现元对象处理器接口

@Component
public class MymetaObjectHandler implements metaObjectHandler {
@Override
 public void insertFill(metaObject metaObject) {
 this.setFieldValByName("createTime", new Date(), metaObject);
 this.setFieldValByName("updateTime", new Date(), metaObject);
 }
 @Override
 public void updateFill(metaObject metaObject) {
 this.setFieldValByName("updateTime", new Date(), metaObject);
 }
}
乐观锁

主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安 全的数据更新

乐观锁实现方式:

取出记录时,获取当前version 更新时,带上这个version 执行更新时, 
set version = newVersion where version = oldVersion
如果version不对,就更新失败

数据库中添加version字段

ALTER TABLE `user` ADD COLUMN `version` INT

实体类添加version字段

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

元对象处理器接口添加version的insert默认值

@Override
public void insertFill(metaObject metaObject) {
 ......
 this.setFieldValByName("version", 1, metaObject);
}

创建配置类

@EnableTransactionManagement
@Configuration
@MapperScan("com.atguigu.mybatis_plus.mapper")
public class MybatisPlusConfig {

 @Bean
 public OptimisticLockerInterceptor optimisticLockerInterceptor() {
 return new OptimisticLockerInterceptor();
 }
}

此时测试 *** 作就可以使version+1

测试,

@Test
public void testOptimisticLockerFail() {
 //查询
 User user = userMapper.selectById(1L);
 //修改数据
 user.setName("1");
 user.setEmail("[email protected]");
 //失败案例   模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了version
 user.setVersion(user.getVersion() - 1);
 //执行更新
 userMapper.updateById(user);
}

多个id查询

@Test
public void testSelectBatchIds(){
 List users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
 users.forEach(System.out::println);
}

通过map封装查询条件

@Test
public void testSelectByMap(){
 HashMap map = new HashMap<>();
 map.put("name", "Helen");
 map.put("age", 18);
 List users = userMapper.selectByMap(map);
 users.forEach(System.out::println);
}

map的key要对应数据库名

分页

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能

(1)创建配置类 此时可以删除主类中的 @MapperScan 扫描注解

@Bean
public PaginationInterceptor paginationInterceptor() {
 return new PaginationInterceptor();
}

测试

public void testSelectPage() {
 Page page = new Page<>(1,5);
 userMapper.selectPage(page, null);
 page.getRecords().forEach(System.out::println);
 System.out.println(page.getCurrent());
 System.out.println(page.getPages());
 System.out.println(page.getSize());
 System.out.println(page.getTotal());
 System.out.println(page.hasNext());
 System.out.println(page.hasPrevious());
}
逻辑删除

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据 库中仍旧能看到此条数据记录

数据库中添加 deleted字段

ALTER TABLE `user` ADD COLUMN `deleted` boolean

不过数据库中没有布尔值,添加后是tinyint类型

实体类添加deleted 字段

并加上 @TableLogic 注解 和 @TableField(fill = FieldFill.INSERT) 注解

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

元对象处理器接口添加deleted的insert默认值

@Override
public void insertFill(metaObject metaObject) {
 ......
 this.setFieldValByName("deleted", 0, metaObject);
}

application.properties 加入配置,默认值,不写也可以

mybatis-plus.global-config.db-config.logic-delete-value=1 
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试后,数据并没有被删除,deleted字段的值由0变成了1

再次查询时,mp相当于在sql后都加了WHERe deleted=0

Wapper

如果想进行复杂条件查询,那么需要使用条件构造器 Wapper,涉及到如下方法

seletOne返回的是一条实体记录,当出现多条时会报错

@Test
public void testSelectOne() {
 QueryWrapper queryWrapper = new QueryWrapper<>();
 queryWrapper.eq("name", "Tom");
 User user = userMapper.selectOne(queryWrapper);
 System.out.println(user);
}

between、notBetween包含大小边界

allEq

@Test
public void testSelectList() {
 QueryWrapper queryWrapper = new QueryWrapper<>();
 Map map = new HashMap<>();
 map.put("id", 2);
 map.put("name", "Jack");
 map.put("age", 20);
 queryWrapper.allEq(map);
 List users = userMapper.selectList(queryWrapper);
 users.forEach(System.out::println);
}

like、notLike、likeLeft、likeRight

@Test
public void testSelectMaps() {
 QueryWrapper queryWrapper = new QueryWrapper<>();
 queryWrapper
 .notLike("name", "e")
 .likeRight("email", "t");
 List> maps = userMapper.selectMaps(queryWrapper);//返回值是Map
 maps.forEach(System.out::println);
}

inSql、notinSql:可以实现子查询

@Test
public void testSelectObjs() {
 QueryWrapper queryWrapper = new QueryWrapper<>();
 //queryWrapper.in("id", 1, 2, 3);
 queryWrapper.inSql("id", "select id from user where id < 3");
 List objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
 objects.forEach(System.out::println);
} 

or、and

不调用or则默认为使用 and 连

@Test
public void testUpdate1() {
 //修改值
 User user = new User();
 user.setAge(99);
 user.setName("Andy");
 //修改条件
 UpdateWrapper userUpdateWrapper = new UpdateWrapper<>();
 userUpdateWrapper
 .like("name", "h")
 .or()
 .between("age", 20, 30);
 int result = userMapper.update(user, userUpdateWrapper);
 System.out.println(result);
}

指定要查询的列

@Test
public void testSelectListColumn() {
 QueryWrapper queryWrapper = new QueryWrapper<>();
 queryWrapper.select("id", "name", "age");
 List users = userMapper.selectList(queryWrapper);
 users.forEach(System.out::println);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5706760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)