跟我学Springboot开发后端管理系统2:Mybatis-Plus实战

2020/05/02

在Matrix-Web项目中使用Mybatis-Plus作为操作数据库的ORM框架。在市面上常用的ORM框架有hibernetes、mybatis、JPA等,那么为什么选择Mybatis-Plus呢?主要基于以下方面考虑:

  • 兼容Mybatis,可以轻松写出很复杂的sql和业务逻辑。^_^
  • 简单、容易上手,单表操作不需要写mybatis的xml,代码自动生成,可以实现快速开发。
  • 基于Mybatis,和Mybatis完全兼容,和Mybatis相比,此框架无性能损耗(号称成为 MyBatis 最好的搭档)
  • Mybatis-Plus符合国人开发习惯
  • MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 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、SQLServer2005、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

Mybatis的结构如下:

以上部分来源于官网。

Mybatis-Plus代码生成

Myatis-Pluss是在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。符合本项目快速开发后端管理系统的宗旨。Mybatis-Plus提供了生成代码的插件,能够读取数据库里面的表,生成对应的实体类、Mapper类、写SQL的xml、Service类等,其中Mapper类和Service类具有操作单表CRUD能力,不需要额外写Sql语句。对于复杂的多表操作,还是需要写SQL语句。

sql语句准备

在数据库areis中,准备以下的sys_user表的数据,如下:


DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
  `user_id` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(80) NOT NULL COMMENT '密码,需加密存储',
  `realname` varchar(20) DEFAULT NULL COMMENT '真实姓名',
  `type` tinyint(3) DEFAULT '0' COMMENT '类型,1管理员 2.员工 3.普通用户',
  `mobile` varchar(30) DEFAULT NULL COMMENT '手机号',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `remarks` varchar(255) DEFAULT NULL COMMENT '备注',
  `status` tinyint(1) DEFAULT '1' COMMENT '0停用1启用2锁定',
  `avatar` varchar(255) DEFAULT NULL COMMENT '用户头像',
  `create_time` datetime DEFAULT NULL COMMENT '注册时间',
  `create_by` varchar(50) DEFAULT NULL COMMENT '创建人id',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
  `sex` int(2) DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `USERNAME_IDX` (`user_id`),
  KEY `REALNAME_IDX` (`realname`),
  KEY `idx_mobile` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户';

添加生成代码的依赖

Matrix-Web项目的代码生成模块为matrix-gen-code。在工程的pom文件加上代码生成的相关依赖,包括连接数据库依赖mysql-connector-java、代码生成模块mybatis-plus-generator、模板引擎依赖,代码如下:

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>

生成代码逻辑

Mybatis-Plus生成代码的逻辑比较简单,直接贴出源码,不再讲解。


public class MysqlGenerator {


   public static String[] tableNames={"sys_user"};

   public static String packageName="io.github.forezp.modules.system";
    /**
     * RUN THIS
     */
    public static void main(String[] args) {

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/generator-code/src/main/java");
        gc.setAuthor("forezp");
        gc.setOpen(false);
        gc.setDateType(DateType.ONLY_DATE);
        gc.setFileOverride(true);
        gc.setBaseColumnList(true);
        gc.setBaseResultMap(true);
        gc.setServiceName("%sService");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/aries?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");

        mpg.setDataSource(dsc);

        // 包配置s
        PackageConfig pc = new PackageConfig();
//        pc.setModuleName(scanner("模块名"));
        pc.setParent(packageName);
        pc.setController("controller");
        pc.setEntity("entity");
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/generator-code/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setSuperEntityClass("io.github.forezp.common.base.BaseEntity");
        strategy.setEntityLombokModel(true);
        strategy.setCapitalMode(true);
        strategy.setEntitySerialVersionUID(true);
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setInclude(tableNames);//修改替换成你需要的表名,多个表名传数组
        // strategy.setSuperControllerClass("io.github.forezp.modules.common.BaseController");

        strategy.setSuperEntityColumns("id", "create_by", "create_time", "update_by", "update_time");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

运行上面代码的Main方法,生成了实体类SysUser、SysUserMapper、SysUserService、SysUserServiceImpl、SysUserMapper.xml、SysUserController,代码就不再这里展示。

1

Spring Boot集成Mybatis-Plus

在Matrix-Web的后端代码模块matrix-web-backend,matrix-web-backend为Spring Boot工程,现在来讲解如何在Spring Boot中引入Mybatis-Plus。需要说明的是Matrix-Web后端采用Sharding-Jdbc、Druid、Mybatis-Plus三个组件作为操作数据库的框架,本篇文章之讲述如何Spring Boot集成Mybatis-Plus,后面的文章会讲述Sharding-Jdbc和Druid。

在工程的pom文件引入Mybatis-Plus的起步依赖,版本为3.1.2,代码如下:

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>${mybatisplus.spring.boot.version}</version>
</dependency>

在工程的配置文件appliaction.yml做mybatis-plus的相关配置,其中datasource为数据源,mapper-locations配置的是在存放mapper.xml的位置,typeAliasesPackage配置实体类的包地址,还有其他配置,具体看代码注释。全部配置如下:

mybatis-plus:
  datasource: dataSource
  mapper-locations: classpath:/mapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: io.github.forezp.modules.system.entity
  typeEnumsPackage: io.github.forezp.modules.system.entity.enums
  global-config:
    db-config:
      id-type: id_worker
      capital-mode: true
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 2
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #数据库大写下划线转换
    #capital-mode: true
    #序列接口实现类配置
    #key-generator: com.baomidou.springboot.xxx
    #逻辑删除配置
    logic-delete-value: 0
    logic-not-delete-value: 1
    #自定义填充策略接口实现
#    meta-object-handler: com.baomidou.springboot.xxx
    #自定义SQL注入器
    #sql-injector: com.baomidou.springboot.xxx
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在springBoot工程的启动文件SpringBootServletInitializer配置Mybtis的MapperScan的包名,配置了就会自动扫描Mapper,并注入到spring ioc容器里面。代码如下:

@SpringBootApplication
@MapperScan({"io.github.forezp.modules.system.mapper"     ,"io.github.forezp.modules.task.mapper","io.github.forezp.modules.activiti.mapper","io.github.forezp.modules.personnel.mapper"})
public class AriesApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(AriesApplication.class, args);
    }
}

将上一小节自动生成的代码,SysUser、SysUserMapper、SysUserService、SysUserServiceImpl、SysUserMapper.xml、SysUserController,放在相关的包下面,启动SpringBoot工程。这样Spring Boot整合mybatis-plus就整合好了。

总结

这篇文章主要讲述了如何使用Mybatis-Plus生成代码,然后讲解如何在Spring Boot中整合使用Mybatis-Plus。下篇文章将讲述如何使用Mybatis-Plus的自动填充功能和分页功能。

参加资料:

https://mp.baomidou.com/guide/#%E7%89%B9%E6%80%A7

源码下载

https://github.com/forezp/matrix-web

本文为原创文章,转载请标明出处。
本文链接:https://www.fangzhipeng.com/springboot/2020/05/02/mw-mybatis-plus.html
本文出自方志朋的博客


(转载本站文章请注明作者和出处 方志朋-forezp

宝剑锋从磨砺出,梅花香自苦寒来,用心分享,一起成长,做有温度的攻城狮!

Post Directory