Mybatis plus

时间:2022-11-14 07:53:08

Mybatis plus简介

MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

特性

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可*配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速使用

先创建一个spring项目,创建时记得勾选sql的驱动

之后我们导入mybatis plus的坐标

       <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

之后我们来到配置文件中,写入我们的datasource
我这里用的yml文件进行配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm
    username: root
    password: 123456

之后创建一个我们的一个pojo的实体类,记得给出相应的getter和setter方法

public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;
}

之后我们写一下我们的dao层文件

@Mapper
public interface BookDao extends BaseMapper<Book> {
}

这里一下我们不需要去写什么CURD,mp已经通过basemapper帮我们写好了

到这里原先要我们花费大量时间去写的数据层就写完了,是不是很方便,感觉啥也没写就结束了

加入日志

只需要在日志中配置以下这段话就可以了

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

实现CUDR

根据ID查询

Book book = bookDao.selectById(2);

查询全部

List<Book> books = bookDao.selectList(null);

增加

        Book book=new Book();
        book.setName("123");
        book.setType("123");
        book.setDescription("123");
        
        bookDao.insert(book);

删除

bookDao.deleteById(2);

修改

        Book book=new Book();
        book.setName("123");
        book.setType("123");
        book.setDescription("123");

        bookDao.updateById(book);

对service层的封装

先让BookService继承IService

public interface BookService extends IService<Book> {
}

之后对于BookServiceImpl我们在实现service接口的基础上,我们还要继承一下ServiceImpl,这样在Impl中就不需要将所有的方法都重写出来

@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {
}

这样之后我们简单的测试一下service中的方法

@Test
    public void selectTest(){
        System.out.println(bookService.getById(4));
    }

要注意的是,为了避免命名的重复,mp在service对于的方法的取名有着较大的差别

mp的几个标签

@TableName

@TableName("tbl_book")
public class Book {
    private Long id;
    private String type;
    private String name;
    private String description;
}

描述:表名注解,标识实体类对应的表
使用位置:实体类

@TableId

public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

描述:主键注解
使用位置:实体类主键字段

属性 类型 必须指定 默认值 描述
value String “” 主键字段名
type Enum IdType.NONE 指定主键类型

mp默认使用雪花算法去计算主键id的值,但是我们也可以将type的值设置成IdType.AUTO,来实现id自增

@TableId(value = "id",type = IdType.AUTO)

@TableField

@TableName("sys_user")
public class User {
    @TableId
    private Long id;
    @TableField("nickname")
    private String name;
    private Integer age;
    private String email;
}

其的value属性,用于指定属性名和字段名的匹配

@TableLogic

用于逻辑删除

条件构造器

querywapper

首先我们先创建一个querywapper对象

QueryWrapper<Book> queryWrapper=new QueryWrapper<>();

之后我们看一下quertwapper提供的方法

查询name字段的包含spring的值,即模糊查询

queryWrapper.like("name","spring")

查询值在xx于xx之间

queryWrapper.between("id",1,5);

当然还有许多的方法,就不在这里一一列举了

当然我们的querywapper还支持链式编程

queryWrapper.like("name","spring")
                .between("id",1,5);

updatewapper

将name为空的修改

UpdateWrapper<Book> updateWrapper=new UpdateWrapper<>();
        updateWrapper.isNull("name");
        updateWrapper.set("name","114514").set("type","1919810").set("description","123");
        bookDao.update(null,updateWrapper);

Lambdaquerywapper

对于你的字段类型做出了约束,可以有效的防止写错

LambdaQueryWrapper<Book> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        String name="spring";
        String type=null;
        lambdaQueryWrapper.like(StringUtils.isNotBlank(name),Book::getName,name)
                .like(StringUtils.isNotBlank(type),Book::getType,type);
        List<Book> books = bookDao.selectList(lambdaQueryWrapper);
        books.forEach(System.out::println);

Lambdaupdatewapper

和上面的Lambdaquerywapper类似

分页插件

首先我们先添加一个分页插件

@Configuration
public class MpConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

创建一个page对象,传入当前的页码以及每页分有几条数据

IPage<Book> iPage=new Page(1,5);
        bookDao.selectPage(iPage,null);

在page对象中我们可以得到数据,总记录数等数据
Mybatis plus

乐观锁

首先我们要给我们的表添加一个版本字段,用于记录版本号

之后再实体类中给版本号属性添加一个@version注解就可以了
最后给我们的拦截器添加一个乐观锁的插件

interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());