• Mybatis plus


    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.baomidougroupId>
                <artifactId>mybatis-plus-boot-starterartifactId>
                <version>3.4.3version>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/ssm
        username: root
        password: 123456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    public class Book {
        private Long id;
        private String type;
        private String name;
        private String description;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    @Mapper
    public interface BookDao extends BaseMapper<Book> {
    }
    
    • 1
    • 2
    • 3

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

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

    加入日志

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

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
    • 2
    • 3

    实现CUDR

    根据ID查询

    Book book = bookDao.selectById(2);
    
    • 1

    查询全部

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

    增加

            Book book=new Book();
            book.setName("123");
            book.setType("123");
            book.setDescription("123");
            
            bookDao.insert(book);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    删除

    bookDao.deleteById(2);
    
    • 1

    修改

            Book book=new Book();
            book.setName("123");
            book.setType("123");
            book.setDescription("123");
    
            bookDao.updateById(book);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对service层的封装

    先让BookService继承IService

    public interface BookService extends IService<Book> {
    }
    
    • 1
    • 2

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

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

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

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

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

    mp的几个标签

    @TableName

    @TableName("tbl_book")
    public class Book {
        private Long id;
        private String type;
        private String name;
        private String description;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    @TableId

    public class User {
        @TableId
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    属性类型必须指定默认值描述
    valueString“”主键字段名
    typeEnumIdType.NONE指定主键类型

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

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

    @TableField

    @TableName("sys_user")
    public class User {
        @TableId
        private Long id;
        @TableField("nickname")
        private String name;
        private Integer age;
        private String email;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    @TableLogic

    用于逻辑删除

    条件构造器

    querywapper

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

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

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

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

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

    查询值在xx于xx之间

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

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

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

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

    updatewapper

    将name为空的修改

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

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Lambdaupdatewapper

    和上面的Lambdaquerywapper类似

    分页插件

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

    @Configuration
    public class MpConfig {
        
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return interceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

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

    在page对象中我们可以得到数据,总记录数等数据
    在这里插入图片描述

    乐观锁

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

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

    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    
    • 1
  • 相关阅读:
    虚拟数字人直播软件实现带货功能,成为新一代直播风口!
    FlinkSQL: Create function using jar-located in HDFS
    大咖说*计算讲谈社|商用车智能驾驶商业化实践
    C++ stack和queue
    Debye-Wolf积分计算器的用法
    springboot常用组件的集成
    数据存储,详细讲解
    行业沙龙第一期丨汽配供应链业务的解痛之道与数字化未来
    卷积神经网络基础
    基于Java毕业设计养老机构系统源码+系统+mysql+lw文档+部署软件
  • 原文地址:https://blog.csdn.net/qq_61057438/article/details/127794091