将逆向工程单独剥离出来,作为一个独立的项目
源码在末尾
- 创建一个spring boot 的工程,并导入逆向工程的依赖和插件。其中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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhangxiaosan.top</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--导入逆向工程依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--逆向工程-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在application.properties 中配置数据库的连接:
#数据库配置
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/StudentApartmentManager?serverTimezone=UTC&useSSL=false&allowMultiQueries=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.在spring boot的启动入口中加入以下方法:
package main;
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;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
//调用逆向生成的方法。
try {
DemoApplication.startGenerator();
} catch (IOException e) {
e.printStackTrace();
} catch (XMLParserException e) {
e.printStackTrace();
} catch (InvalidConfigurationException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 加入的方法,开始逆向生成
* */
public static void startGenerator() throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings=new ArrayList<String>();
boolean overWriter=true;//指向配置文件
//指定配置文件路径
File configFile=new File(DemoApplication.class.getResource("/generatorConfig.xml").getFile());
ConfigurationParser cp=new ConfigurationParser(warnings);
Configuration config=cp.parseConfiguration(configFile);
DefaultShellCallback callback=new DefaultShellCallback(overWriter);
MyBatisGenerator myBatisGenerator=new MyBatisGenerator(config,callback,warnings);
myBatisGenerator.generate(null);
}
}
在此逆向工程中加入了对数据库字段的加密和解密操作。目前只提供有 AES 和 MD5两种方法。
若想要扩展其他的加密方式。过程如下:
1.在下图的文件中添加加密的方式。以AES加密算法为例在下图的privacy 文件夹中创建Aes类写加密解密方法。
Aes加密解密方法如下:
package privacy;
import java.util.Base64;
public class Aes {
/**
* 加密
* */
public static String encrypt(String src) {
try {
String result = Base64.getEncoder().encodeToString(src.getBytes("UTF-8"));
return result;
} catch (Exception e) {
throw new RuntimeException("encrypt fail!", e);
}
}
/**
* 解密
* */
public static String decrypt(String src) {
try {
byte[] asBytes = Base64.getDecoder().decode(src);
String result = new String(asBytes,"UTF-8");
return result;
} catch (Exception e) {
throw new RuntimeException("decrypt fail!", e);
}
}
}
- 创建AesTypeHandler类,继承mybatis 提供的 BaseTypeHandler基础类型处理器。重写方法:
分别为:- 取值方法:当取出值时,对指定的字段数据进行解密处理。getNullableResult
- 设置值方法:当设置值时,对指定字段进行加密处理。setNonNullParameter
并在方法中处理逻辑。
例如:
package privacy;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class AesTypeHandler extends BaseTypeHandler<Object> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException {
if (parameter != null){
ps.setString(i, Aes.encrypt((String)parameter));
}
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return Aes.decrypt(columnValue);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return Aes.decrypt(columnValue);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String columnValue = cs.getString(columnIndex);
return Aes.decrypt(columnValue);
}
}
配置好后,注意在generatorConfig.xml文件生成表的配置中配置需要加密解密的字段,如下例如:
密码使用MD5加密
手机号使用AES加密
启动逆向工程
如下图:红色部分文件为项目启动入口,启动后生成蓝色部分,蓝色部分里面就有生成的各个数据表对应的文件,即在generatorConfig.xml中配置生成的文件。
注意:
- 建议生成的蓝色部分的报名最好以自己创建的项目的报名一致。
- 将生成的文件复制到项目中。包括加密机密的privacy文件夹一起复制。
- 生成的实体Mapper.xml文件中修改对加密解密配置的文件路径,如下图:
上图:逆向生成的Mapper.xml
上图:复制到项目后的的Mapper.xml
测试逆向生成的xml加密解密字段
写一个添加方法。将数据添加到数据库。此处省略添加代码(网上操作mybatis的增删改查例子大把多。)
添加之后在数据库中加密后的字段如下:
添加查询方法,在数据库中将记录查询出来,(省略查询代码)
密码部分为null的原因:密码在使用md5加密时,也就是逆向工程项目的privacy 文件夹中的Md5TypeHandler类型处理器中在对取值的操作时直接返回了null,如下图:
若要处理,则自行按需求修改即可。
扩展,类型处理器除了加密解密字段处理之外,同理还能处理时间和时间戳(存入数据时存下时间戳,取出时格式化时间为yyy-MM-dd HH:mm:ss格式)。又或者性别(存入时为1和0 ,取出时转换为男和女),还能应用在其他的状态值的处理上。。。。。
逆向工程的源码:
-
进入公众号
-
回复以下关键字之一:
- 逆向工程
- mybatis逆向工程
- 逆向