参考资料: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();
}
}
}
五 遇到的问题
- domainObjectRenamingRule 爆红;
解决: 需要升级 org.mybatis.generator:mybatis-generator-core 依赖版本,可升级到 1.4.1 - generatorConfig.xml 中配置的 targetProject 路径找不到,注意:这个 targetProject 路径需要填绝对路径;