SpringBoot+MyBatis 搭建项目基本框架

news2024/11/29 10:49:27

参考资料: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.coloradmin.cn/o/607013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【实践经验】Latex 表格列间距调整

目录 背景命令 背景 有时候表格列之间的空白区域很大&#xff0c;超出了页面宽度。这时候如果调整表格列与列之间的间隔&#xff0c;无需调整字体大小就能解决这个问题。 命令 \setlength\tabcolsep{3pt} 注意&#xff0c;需要将以上命令&#xff0c;插入到 \begin{table} …

【项目总结2023年6月3日记】:总结最近项目

项目总结&#xff0c;记录一下成长&#xff0c;欢迎大家一起学习&#xff0c;一起交流技术&#xff0c;谢谢支持。 项目&#xff1a;从车多色二维码识别&#xff0c;讲究的就是一个不差&#xff0c;识别的准准的 从车多色二维码识别&#xff0c;讲究的就是一个不差&#xff0c;…

javaScript蓝桥杯----回文字符串

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 有言曰&#xff1a;“回文诗&#xff0c;回复读之&#xff0c;皆歌而成文也”。回文诗&#xff0c;是使用词序回环往复的方式所成的诗&#xff0c;通俗来讲就是正读或者倒读都能成为诗句。历经数代诗人的创新&#xf…

chatgpt赋能python:Python取值:介绍

Python取值&#xff1a;介绍 Python是一种非常流行的高级编程语言&#xff0c;适用于各种任务&#xff0c;包括数据科学、机器学习、Web开发和自动化。它被广泛使用&#xff0c;因为它易于学习、易于使用、易于阅读和易于维护。Python中的取值对于程序员来说是一个极其有用的工…

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.6测评报告编制报送和监督检查

目录 测评报告管理要求 测评报告编制 测评报告审核 测评报告批准和签发 测评报告存档 测评报告更正 测评报告作废和销毁 保密要求 测评报告体例 测评相关信息报送 1.基本要求 ①测评报告的备案 ②被测信息系统密码应用数据的采集报送 2.测评信息的采集、报送 1&a…

RVOS环境搭建-01

RVOS环境搭建-01 背景介绍操作系统的定义操作系统的分类典型的 RTOS 介绍课程系统RVOS简介 Hello WorldQEMU介绍QEMU-virt 地址映射 系统引导引导程序要做哪些事情如何判断当前hart是不是第一个hart?如何初始化栈? 如何在屏幕输出Hello World通过串口输出UART特点UART的物理接…

无线通信技术

无线通信网包括面向语言通信的移动电话系统以及面向数据传输的无线局域网和无线广域网。 蜂窝通信系统&#xff1a; 1978年&#xff0c;美国贝尔实验室开发了高级移动电话系统&#xff08;AMPS&#xff09;。 AMPS采用模拟制式的频分双工&#xff08;FDD&#xff09;技术 第…

mysql数据类型有哪几种

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

Temporal.Duration 规范用法

后端突然告诉我返回给我的时间用了一个新的规范&#xff0c;我展示的时候突然发现这个规范蛮有意思&#xff0c;算是一个新的规范&#xff0c;展示到页面的时候也思考了很多&#xff0c;记录一下子~&#xff08;注&#xff1a;此 blog 主要目的仅是供自己记录&#xff0c;所以写…

chatgpt赋能python:Python取出列表中的某个数

Python取出列表中的某个数 在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;它可以用来存储一系列有序的元素。在实际的开发中&#xff0c;经常会需要从列表中取出某个特定的数值&#xff0c;本文将介绍如何在Python中完成这个操作。 1. 使用index方法 Pyth…

AI实战营:MMPose开源算法库

RTMPose关键点检测全流程 MMPose预训练模型预测-命令行 预测单张图 # HRNet python .\demo\topdown_demo_with_mmdet.py .\demo\mmdetection_cfg\faster_rcnn_r50_fpn_coco.py https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faste…

chatgpt赋能python:Python反转语句:实用技巧提升编程能力

Python反转语句&#xff1a;实用技巧提升编程能力 Python是一门流行的编程语言&#xff0c;许多开发者都会选择Python作为主要的开发语言。其中一个原因是Python的语法简单易学&#xff0c;不仅适合初学者入门&#xff0c;也能被经验丰富的开发者用来构建复杂应用程序。在本文…

【网络原理】数据链路层 和 应用层 重点协议

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f340;一. 以太网协议&#xff08;数据链路层&#xff09;&#x1f33b;二. DNS &#xff08;应用层&#xff09;&#x1f33f;三. 网络原理知识面试总结 &#x1f34…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)

全方位渗透和探究SpringMVC的核心原理和运作机制 SpringMVC简介Spring Web MVC是什么Spring Web MVC的工作模式Spring Web MVC能帮我们做什么SpringMVC的底层依赖 SpringMVC工作流程SpringMVC中的组件DispatcherServlet前端控制器DispatcherServlet的职责和作用 HandlerMapping…

chatgpt赋能python:Python如何发送手机短信:实现方法解析和应用场景介绍

Python如何发送手机短信&#xff1a;实现方法解析和应用场景介绍 随着移动 App 的兴起&#xff0c;手机短信已成为现代人日常生活中不可或缺的一部分。在有些场景下需要编写 Python 程序去自动化发送短信&#xff0c;例如企业营销活动、警报系统等。本文将介绍 Python 发送短信…

chatgpt赋能python:Python可以搜集网上资料吗?

Python 可以搜集网上资料吗&#xff1f; Python 是一种非常流行的编程语言&#xff0c;它广泛应用于数据科学、机器学习、人工智能等领域。作为一名 Python 工程师&#xff0c;我们经常需要在互联网上搜集资料来解决开发中的问题&#xff0c;但是有些人会问&#xff1a;Python…

设计模式B站学习(一)(java)

这里写目录标题 一、设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 学习设计模式的必要性1.4 设计模式分类 二、UML图2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类图表示方法2.3.2 类与类之间关系的表示方法2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3…

C语言,指针详解

1. 指针是什么&#xff1f; 1. 指针是内存中一个最小单元的编号 2. 口头上的“指针”&#xff0c;指的是指针变量 #include<stdio.h>int main() {int a10;int * pa&a;// pa 是一个指针变量,用来存放 a 的地址//int ——> pa 所指向对象的类型//* 代表 pa是个指针…

【ros/ros2】ros2 humble镜像制作过程中碰到的问题记录

文章目录 序言1. 避免手动设置时区2. docker build中间某一步失败了3. sudo apt install ros-humble-desktop安装报错 E: Unable to locate package ros-humble-desktop4. 编译ros2 humnble时报错5. sudo rosdep init失败6. 下载依赖时失败&#xff1a;rosdep install --from-p…

局域网技术

共享信道的分配技术是局域网的核心技术&#xff0c;而这一技术又与网络的拓扑结构和传输介质有关。 拓扑结构&#xff1a; 1.总线型拓扑&#xff1a; 总线一种多点广播介质&#xff0c;所有的站点通过接口硬件连接到总线上。 传输介质主要是同轴电缆&#xff08;基带和宽带…