SpringBoot+MyBatis 搭建项目基本框架

news/2024/7/7 14:57:49

参考资料:mall整合SpringBoot+MyBatis搭建基本骨架

一 背景

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

二 使用到的框架简介

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

logging.level.com.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 路径需要填绝对路径;

在这里插入图片描述


http://www.niftyadmin.cn/n/393680.html

相关文章

信息论与编码 SCUEC DDDD 期末复习

1.证明熵的可加性 2.假设一帧视频图像可以认为是由3*10的五次方个像素组成&#xff08;每像素均独立变化&#xff09;&#xff0c;如果每个像素可取128个不同的等概率亮度表示。请计算出每帧图像含多少信息量&#xff1f;若有一口述者在约12000个汉字的字汇中选400个字来口述此…

C++——多态与虚表

目录 1.多态的实现 2.虚表 2.1虚函数重写是怎么实现的 2.2多态的原理 2.3静态绑定与动态绑定 3.单继承体系中的虚函数表 ​编辑4.多继承体系中的虚函数表 5.菱形继承的虚函数表 6.菱形虚拟继承的虚函数表 1.多态的实现 在C中&#xff0c;要想实现多态&#xff0c;必…

mysql数据类型有哪几种

Mysql支持的多种数据类型主要有&#xff1a;数值数据类型、日期/时间类型、字符串类型。 整数 浮点数&定点数 注&#xff1a;定点数以字符串形式存储&#xff0c;对精度要求高时使用decimal较好&#xff1b;尽量避免对浮点数进行减法和比较运算。 时间/日期类型 字符串类型…

在编程中,代理、委托、回调、钩子、句柄、打桩的区别

文章目录 代理委托委托与代理的区别 回调回调函数回调函数与普通函数的区别 钩子广义的钩子钩子与代理的区别钩子与委托的区别钩子与回调函数的区别 句柄句柄与钩子的区别 打桩打桩与代理的区别 代理 代理&#xff08;proxy&#xff09;&#xff1a;被代理类写好一套 API 的实现…

chatgpt赋能python:Python取消合并单元格

Python取消合并单元格 在Excel中&#xff0c;合并单元格是一个非常常见的操作&#xff0c;它可以将多个单元格合并成一个单元格。这样可视化效果会更好&#xff0c;但是实际上会影响数据的计算和操作。如果你想取消这个操作&#xff0c;手工操作可能会非常费时间。不过&am…

Linux账号管理与ACL权限设定(一)

Linux的账号与群组 Linux系统中&#xff0c;关于账号和群组&#xff0c;实际记录的是UID和GID的数字&#xff1b; 关于账号有两个非常重要的文件&#xff1a;/etc/passwd 和 /etc/shadow &#xff1b; /etc/passwd 文件结构&#xff1a; 账号名称&#xff1a;密码&#xff…

Git版本控制工具详解

1 邂逅版本控制工具 2 集中式和分布式区别 3 Git的环境安装搭建 4 Git初始化本地仓库 6 Git远程仓库和验证 目录 content 5 Git记录更新变化过程 7 Git的标签tag用法 8 Git分支的使用过程 9 工作中的Git Flow 10 Git远程分支的管理 11 Git rebase的使用 12 Git常见命…

什么情形下应该使用BFF?带你了解BFF的优势,即服务于前端的后端

BFF简介 BFF是一种Web架构&#xff0c;全名为Backends For Frontends&#xff0c;即为服务于前端的后端。这个词来源于Sam Newman的一篇文章&#xff1a;Pattern: Backends For Frontends。BFF一般指的是在前端与后端之间加增加一个中间层。为什么要在前端和后端之间增加一个B…