公司最近的一个项目需要做数据迁移,历史数据为原数据库导出的excel表格,需要迁移到oracle中。一开始是用POI直接对excel解析,但是遇到一个问题就是在一张excel表数据量过大的时候性能下降的很厉害甚至引起内存溢出的情况,于是想着用Navicate直接把源数据存到mysql中,再对数据库进行操作。
这时就需要根据mysql中的表格建立对应的mapper.xml和POJO类,当然是采用Mybatis官方的逆向工程完成这个任务,不然自己写mapper文件肯定头都大了。(顺带总结一下这个过程中踩过的一些坑)
贴上工程项目结构先~
很简单的结构,因为也就只是用来对导入的数据进行取值而已,其中application.properties的配置很简单:
然后就是generateCongif.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.properties"/>
<!-- mysql驱动的位置 这个是MySQL连接的jar包,你需要指定你自己计算机上的jar包的位置-->
<classPathEntry location="E:\Downloads\mysql-connector-java-5.1.41.jar" />
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释,true:是;false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>
<!--Oracle数据库的连接信息-->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg"
userId="yycg"
password="yycg">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.example.mybatisdemo.bean"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.example.mybatisdemo.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!--
targetPackage:mapper接口生成的位置,遵循MyBatis规范,让mapper.xml
和mapper.java在同一目录下
-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mybatisdemo.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table tableName="dk"
domainObjectName="Dk" enableCountByExample="true"
enableDeleteByExample="true" enableSelectByExample="true"
enableUpdateByExample="true">
</table>
<table tableName="qj"
domainObjectName="Qj" enableCountByExample="true"
enableDeleteByExample="true" enableSelectByExample="true"
enableUpdateByExample="true">
</table>
<table tableName="lp"
domainObjectName="Lp" enableCountByExample="true"
enableDeleteByExample="true" enableSelectByExample="true"
enableUpdateByExample="true">
</table>
<table tableName="tq"
domainObjectName="Tq" enableCountByExample="true"
enableDeleteByExample="true" enableSelectByExample="true"
enableUpdateByExample="true">
</table>
<table tableName="volume"
domainObjectName="Volume" enableCountByExample="true"
enableDeleteByExample="true" enableSelectByExample="true"
enableUpdateByExample="true">
</table>
<!-- <table schema="" tableName="sys_user"></table>
<table schema="" tableName="sys_role"></table>
<table schema="" tableName="sys_permission"></table>
<table schema="" tableName="sys_user_role"></table>
<table schema="" tableName="sys_role_permission"></table> -->
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
这里要说的第一个坑就是,因为用springBoot时间不长,一直以为application.properties的配置可以直接在项目中用{"jdbc.driver"}这样的格式获取到,但是在运行的时候报错这个属性不存在。所以才在generateCongif.xml中引入了applicaiton.properties
<!-- 引入applicaiton.properties -->
<properties resource = "application.properties"/>
第二个坑是,本以为引入了Mysql的依赖就可以不用加载驱动包,结果发现并不可以。。。于是老老实实的引入了驱动包
<!-- mysql驱动的位置 这个是MySQL连接的jar包,你需要指定你自己计算机上的jar包的位置-->
<classPathEntry location="E:\Downloads\mysql-connector-java-5.1.41.jar" />
第三个坑在网上当时没有找到,但是根据错误提示猜到了一点,那就是新增的generateConfig.xml在springBoot中是没有注入的,直接配置在resource文件下下面好像并不能被springBoot扫描到,所以还是通过注解的方式配置了一下。
package com.example.mybatisdemo;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(locations = {"classpath:generateConfig.xml"})
public class configClass {
}
这里新建了一个类,通过@Configuration注解和@ImportResource引入外部的xml文件注入到springBoot中,应该有更简便的方法,希望大佬能在评论区告知一下。
这一切准备就绪后就差启动方式了,我用的是maven指令,直接贴图。
运行成功后就能看到你的mapper文件夹和bean文件夹下面有自动生成的代码了~