1.1 简介
MyBatis Generator简介
MyBatis生成器(MBG)是MyBatis MyBatis的代码生成器。它将为MyBatis的所有版本生成代码。它将对一个数据库表(或多个表)进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。
MBG会根据其配置方式以不同的样式和不同的语言生成代码。例如,MBG可以生成Java或Kotlin代码。MBG可以生成MyBatis3兼容的XML-尽管现在认为MBG是旧版使用。生成的代码的较新样式不需要XML。
根据其配置方式,MyBatis Generator可能会生成:
与表结构匹配的Java或Kotlin类。这可能包括:
- 匹配表主键的类(如果有主键)
- 一个与表的非主键字段匹配的类(BLOB字段除外)
- 一个包含表的BLOB字段的类(如果表具有BLOB字段)
- 一个启用动态选择,更新和删除的类
2.1 使用
环境:IDEA
1.创建数据表
/*
Navicat MySQL Data Transfer
Source Server : mysql
Source Server Version : 80020
Source Host : localhost:3306
Source Database : myproject
Target Server Type : MYSQL
Target Server Version : 80020
File Encoding : 65001
Date: 2020-06-29 13:23:18
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
`id` int NOT NULL,
`classname` varchar(255) DEFAULT NULL,
`classimage` bigint DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', '计算机', null);
INSERT INTO `class` VALUES ('2', '软工', null);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`uid` int DEFAULT NULL,
`admin` int DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`phonenumber` int DEFAULT NULL,
`classid` int DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `classid` (`classid`),
CONSTRAINT `classid` FOREIGN KEY (`classid`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '徐浩杰', '970829', '928675426', '1', '928675426@qq.com', '1838145982', '1');
INSERT INTO `user` VALUES ('2', '小明', '123456', '568985656', '2', '568985656@qq.com', '1254635895', '2');
我以这两张表作为演示,看如何用Mybatis MBG逆向生成java文件。
2.1.1 配置文件
MybatisGenerator支持以下几种方式来做MBG:
我选用java(maven)这两种比较常用。
1.第一步创建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="jdbc.properties" />
<!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/myproject?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true"
userId="root"
password="xhj970829">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="com.hifix.springbootmyfirstproject.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.hifix.springbootmyfirstproject.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="com.hifix.springbootmyfirstproject.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table schema="DB2ADMIN" tableName="user" domainObjectName="User" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
<table tableName="class" domainObjectName="Class"></table>
</context>
</generatorConfiguration>
官方模板:http://mybatis.org/generator/configreference/xmlconfig.html
<context id="DB2Tables" targetRuntime="MyBatis3">
这个targetRuntime属性的指定很关键,官方支持四种属性:
也就是告诉生成器采用哪种模式生成我们的java代码。
<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
connectionURL="jdbc:db2:TEST"
userId="db2admin"
password="db2admin">
</jdbcConnection>
- 这个标签一眼明了,配置JDBC驱动包,地址等等。
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
- 这个标签作用是强制类型转换,因为mysql中有些数据类型比如date,bitint等等需要转成java 中的数据格式。
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
- 指定pojo包位置。targetProject是指定项目位置。
- enableSubPackages是否自动添加包名后缀。
- trimStrings是否去除空格
<sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
- 指定mapper.xml的位置
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
- 指定dao包的位置
<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
<property name="useActualColumnNames" value="true"/>
<generatedKey column="ID" sqlStatement="DB2" identity="true" />
<columnOverride column="DATE_FIELD" property="startDate" />
<ignoreColumn column="FRED" />
<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
</table>
这里给出了一个表单逆向的模板,tableName数据库中的表名,domainObjectName指定生成的pojoclassname.(一般就这么指定就行了其他子属性可以不写)
当然你还可以指定是否开启具体的查询,插入规则:
官方api:http://mybatis.org/generator/configreference/table.html
2.1.2 test测试生成
根据官方提供的接口代码:
@Test
public void mybatisGenerator() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("C:\\Users\\Administrator\\Downloads\\spring-boot-examples-master\\springboot-myfirstproject\\src\\main\\resources\\generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
这里配置文件的位置最好用绝对路径,不然死活找不到,我也不知道为什么。。我之前直接写的generatorConfig.xml或者classpath:generatorConfig.xml。都报错找不到指定文件。
之后看生成的目录文件:
这样就自动根据数据库中的信息逆向生成我们的dao,pojo,mapper层。
PS:之前用Hiberante的时候也用到过逆向,不过Hiberante的逆向是从java代码来逆向到数据库。封装的太狠,灵活性太低。