spring boot + mybatis + mysql逆向工程独立项目

将逆向工程单独剥离出来,作为一个独立的项目

源码在末尾

  1. 创建一个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>

  1. 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);
        }
    }
}
  1. 创建AesTypeHandler类,继承mybatis 提供的 BaseTypeHandler基础类型处理器。重写方法:
    分别为:
    1. 取值方法:当取出值时,对指定的字段数据进行解密处理。getNullableResult
    2. 设置值方法:当设置值时,对指定字段进行加密处理。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中配置生成的文件。
在这里插入图片描述
注意:

  1. 建议生成的蓝色部分的报名最好以自己创建的项目的报名一致。
  2. 将生成的文件复制到项目中。包括加密机密的privacy文件夹一起复制。
  3. 生成的实体Mapper.xml文件中修改对加密解密配置的文件路径,如下图:
    逆向生成的Mapper.xmll 上图:逆向生成的Mapper.xml

在这里插入图片描述
上图:复制到项目后的的Mapper.xml

测试逆向生成的xml加密解密字段

写一个添加方法。将数据添加到数据库。此处省略添加代码(网上操作mybatis的增删改查例子大把多。)
添加之后在数据库中加密后的字段如下:
在这里插入图片描述
添加查询方法,在数据库中将记录查询出来,(省略查询代码)
在这里插入图片描述
密码部分为null的原因:密码在使用md5加密时,也就是逆向工程项目的privacy 文件夹中的Md5TypeHandler类型处理器中在对取值的操作时直接返回了null,如下图:
在这里插入图片描述
若要处理,则自行按需求修改即可。

扩展,类型处理器除了加密解密字段处理之外,同理还能处理时间和时间戳(存入数据时存下时间戳,取出时格式化时间为yyy-MM-dd HH:mm:ss格式)。又或者性别(存入时为1和0 ,取出时转换为男和女),还能应用在其他的状态值的处理上。。。。。

逆向工程的源码:

  1. 进入公众号
    在这里插入图片描述

  2. 回复以下关键字之一:

    1. 逆向工程
    2. mybatis逆向工程
    3. 逆向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张帅三代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值