SpringBoot整合Mybatis-Plus
Mybatis-plus是Mybatis的增强工具,在Mybatis的基础上只做增强不做改变
入门
导入依赖,lombok依赖还需要下载插件,可以简化实体类,无需写get,set等方法
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
日志配置:在终端显示数据库执行的详细信息
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
编写实体类与其mapper接口,mapper接口只需继承BaseMapper接口
@Repository public interface UserMapper extends BaseMapper<User>{ }
测试增删查改
@Autowired private UserMapper userMapper; @Test void selecttest(){ //查询列表 List<User> user = userMapper.selectList(null); System.out.println("user:" + user); //根据ID查询 User user1 = userMapper.selectById(1L); System.out.println("user1:" + user1); //通过多个ID批量查询 List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println); //简单的条件查询 HashMap<String, Object> map = new HashMap<>(); map.put("name", "dengwenxiong1"); map.put("age",13); List<User> users2 = userMapper.selectByMap(map); users2.forEach(System.out::println); } //插入 @Test void insertUser(){ User user=new User(); user.setName("dengwenxiong4"); user.setAge(18); user.setEmail("4@qq.com"); int insert=userMapper.insert(user); System.out.println(insert); } //修改 @Test void updateTest(){ User user=new User(); user.setId(1L); user.setName("dengwenxiong5"); int result=userMapper.updateById(user); System.out.println(result); } //删除 @Test void deleteTest(){ int result=userMapper.deleteById(2L); System.out.println(result); }
提升
Mp几个常用的知识点:分页查询,自动填充,乐观锁,逻辑删除和性能分析
分页查询
创建配置类,添加分页插件即可
添加插件
@Configuration public class MpConfig { @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } }
分页测试
//分页测试 @Test void selectPage(){ //创建page对象,指定当前页和每页记录数 Page<User> page=new Page<>(1,3); //调用分页查询方法,将数据封装到page对象里 userMapper.selectPage(page,null); //通过page对象获取数据 System.out.println(page.getCurrent());//当前页 System.out.println(page.getRecords());//每页数据的list集合 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());//是否有上一页 }
自动填充
自动填充创建时间和更新时间,添加字段和注解
@TableField(fill= FieldFill.INSERT) private Date createTime; @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); } }
乐观锁
乐观锁:拿数据不会上锁,提交时会验证版本号,如版本号与拿到时的不匹配,则提交失败
Mp的乐观锁实现原理:添加version字段,如果数据修改,version会加一
添加字段
@Version @TableField(fill = FieldFill.INSERT_UPDATE) private Integer version;
自动填充值
@Override public void insertFill(MetaObject metaObject) { ...... this.setFieldValByName("version", 1, metaObject); }
配置乐观锁插件
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); }
测试
//乐观锁测试 @Test void locktest(){ User user=userMapper.selectById(7L); user.setAge(100); userMapper.updateById(user); }
逻辑删除
逻辑删除:通过标志位字段实现,删除后数据库还是有此条数据
添加字段
@TableLogic @TableField(fill = FieldFill.INSERT) private Integer deleted;
自动添加初始化值
@Override public void insertFill(MetaObject metaObject) { ...... this.setFieldValByName("deleted", 0, metaObject); }
配置逻辑删除插件
@Bean public ISqlInjector sqlInjector(){ return new LogicSqlInjector(); }
测试逻辑删除
//逻辑删除 @Test void logicDelTest(){ userMapper.deleteById(8L); }
性能分析
性能分析是记录每条SQL语句执行的时间,配置插件即可完成
@Bean @Profile({"dev","test"})//设置dev,test环境开启 public PerformanceInterceptor performanceInterceptor(){ PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor(); performanceInterceptor.setMaxTime(100);//ms,超过此最大值则sql不执行 performanceInterceptor.setFormat(true); return performanceInterceptor; }