使用Springboot+Mybatis+Mysql进行演示,使用maven导入Jar包,开发工具STS3.9
新建一个项目,使用springboot可以快速搭建出一个开发框架,项目搭建基本配置如下:
POM.XML 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lidong</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybaties依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<!--generator代码反向生成 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/mybatis-generator.jar</systemPath>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
</dependency>
<!--日志打印 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>com.xxg</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<configuration>
<verbose>false</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml文件最重要的需要jar包是
基本配置已经完成了,但是需要使用generator还需要编写generatorConfig.xml。为了是能让代码读取到相关配置,如数据库连接、代码生成策略。
demo:
现在数据库里已经有三个表,user、dept、kpi,分别表示,用户、部门和kpi。用户和部门是一对一关系,用户和kpi是一对多关系。
user表:
dept表:
kpi表:
因为在原生的mybatis-generator中没有一对一和一对多的关联关系的配置,说不反向生成代码的时候不会产生关联关系,不过感谢大神@半导体郗 编写的jar包在原生的基础上添加了一对一、一对多和关联添加、更新。下面我详细说一下使用。
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="application-dev.properties" />
<context id="sqlserverTables" defaultModelType="flat"
targetRuntime="MyBatis3">
<!-- 生成一对一配置 -->
<plugin type="cc.bandaotixi.plugins.OneToOnePlugin"></plugin>
<!-- 生成一对多配置 -->
<plugin type="cc.bandaotixi.plugins.OneToManyPlugin"></plugin>
<plugin type="cc.bandaotixi.plugins.BatchInsertPlugin"></plugin>
<plugin type="cc.bandaotixi.plugins.BatchUpdatePlugin"></plugin>
<!-- 生成的pojo,将implements Serializable -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<!-- <commentGenerator> 是否去除自动生成的注释 true:是 : false:否 <property name="suppressAllComments"
value="true" /> </commentGenerator> -->
<!--添加数据库的注释 -->
<commentGenerator type="cc.bandaotixi.plugins.BDTCommentGenerator">
<property name="javaFileEncoding" value="UTF-8" />
<property name="suppressDate" value="true" />
<property name="suppressAllComments" value="false" />
</commentGenerator>
<!-- 数据库链接URL、用户名、密码 -->
<jdbcConnection driverClass="${spring.datasource.driverClassName}"
connectionURL="${spring.datasource.url}" userId="${spring.datasource.username}"
password="${spring.datasource.password}">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,
也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下 -->
<javaModelGenerator targetPackage="com.lidong.demo.model"
targetProject="./src/main/java">
<property name="enableSubPackages" value="true" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--对应的mapper.xml文件 -->
<sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 对应的Mapper接口类文件 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.lidong.demo.dao" targetProject="./src/main/java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 列出要生成代码的所有表,这里配置的是不生成Example文件 -->
<table tableName="user" domainObjectName="User"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false" selectByPrimaryKeyQueryId="false">
<!--根据数据库字段名称转成驼峰写法 -->
<!--写法问题: oracle 数据库,字段不区分大小写,数据库中全是大写,驼峰写法:设置false 字段名称在驼峰中使用下划线"_" 例如:file_name
转为fileName -->
<!--写法问题: mysql 数据库,字段区分大小写,驼峰写法:设置true时 字段名称正常写法 例如:fileName 转为fileName;
设置false 则是filename -->
<property name="useActualColumnNames" value="true" />
<generatedKey column="userId" sqlStatement="MySql"
identity="true" />
<oneToOne mappingTable="dept" column="deptId" joinColumn="deptId" />
<oneToMany mappingTable="Kpi" column="userId" joinColumn="userId" />
<!-- 有对应实体的时候,把字段忽略生成 -->
<ignoreColumn column="dept" />
</table>
<table tableName="dept" domainObjectName="Dept"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false" selectByPrimaryKeyQueryId="false">
<generatedKey column="deptId" sqlStatement="MySql"
identity="true" />
</table>
</context>
</generatorConfiguration>
这部分是反向生成,运行时需要读取的配置,其中properties resource标签里是你的数据库连接的储存位置。
在springboot中可以有两种方式写配置文件,一种是.properties,另一种是.yml。两种方式都可以,但是.properties的优先级高于yml。在加载过程先加载yml,后加载.properties,如果里面有相同的属性配置,则后者覆盖前者,所以优先级越高,就最后才加载。一般情况下都是会使用一种方式,我是在做练习两种方式都尝试一下。
不过在数据库连接的配置方面,generator只能读取.properties的配置,不能读取.yml中的配置。
GeneratorMain.java
package com.lidong.demo;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
public class GeneratorMain {
public static void main(String[] args) {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
String genCfg = "/generatorConfig.xml";
File configFile = new File(GeneratorMain.class.getResource(genCfg).getFile());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = null;
try {
config = cp.parseConfiguration(configFile);
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
}
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = null;
try {
myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
} catch (InvalidConfigurationException e) {
e.printStackTrace();
}
try {
myBatisGenerator.generate(null);
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("代码反向生成完毕-----");
}
}
运行上面代码。
刷新一下在你之前配置文件中设置好的生成文件的存放位置,就出现生成的代码。
User对象
**
Dept对象:
Kpi对象
UserMapper.xml
关键词 | 作用 |
---|---|
association | 一对一 |
collection | 一对多 |
在以上两个关联关系中采用的方式是select方法进行映射。所以在进行关联映射的时候需要两个表一起配置
重点
- generatorConfig.xml中的一对一、一对多type 插件是@半导体郗
自己编写的,需要自己导入到项目中。本着学习原则,免费分享给大家。
链接: https://pan.baidu.com/s/1ffTsh7FkBXjehOk1xv15YA 提取码: 4vy3 - generatorConfig.xml中的table下的生成的方法按需求添加。
- 进行关联查询的时候配置文件映射到对象上,但是关联插入的时候不能,只能先保存dept对象,在保存user对象,最后保存kpi对象。
- 在配置文件中标签出现编译器报错,提示没有是正常的,但是并不影响使用,先试一下能否运行成功。
- 其他可以关注微信公众号:马拉松程序员