SpringBoot整合Mybatis-Plus

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;
    }

 

posted @ 2021-01-11 12:08  我还有头发  阅读(25)  评论(0编辑  收藏  举报