T O P

[资源分享]     MyBatis-Plus

  • By - 楼主

  • 2021-09-09 16:00:03
  • 简介

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

    支持数据库

    • mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb
    • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库

    框架结构

    快速开始

    入门

    1. 创建数据表
    DROP TABLE IF EXISTS 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)
    );
    
    DELETE FROM 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');
    
    1. 创建Spring Boot项目
    2. 导入依赖
    <dependency>
        <groupid>org.projectlombok</groupid>
        <artifactid>lombok</artifactid>
    </dependency>
    
    <!--jdbc-->
    <dependency>
        <groupid>mysql</groupid>
        <artifactid>mysql-connector-java</artifactid>
    </dependency>
    
    <dependency>
        <groupid>com.baomidou</groupid>
        <artifactid>mybatis-plus-boot-starter</artifactid>
        <version>3.4.3.2</version>
    </dependency>
    
    1. 数据库配置
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password:
        url: jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8
    
    1. 创建和表对应的实体类
    package com.zeng.pojo;
    import lombok.Data;
    
    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
    1. mapper接口
    package com.zeng.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.zeng.pojo.User;
    
    public interface UserMapper extends BaseMapper<user> {
    
    }
    
    1. 扫描Mapper
    package com.zeng;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @MapperScan("com.zeng.mapper")
    @SpringBootApplication
    public class MybatisPlusApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusApplication.class, args);
        }
    }
    
    1. 测试类
    package com.zeng;
    
    import com.zeng.mapper.UserMapper;
    import com.zeng.pojo.User;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    @SpringBootTest
    class MybatisPlusApplicationTests {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testSelect() {
            System.out.println(("----- selectAll method test ------"));
            List<user> userList = userMapper.selectList(null);
            userList.forEach(System.out::println);
        }
    }
    
    1. 输出结果
    ...
    User(id=1, name=Jone, age=18, email=test1@baomidou.com)
    User(id=2, name=Jack, age=20, email=test2@baomidou.com)
    User(id=3, name=Tom, age=28, email=test3@baomidou.com)
    User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
    User(id=5, name=Billie, age=24, email=test5@baomidou.com)
    ...
    

    小结

    • 遇到的问题
    1. @Autowired 标记的变量变红:
      1. 不影响 正常运行
      2. 可以换成@Resource

    1. 导入依赖问题:
      1. 不要导入mybatis-plus,要导入mybatis-plus-boot-starter
    • 知识点
    1. Mapper接口继承的BaseMapper类已经封装了常用的CRUD,直接调用即可
    2. 一定不要忘了扫描Mapper,@MapperScan

    Log配置

    # 方式一
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 
        
    # 方式二 application.yml 中增加配置,指定 mapper 文件所在的包
    logging:
      level:
        com.baomidou.example.mapper: debug
    

    注解

    简单认识常用注解

    【@TableName 】
        @TableName               用于定义表名
    注:
        常用属性:
            value                用于定义表名
    
    【@TableId】
        @TableId                 用于定义表的主键
    注:
        常用属性:
            value           用于定义主键字段名
            type            用于定义主键类型(主键策略 IdType)
    
       主键策略:
          IdType.AUTO          主键自增,系统分配,不需要手动输入
          IdType.NONE          未设置主键
          IdType.INPUT         需要自己输入 主键值。
          IdType.ASSIGN_ID     系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
          IdType.ASSIGN_UUID   系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。
    
    【@TableField】  
        @TableField            用于定义表的非主键字段。
    注:
        常用属性:
            value                用于定义非主键字段名
            exist                用于指明是否为数据表的字段, true 表示是,false 为不是。
            fill                 用于指定字段填充策略(FieldFill)。
            
        字段填充策略:(一般用于填充 创建时间、修改时间等字段)
            FieldFill.DEFAULT         默认不填充
            FieldFill.INSERT          插入时填充
            FieldFill.UPDATE          更新时填充
            FieldFill.INSERT_UPDATE   插入、更新时填充。
    
    【@TableLogic】
        @TableLogic           用于定义表的字段进行逻辑删除(非物理删除)
    注:
        常用属性:
            value            用于定义未删除时字段的值
            delval           用于定义删除时字段的值
            
    【@Version】
        @Version             用于字段实现乐观锁
    

    代码生成器

    依赖

    代码生成器依赖

    <dependency>
        <groupid>com.baomidou</groupid>
        <artifactid>mybatis-plus-generator</artifactid>
        <version>3.4.1</version>
    </dependency>
    

    模板引擎 依赖

    <dependency>
        <groupid>org.apache.velocity</groupid>
        <artifactid>velocity-engine-core</artifactid>
        <version>2.3</version>
    </dependency>
    

    配置

    // Step1:代码生成器
    AutoGenerator mpg = new AutoGenerator();
    
    // Step2:全局配置
    GlobalConfig gc = new GlobalConfig();
    // 填写代码生成的目录(需要修改)
    String projectPath = "E:\\Course\\Java\\IdeaProjects\\Mybatis-Plus";
    // 拼接出代码最终输出的目录
    gc.setOutputDir(projectPath + "/src/main/java");
    // 配置开发者信息(可选)(需要修改)
    gc.setAuthor("Jiuan");
    // 配置是否打开目录,false 为不打开(可选)
    gc.setOpen(false);
    // 实体属性 Swagger2 注解,添加 Swagger 依赖,开启 Swagger2 模式(可选)
    //gc.setSwagger2(true);
    // 重新生成文件时是否覆盖,false 表示不覆盖(可选)
    gc.setFileOverride(false);
    // 配置主键生成策略,此处为 ASSIGN_ID(可选)
    gc.setIdType(IdType.ASSIGN_ID);
    // 配置日期类型,此处为 ONLY_DATE(可选)
    gc.setDateType(DateType.ONLY_DATE);
    // 默认生成的 service 会有 I 前缀
    gc.setServiceName("%sService");
    mpg.setGlobalConfig(gc);
    
    // Step3:数据源配置(需要修改)
    DataSourceConfig dsc = new DataSourceConfig();
    // 配置数据库 url 地址
    dsc.setUrl("jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8");
    // dsc.setSchemaName("testMyBatisPlus"); // 可以直接在 url 中指定数据库名
    // 配置数据库驱动
    dsc.setDriverName("com.mysql.cj.jdbc.Driver");
    // 配置数据库连接用户名
    dsc.setUsername("root");
    // 配置数据库连接密码
    dsc.setPassword("");
    mpg.setDataSource(dsc);
    
    // Step:4:包配置
    PackageConfig pc = new PackageConfig();
    // 配置父包名(需要修改)
    pc.setParent("com.zeng");
    // 配置模块名(需要修改)
    pc.setModuleName("test_mybatis_plus");
    // 配置 entity 包名
    pc.setEntity("entity");
    // 配置 mapper 包名
    pc.setMapper("mapper");
    // 配置 service 包名
    pc.setService("service");
    // 配置 controller 包名
    pc.setController("controller");
    mpg.setPackageInfo(pc);
    
    // Step5:策略配置(数据库表配置)
    StrategyConfig strategy = new StrategyConfig();
    // 指定表名(可以同时操作多个表,使用 , 隔开)(需要修改)
    strategy.setInclude("user");
    // 配置数据表与实体类名之间映射的策略
    strategy.setNaming(NamingStrategy.underline_to_camel);
    // 配置数据表的字段与实体类的属性名之间映射的策略
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    // 配置 lombok 模式
    strategy.setEntityLombokModel(true);
    // 配置 rest 风格的控制器(@RestController)
    strategy.setRestControllerStyle(true);
    // 配置驼峰转连字符
    strategy.setControllerMappingHyphenStyle(true);
    // 配置表前缀,生成实体时去除表前缀
    // 表名为 test_mybatis_plus_user,模块名为 test_mybatis_plus,去除前缀后剩下为 user。
    strategy.setTablePrefix(pc.getModuleName() + "_");
    mpg.setStrategy(strategy);
    
    // Step6:执行代码生成操作
    mpg.execute();
    

    小结

    1. 使用代码生成器之前先要配置数据库才能使用
    spring:
        datasource:
            driver-class-name: com.mysql.cj.jdbc.Driver
            username: root
            password:
            url: jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8
    
    1. 一定要导入依赖,生成器只是生成代码,没有依赖,如lombok

    CRUD

    Mapper接口

    说明:

    • 通用 CRUD 封装BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
    • 泛型 T 为任意实体对象
    • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
    • 对象 Wrapper 为条件构造器

    Insert

    // 插入一条记录
    int insert(T entity);
    

    参数说明

    类型 参数名 描述
    T entity 实体对象
    @Test
    void testInsert(){
        //根据对象增加
        User user = new User();
        user.setName("zeng");
        user.setEmail("zeng@qq.com");
        user.setAge(18);
        userMapper.insert(user);
    }
    

    Delete

    // 根据 entity 条件,删除记录
    int delete(@Param(Constants.WRAPPER) Wrapper<t> wrapper);
    // 删除(根据ID 批量删除)
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<!--? extends Serializable--> idList);
    // 根据 ID 删除
    int deleteById(Serializable id);
    // 根据 columnMap 条件,删除记录,多条件
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<string, object=""> columnMap);
    

    参数说明

    类型 参数名 描述
    Wrapper wrapper 实体对象封装操作类(可以为 null)
    Collection idList 主键ID列表(不能为 null 以及 empty)
    Serializable id 主键ID
    Map<string, object=""> columnMap 表字段 map 对象
    void testDelete(){
        //构造器
        //userMapper.delete(null);
    
        //根据主键多个删除
        List<integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(2);
        userMapper.deleteBatchIds(idList);
    
        //主键删除
        userMapper.deleteById("3");
    
        //多条件删除
        Map<string, object=""> columnMap = new HashMap<>();
        columnMap.put("id",4);
        columnMap.put("age",21);
        userMapper.deleteByMap(columnMap);
    }
    

    Update

    // 根据 whereWrapper 条件,更新记录
    int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<t> whereWrapper);
    // 根据 ID 修改
    int updateById(@Param(Constants.ENTITY) T entity);
    

    参数说明

    类型 参数名 描述
    T entity 实体对象 (set 条件值,可为 null)
    Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
    @Test
    void testUpdate(){
        //构造器
        //userMapper.update();
    
        //根据对象
        User user = new User();
        user.setId((long)1);
        user.setName("张三");
        userMapper.updateById(user);
    }
    

    Select

    // 根据 ID 查询
    T selectById(Serializable id);
    // 根据 entity 条件,查询一条记录
    T selectOne(@Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    
    // 查询(根据ID 批量查询)
    List<t> selectBatchIds(@Param(Constants.COLLECTION) Collection<!--? extends Serializable--> idList);
    // 根据 entity 条件,查询全部记录
    List<t> selectList(@Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    // 查询(根据 columnMap 条件)
    List<t> selectByMap(@Param(Constants.COLUMN_MAP) Map<string, object=""> columnMap);
    // 根据 Wrapper 条件,查询全部记录
    List<map<string, object="">> selectMaps(@Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
    List<object> selectObjs(@Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    
    // 根据 entity 条件,查询全部记录(并翻页)
    IPage<t> selectPage(IPage<t> page, @Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    // 根据 Wrapper 条件,查询全部记录(并翻页)
    IPage<map<string, object="">> selectMapsPage(IPage<t> page, @Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    // 根据 Wrapper 条件,查询总记录数
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<t> queryWrapper);
    

    参数说明

    类型 参数名 描述
    Serializable id 主键ID
    Wrapper queryWrapper 实体对象封装操作类(可以为 null)
    Collection idList 主键ID列表(不能为 null 以及 empty)
    Map<string, object=""> columnMap 表字段 map 对象
    IPage page 分页查询条件(可以为 RowBounds.DEFAULT)
    @Test
    void testSelect(){
        //查询全部
        List<user> users = userMapper.selectList(null);
    
        for (User user:users) {
            System.out.println(user);
        }
    }
    

    Service接口

    说明:

    • 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除``list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
    • 泛型 T 为任意实体对象
    • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
    • 对象 Wrapper 为 条件构造器

    条件构造器

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册