一 背景

做的项目多了,就会发现,每次新项目起步,都是一样的。应该整理一个通用的模板来进行快速启动新项目。

二 使用到的框架简介

1.SpringBoot

SpringBoot可以让你快速构建基于Spring的Web应用程序,内置多种Web容器(如Tomcat),通过启动入口程序的main函数即可运行。

2.PagerHelper

MyBatis分页插件,简单的几行代码就能实现分页,在与SpringBoot整合时,只要整合了PagerHelper就自动整合了MyBatis。

PageHelper.startPage(pageNum, pageSize);
//之后进行查询操作将自动进行分页
List<PmsBrand> brandList = brandMapper.selectByExample(new PmsBrandExample());
//通过构造PageInfo对象获取分页信息,如当前页码,总页数,总条数
PageInfo<PmsBrand> pageInfo = new PageInfo<PmsBrand>(list);

3.Druid

MyBatis的代码生成器,可以根据数据库生成model、mapper.xml、mapper接口和Example,通常情况下的单表查询不用再手写mapper。

4.Mybatis-gnerator

MyBatis的代码生成器,可以根据数据库生成model、mapper.xml、mapper接口和Example,通常情况下的单表查询不用再手写mapper。

三 工具及环境

IDEA
Jdk1.8

四 搭建步骤

1.新建 SpringBoot 项目,版本选择 < 3.0.0 ,因为 3+ 版本要求 JDK 最低为 17;
2.添加项目依赖:

<!--SpringBoot通用依赖模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--MyBatis分页插件-->
        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>

        <!--集成druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!-- MyBatis 生成器 -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.1</version>
        </dependency>
        <!--Mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

3.配置项目配置文件 resource/application.yml:

server:
  port: 8080

spring:
  main:
    banner-mode: off
  application:
    name: mbg
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${DB:127.0.0.1:3306}/db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:root}

mybatis:
  mapper-locations:
    - classpath:dao/*.xml
    - classpath*:com/**/mapper/*.xml

logging:
  level:
    root: INFO

application.yml 文件中涉及到的 DB、DB_USERNAME、DB_PASSWORD 需要单独的配置文件进行配置,
需要在项目根目录下创建文件 application.properties ,并在里面做以下配置:

# 开发环境启用 dev
spring.profiles.active=dev
DB=127.0.0.1:3306
DB_USERNAME=root
DB_PASSWORD=123456

spring.datasource.url=jdbc:mysql://${DB:127.0.0.1:3306}/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false

.example=DEBUG

需要注意,该 application.properties 是开发环境的配置,仓库不需要提交,需要在项目的 .gitignore 文件中配置忽略该文件:

application.properties

4.数据库配置 - Mybatis generator 配置:resources:generatorConfig.xml

配置数据库连接, Mybatis generator 生成 model、mapper 接口已经 mapper.xml 的路径。

<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 属性配置文件 -->
    <properties resource="generator.properties" />

    <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
        <!-- 配置 SQL 语句中的前置分隔符 -->
        <property name="beginningDelimiter" value="`"/>
        <!-- 配置 SQL 语句中的后置分隔符 -->
        <property name="endingDelimiter" value="`"/>

        <!-- 配置生成 Java 文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 为模型生成序列化方法 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <!-- 生成 mapper.xml 时覆盖原文件 -->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"></plugin>
        <!-- 配置注释生成器 -->
        <commentGenerator type="com.example.demo.mbg.CommentGenerator">
            <!-- 是否阻止生成的注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 是否阻止生成的注释包含时间戳 -->
            <property name="suppressDate" value="true"/>
            <!-- 是否添加数据库表的备注信息 -->
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <!-- 配置 MBG 要连接的数据库信息 -->
        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.connectionURL}"
                        userId="${jdbc.userId}"
                        password="${jdbc.password}">
            <!-- 解决 MySql 驱动升级到 8.0 后不生成指定数据库代码的问题 -->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 用于控制实体类的生成 -->
        <javaModelGenerator targetPackage="com.example.demo.mbg.model" targetProject="demo\src\main\java"/>

        <!-- 用于控制Mapper.xml文件的生成 -->
        <sqlMapGenerator targetPackage="com.example.demo.mbg.mapper" targetProject="demo\src\main\resources"/>

        <!-- 用于控制Mapper接口的生成 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.mbg.mapper"
                             targetProject="demo\src\main\java"/>

        <!-- 配置需要生成的表,生成全部表 tableName 设为 %, 如果想要去除表的前缀,需要指定为要去除的前缀 % -->
        <table tableName="t_%">
            <!-- 用来指定主键生成策略 -->
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
            <!-- 重新命名 domainObject Rule 将表前缀 t 去掉 -->
            <domainObjectRenamingRule searchString="^T" replaceString="" />
        </table>
    </context>
</generatorConfiguration>

generator.properties 配置文件如下:resources:generator.properties

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.userId=root
jdbc.password=123456

自定义注释生成器 com.example.demo.mbg.CommentGenerator.java template 如下(可进行自己定制):

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**
 * 自定义注释生成器。
 */
public class CommentGenerator extends DefaultCommentGenerator {

    private boolean addRemarkComments = false;

    /** 设置用户配置的参数。 */
    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
    }

    /** 给字段添加注释。 */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        // 根据参数和备注信息判断是否添加备注信息
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            addFieldJavaDoc(field, remarks);
        }
    }

    /**
     * 给 model 字段添加注释。
     *
     * @param field 字段。
     * @param remarks 注释。
     */
    private void addFieldJavaDoc(Field field, String remarks) {
        // 文档注释开始
        field.addJavaDocLine("/**");
        String[] remarkLines = remarks.split(System.getProperty("line.separator"));
        for (String remarkLine : remarkLines) {
            field.addJavaDocLine(" * " + remarkLine);
        }
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }
}

MBG 代码生成工具如下(运行 Generator 的 main 函数生成代码):

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * MBG 代码生成工具。
 */
public class Generator {

    public static void main(String[] args) {
        // MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<>();

        // 当生成的代码重复时,覆盖原代码
        boolean overWrite = true;

        // 读取我们的 MBG 配置文件
        try (InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml")) {
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration configuration = cp.parseConfiguration(is);

            DefaultShellCallback callback = new DefaultShellCallback(overWrite);

            // 创建 MBG
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(configuration, callback, warnings);
            myBatisGenerator.generate(null);

            // 输出警告信息
            for (String warning : warnings) {
                System.out.println(warning);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五 遇到的问题

  1. domainObjectRenamingRule 爆红;

    解决: 需要升级 org.mybatis.generator:mybatis-generator-core 依赖版本,可升级到 1.4.1
  2. generatorConfig.xml 中配置的 targetProject 路径找不到,注意:这个 targetProject 路径需要填绝对路径;

mybatis springboot vue 架构图_mybatis