使用mybatis-generator反向生成代码,包含一对一、一对多生成

使用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方法进行映射。所以在进行关联映射的时候需要两个表一起配置

重点

  1. generatorConfig.xml中的一对一、一对多type 插件是@半导体郗
    自己编写的,需要自己导入到项目中。本着学习原则,免费分享给大家。
    链接: https://pan.baidu.com/s/1ffTsh7FkBXjehOk1xv15YA 提取码: 4vy3
  2. generatorConfig.xml中的table下的生成的方法按需求添加。
  3. 进行关联查询的时候配置文件映射到对象上,但是关联插入的时候不能,只能先保存dept对象,在保存user对象,最后保存kpi对象。
  4. 在配置文件中标签出现编译器报错,提示没有是正常的,但是并不影响使用,先试一下能否运行成功。
  5. 其他可以关注微信公众号:马拉松程序员
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值