项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。 我们可以使用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(){ Listusers = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println); }
通过map封装查询条件
@Test public void testSelectByMap(){ HashMapmap = 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() { QueryWrapperqueryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "Tom"); User user = userMapper.selectOne(queryWrapper); System.out.println(user); }
between、notBetween包含大小边界
allEq
@Test public void testSelectList() { QueryWrapperqueryWrapper = 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() { QueryWrapperqueryWrapper = new QueryWrapper<>(); queryWrapper .notLike("name", "e") .likeRight("email", "t"); List
inSql、notinSql:可以实现子查询
@Test public void testSelectObjs() { QueryWrapperqueryWrapper = new QueryWrapper<>(); //queryWrapper.in("id", 1, 2, 3); queryWrapper.inSql("id", "select id from user where id < 3"); List
or、and
不调用or则默认为使用 and 连
@Test public void testUpdate1() { //修改值 User user = new User(); user.setAge(99); user.setName("Andy"); //修改条件 UpdateWrapperuserUpdateWrapper = 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() { QueryWrapperqueryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name", "age"); List users = userMapper.selectList(queryWrapper); users.forEach(System.out::println); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)