• MyBatis-Plus简介


    一、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 操作智能分析阻断,也可自定义拦截规则,预防误操作

    三、快速开始

    1、创建一张user表

    //user表存在,删除user表
    DROP TABLE IF EXISTS user;
    //创建user表
    CREATE TABLE user
    (
      id BIGINT(20) NOT NULL COMMENT '主键ID',
      name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
      age INT(11) NULL DEFAULT NULL COMMENT '年龄',
      email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (id)
    );

     

    //删除user表数据
    DELETE FROM user;
    //user表插入数据
    INSERT INTO user (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');

    2、创建Spring Boot工程

    (1)依赖引入(pom.xml)

    注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。

    <dependencies>
        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        
        <!-- 模板引擎 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>2.0</version>
            </dependency>
            
        <!--lombok用来简化实体类,只需要加一个注解,就不用写get和set方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

      <!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>

    (2)书写项目配置(application.properties)

    # 服务端口
    server.port=8001
    # 服务名
    spring.application.name=service-user

    # 环境设置:dev、test、prod
    spring.profiles.active=dev


    # mysql数据库连接
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/MyBatis-plus?serverTimezone=GMT%2B8
    spring.datasource.username=root
    spring.datasource.password=root


    #返回json的全局时间格式
    spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
    spring.jackson.time-zone=GMT+8

    #mybatis日志
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    #配置mapper xml文件的路径
    mybatis-plus.mapper-locations=classpath:com/dashu/user/mapper/xml/*.xml

    (3) 代码生成器

    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.generator.config.rules.DateType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import org.junit.Test;


    /**
     * 代码生成器
     */
    public class GetCode {

        @Test
        public void main1() {

            // 1、创建代码生成器
            AutoGenerator mpg = new AutoGenerator();

            // 2、全局配置
            GlobalConfig gc = new GlobalConfig();
            String projectPath = System.getProperty("user.dir");
            System.out.println(projectPath);
            gc.setOutputDir("项目绝对地址" + "/src/main/java");//生成路径
            gc.setAuthor("dashu");//作者名
            gc.setOpen(false); //生成后是否打开资源管理器
            gc.setFileOverride(false); //重新生成时文件是否覆盖
            /*
             * mp生成service层代码,默认接口名称第一个字母有 I
             * UcenterService
             * */
            gc.setServiceName("%sService"); //去掉Service接口的首字母I
            gc.setIdType(IdType.ID_WORKER_STR); //主键策略
            gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
            gc.setSwagger2(true);//开启Swagger2模式

            mpg.setGlobalConfig(gc);

            // 3、数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://localhost:3306/MyBatis-plus?serverTimezone=GMT%2B8");
            dsc.setDriverName("com.mysql.cj.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("root");
            dsc.setDbType(DbType.MYSQL);
            mpg.setDataSource(dsc);

            // 4、包配置
            PackageConfig pc = new PackageConfig();
            pc.setModuleName("user"); //模块名
            pc.setParent("com.dashu");
            pc.setController("controller");
            pc.setEntity("entity");
            pc.setService("service");
            pc.setMapper("mapper");
            mpg.setPackageInfo(pc);

            // 5、策略配置
            StrategyConfig strategy = new StrategyConfig();
            strategy.setInclude("user");//表名,根据表生成代码
            strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
            strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

            strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
            strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

            strategy.setRestControllerStyle(true); //restful api风格控制器
            strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

            mpg.setStrategy(strategy);

            // 6、执行
            mpg.execute();
        }
    }

    四、MyBatis-Plus的简单CURD

    1、 insert

    @Autowired
        private UserMapper userMapper;

    @Test
        public void insertUser(){

            User user = new User();
            user.setName("张国荣");
            user.setAge(18);
            user.setEmail("zhangguorong@qq.com");

            int result = userMapper.insert(user);
            System.out.println(result); //影响的行数
            System.out.println(user); //id自动回填
        }

    2、 update

    @Autowired
        private UserMapper userMapper;

    @Test
        public void testUpdateById(){

            User user = new User();
            user.setId(1L);//id
            user.setAge(20);

            int result = userMapper.updateById(user);
            System.out.println(result);//影响的行数

        }

    3、 查询

    (1)根据id查询记录

    @Test
    public void testSelectById(){

        User user = userMapper.selectById(1L);
        System.out.println(user);
    }

    (2)通过多个id批量查询

    @Test
    public void testSelectBatchIds(){

        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.forEach(System.out::println);
    }

    (3)简单的条件查询

    @Test
    public void testSelectByMap(){

        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "张国荣");
        map.put("age", 18);
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

    注意:map中的key对应的是数据库中的列名。例如数据库user_id,实体类是userId,这时map的key需要填写user_id

    4、 删除

    (1)根据id删除记录

    @Test
    public void testDeleteById(){

        int result = userMapper.deleteById(8L);
        System.out.println(result);
    }

    (2)批量删除

    @Test
        public void testDeleteBatchIds() {

            int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));
            System.out.println(result);
        }

    (3)简单的条件查询删除

    @Test
    public void testDeleteByMap() {

        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "张国荣");
        map.put("age", 18);

        int result = userMapper.deleteByMap(map);
        System.out.println(result);
    }

    五、MyBatis-Plus条件构造器

    1、Wrapper

    Wrapper :条件构造抽象类,最顶端父类
    AbstractWrapper :用于查询条件封装,生成 sql 的 where 条件
    QueryWrapper :Entity 对象封装操作类,不是用lambda语法
    UpdateWrapper :Update 条件封装,用于Entity对象更新操作
    AbstractLambdaWrapper :Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
    LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
    LambdaUpdateWrapper :Lambda 更新封装Wrapper

    2、构造器方法

    eq

    eq(R column, Object val)
    eq(boolean condition, R column, Object val)

    等于 =
    例: eq(“name”, “老王”)—>name = ‘老王’

    ne

    ne(R column, Object val)
    ne(boolean condition, R column, Object val)

    不等于 <>
    例: ne(“name”, “老王”)—>name <> ‘老王’

    gt

    gt(R column, Object val)
    gt(boolean condition, R column, Object val)

    大于 >
    例: gt(“age”, 18)—>age > 18

    lt

    lt(R column, Object val)
    lt(boolean condition, R column, Object val)

    小于 <
    例: lt(“age”, 18)—>age < 18

    le

    le(R column, Object val)
    le(boolean condition, R column, Object val)

    小于等于 <=
    例: le(“age”, 18)—>age <= 18

    between

    between(R column, Object val1, Object val2)
    between(boolean condition, R column, Object val1, Object val2)

    BETWEEN 值1 AND 值2
    例: between(“age”, 18, 30)—>age between 18 and 30

    like

    like(R column, Object val)
    like(boolean condition, R column, Object val)

    LIKE ‘%值%’
    例: like(“name”, “王”)—>name like ‘%王%’

    isNull

    isNull(R column)
    isNull(boolean condition, R column)

    字段 IS NULL
    例: isNull(“name”)—>name is nul

    参考教程

    五、MyBatis-Plus插件

    user表添加version(版本)、isDelete(逻辑删除)、createTime(创建时间)、updateTime
    (更新时间)字段

    1、自动填充

    实体类上添加注解

    @Data
    public class User {
        ......
         
        //版本
        @TableField(fill = FieldFill.INSERT)
        private Integer version;
        
        //逻辑删除
        @TableField(fill = FieldFill.INSERT)
        private boolean isDelete;
        
        //创建时间
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;

      //添加时间
        //@TableField(fill = FieldFill.UPDATE)
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    }

    MyBatis-Plus元处理器

    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;

    import java.util.Date;

    /**
     * 自动填充元处理器
     */
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("isDeleted", false, metaObject);//逻辑删除
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
            this.setFieldValByName("version", 1, metaObject);//版本
        }

        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }

    2、乐观锁

    主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
    乐观锁实现方式:
    取出记录时,获取当前version
    更新时,带上这个version
    执行更新时, set version = newVersion where version = oldVersion
    如果version不对,就更新失败

    实体类上添加注解

    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

    乐观锁插件

    /**
         * 乐观锁插件
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }

    3、逻辑删除

    物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据
    逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

    实体类上添加注解

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private boolean isDelete;

    逻辑删除插件

    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

    application.properties 加入配置

    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0

    4、性能分析

    性能分析拦截器,用于输出每条 SQL 语句及其执行时间
    SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题

    插件

    /**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }

    5、分页插件

    分页插件

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    test实例

    @Test
    public void testSelectPage() {

        Page<User> 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());
    }

    6、MyBatis-Plus插件类

    import com.baomidou.mybatisplus.core.injector.ISqlInjector;
    import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;

    @Configuration
    public class MybatisPlusConfig {
        /**
         * 乐观锁插件
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }

        /**
         * 分页插件
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }

        /**
         * 逻辑删除插件
         * @return
         */
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }

        /**
         * SQL 执行性能分析插件
         * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
         */
        @Bean
        @Profile({"dev","test"})// 设置 dev test 环境开启
        public PerformanceInterceptor performanceInterceptor() {
            PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
            performanceInterceptor.setMaxTime(3000);//ms,超过此处设置的ms则sql不执行
            performanceInterceptor.setFormat(true);
            return performanceInterceptor;
        }
    }

    转载自:

    https://blog.csdn.net/weixin_43521890/article/details/107682033

  • 相关阅读:
    【leetcode】1230.Toss Strange Coins
    2018.12.25 SOW
    L203 词汇题
    L202
    L201
    L200
    2018
    2018.12.21 Cmos- RF
    L198
    L196 Hospital educations
  • 原文地址:https://www.cnblogs.com/nmcc33/p/13431807.html
Copyright © 2020-2023  润新知