基于mybatis构建逆向工程

什么是逆向工程

逆向工程(又称逆向技术),是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。

什么是mybatis逆向工程?

mybatis为了提高开发效率,成功引用了逆向工程这一理念,在软件开发领域广受欢迎。【AutoGenerator 是
MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper
XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。】
// 代码生成器
AutoGenerator mpg = new AutoGenerator();

逆向工程应用的技术范畴

支持的数据库:

oracle、mysql、db2、derby、h2、hsql、informix、sqlserver、postgresql、sybase、hana、

插件

mybatis-generator逆向生成的方式有三种用法:命令行、eclipse插件、maven插件。

//基于JDK1.8
相关jar包依赖  
//spring:
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.2</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.6</version>
</dependency>

//springboot:
 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>
//配置文件:
 //build:   maven逆向生成相关代码
 //spring
    <build>
  <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    <plugins>
      <!-- plugin:具体插件 -->
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </pluginManagement>
</build>
//springboot:
 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- mybatis generator 自动生成代码插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <!-- 配置数据库链接及mybatis generator core依赖 生成mapper时使用 -->
                <dependencies>
                <!--此处可以配置多个数据库类型的jar包-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.34</version>
                    </dependency>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    
generatorConfig.xml代码生成配置文件  这是配置生成逆向构建
//spring:
<?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>
 
	<!-- targetRuntime:此属性用于指定生成的代码的运行时环境, MyBatis3是默认值 -->
	<!-- id="context1"此处的id用context1也是默认值 -->
	<context id="context1" targetRuntime="MyBatis3">
	
		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:-->
			<property name="suppressAllComments" value="false" />
		</commentGenerator>
 
		<!-- connectionURL:数据库的地址;driverClass:驱动类 -->
		<jdbcConnection connectionURL="jdbc:oracle:thin:@"
			driverClass="oracle.jdbc.driver.OracleDriver" password="" userId="" />
 
		<!-- targetPackage是目标包名, targetProject是包所在的位置 -->
		<javaModelGenerator targetPackage="com.XXXXX.dao1.model"
			targetProject="XXXXX/src" />
 
		<!-- targetPackage放置生成的SQL映射文件, targetProject指定生成SQL映射的目标项目 -->
		<sqlMapGenerator targetPackage="com.XXXXX.dao1.mapper"
			targetProject="XXXXX/src" />
 
		<!-- targetPackage是目标包名, targetProject是包所在的位置;type:XMLMAPPER生成的对象是 MyBatis3.x 
			映射器基础结构的 Java接口 -->
		<javaClientGenerator targetPackage="com.XXXXX.dao1.mapper"
			targetProject="XXXXX/src" type="XMLMAPPER" />
 
		<!-- 数据库里的表名 -->
		<table tableName="ORDER_INFO"></table>
		<table tableName="PASSENGER_INFO"></table>
		<table tableName="SUB_ORDER_INFO"></table>
		<table tableName="SEGMENT_INFO"></table>
 
	</context>
</generatorConfiguration>
//springboot:
<?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>
	<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包 -->
	<classPathEntry
		location="C:/javaApps/mysql5.7.17/mysql-connector-java-5.1.38.jar" />
	<context id="DB2Tables" targetRuntime="MyBatis3">
		<!-- JavaBean 实现 序列化 接口 -->
		<!-- <plugin type="org.mybatis.generator.plugins.SerializablePlugin" /> -->
		<!-- 生成toString -->
		<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
		<!-- optional,旨在创建class时,对注释进行控制 -->
		<commentGenerator>
			<property name="suppressDate" value="true" />
			<property name="suppressAllComments" value="true"/>
		</commentGenerator>
		<!--数据库链接URL,用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://127.0.0.1:3306/demo" userId="root" password="root">
		</jdbcConnection>
		<!-- 类型转换 -->
		<javaTypeResolver>
			<!-- 是否使用bigDecimal, false: 把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer(默认) 
				true: 把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal -->
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>
		<!-- 生成模型的包名和位置 -->
		<javaModelGenerator targetPackage="com.grm.pojo" targetProject="src/main/java">
			<!-- 默认false 是否允许子包 -->
			<property name="enableSubPackages" value="true" />
			<!-- 默认false 是否对model添加 构造函数 -->
			<property name="constructorBased" value="false" />
			<!-- 默认false 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
			<property name="immutable" value="false" />
			<!-- 默认false 是否对类CHAR类型的列的数据进行trim操作 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>
		<!-- 生成映射文件的包名和位置 -->
		<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
			<property name="enableSubPackages" value="true" />
		</sqlMapGenerator>
		<!-- 生成DAO的包名和位置 -->
		<javaClientGenerator type="XMLMAPPER" targetPackage="com.grm.mapper" targetProject="src/main/java">
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>
		<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名 -->
		<table tableName="t_user" domainObjectName="User" 
			enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" 
			enableSelectByExample="false" selectByExampleQueryId="false">
		</table> 
	</context>
</generatorConfiguration>
spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
 
    <!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:db.properties" />
    <!-- 数据源,使用dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    </bean>
 
    <!-- 配置SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加载mybatis的配置文件 -->
        <property name="configLocation" value="mybatis/SqlMapConfig.xml"></property>
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
    <!-- Mapper批量扫描:从Mapper的包中扫描出Mapper接口,自动创建代理对象并且在Spring容器中注册
            遵循一些规范:需要将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
            自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
     -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定扫描的包名 
            如果扫描多个包,每个包中间使用半角逗号分隔
        -->
        <property name="basePackage" value="com.cjw.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
 
    </bean>
springboot配置文件
<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.4.RELEASE</version>
	</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>
	//springboot基本jar
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
    	</dependency>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-test</artifactId>
    		<scope>test</scope>
    	</dependency>
    	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
	//添加mybatis依赖
	  <dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>2.1.1</version>
	</dependency>
	//添加mybatis-generator依赖和插件
		<dependency>
		<groupId>org.mybatis.generator</groupId>
		<artifactId>mybatis-generator-core</artifactId>
		<version>1.4.0</version>
	</dependency>
	</dependencies>
	
	<build>
		<plugins>
		   //springboot编译插件
			<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.4.0</version>
		<configuration>
			<overwrite>true</overwrite>
			<configurationFile>src/main/resources/generator/generatorConfig.xml
			</configurationFile>
		</configuration>
	</plugin>
		</plugins>
	</build>
生成命令及目录结构

mybatis-generator:generate
目录结构根据generatorConfig.xml中的配置进行具体生成相关CRUD公共接口调用文件及相关代码。

逆向工程应用场景

构建项目可视化开发,根据所建项目生成项目的基本功能代码,在进行功能项的定制化开发

逆向工程注意事项

1.选择性更新,如果有新参数就更换成新参数,如果参数是null就不更新,还是原来的参数
2.mybatis使用逆向工程,数据库建表的字段user_id必须用下滑线隔开,这样生成的对象private Long userId;mapper.xml文件也会自动换成大写
3.当数据库中的字段是text类型时,使用mybatis逆向工程要在generatorConfig.xml配置文件中修改

逆向工程之可视化立项开发

实现项目开发平台,利用逆向生成技术生成相应的后端功能。前端利用组件实现拖拽式功能开发。提供可视化功能开发和线下功能调试,有利于项目统一管理与代码质量管理

逆向工程的弊端

1、生成的文件,需要删除后在重新生成
2、逆向自能生成公共调用的接口功能,生成的功能重写起来也比较麻烦,有些逆向生成公共接口可能存在注入sql与未授权访问、sql语句泄露、存储型XSS,攻击者可通过漏洞获取用户的cookie,进行钓鱼攻击。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知青先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值