根据我们开发Mybatis程序的经验,我们需要根据数据库中的表设计该表对应的实体类,我们还要设计该的操作的配置文件,那么能不能有一种手段能够帮助我们自动的生成这些文件呢?
Mybatis反向(逆向)工程就可以做到,简单点说,就是通过数据库中的单表,自动生成java代码。Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类),企业中,逆向工程是个很常用的工具,比我们手动创建映射文件的配置信息方便很多。
5.1 Mybits反向(逆向)工程
1、下载Mybatis反向(逆向)工程所需要的jar包:mybatis-generator-core-1.3.2.jar,下载Mysql数据库驱动包:mysql-connector-java-5.1.8.jar,
2、在Mysql数据库中建数据库如下:
create database school; use school; create table student( stuid int(32) primary key AUTO_INCREMENT, stuname varchar(50), stuage int(32) ); create table stuscore( sid int(32) primary key AUTO_INCREMENT, stuid int(32), score int(32) ); |
3、新建工程程序结构如下图:
其中mbgconfig.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> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/school" userId="root" password="123456"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver>
<!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="entity" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject=".\src"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定数据库表 --> <table tableName="student"></table> <table tableName="stuscore"></table> </context> </generatorConfiguration> |
在这个配置文件中,我们设定了连接数据库的一系列元素,同时我们也设定了生成的po实体类存放的包和对应的配置文件所存放的包,在文件的最后我们设定了要处理的两个表分别是student和stuscore,当然如果需要对更多的表进行反向工程,请自行添加该表的表名,唯一需要注意的是添加的表名在数据库中是确定存在 的。
4、在Test.java类中编写代码如下:
package reversedb; import java.io.File; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; public class Test { public static void main(String[] args) { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; //如果这里出现空指针,直接写绝对路径即可。 String genCfg = "D:\\SSM\\tpprj\\reversedb\\src\\mbgconfig.xml"; File configFile = new File(genCfg); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = null; try { config = cp.parseConfiguration(configFile); } catch (Exception e) { e.printStackTrace(); } DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = null; try { myBatisGenerator = new MyBatisGenerator(config, callback, warnings); } catch (Exception e) { e.printStackTrace(); } try { myBatisGenerator.generate(null); } catch (Exception e) { e.printStackTrace(); } } } |
在这个程序文件中我们唯一需要修改的地方是配置文件的位置,这里我们使用的是绝对地址。
运行程序结果如下图:

由于我们对两个表进行了反向工程,所以生成了两个包entity和mapper,并且在这两个包中生成了8个文件。每个数据库表对应4个文件。其中student表对应的4个文件分别为实体类Student.java文件、用于添加查询条件的StudentExample.java类文件、功能接口文件StudentMapper.java文件和实现接口功能的StudentMapper.xml配置文件。有兴趣的读者可以打开这些文件仔细观察其代码或者自己亲手编写这些代码。
需要注意的是这里的Test.java程序只能执行一次,这个程序唯一的功能就是自动生成这些代码,程序执行完成后Test.java和mbgconfig.xml文件都不在有任何价值。执行多次则会出现冗余的代码。如果因为数据库的更新确实需要重新执行,请删除原来生成的代码文件再重新执行。

