
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。 我们可以使用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("1@qq.com");
//失败案例 模拟取出数据后,数据库中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
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
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);
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)