Mybatis作爲一個半自動化的ORM框架,需要開發人員手動編寫Sql語句。當數據庫中的表格太多的時候,爲每一個表格的CRUD操作編寫Sql語句就顯得十分的繁瑣。Mybatis逆向工程可以針對單表自動生成所需要的代碼,比如mapper.xml映射文件,dao.java持久層接口,以及pojo實體類。
首先,創建一個新的java工程,名叫Mybatis-Generator,不建議在原來的項目中生成逆向工程代碼,因爲會覆蓋原來的代碼,因此通常開發者都選擇新建一個項目專門用來生成逆向工程,再將需要的文件拷貝到自己的項目中去。然後導入三個jar包,分別是mybatis,mybatis-generator和mysql的jar包。同時,構建好三個包,分別是dao包用來存放生成的*dao.java文件,entity包用來存放實體類,mapper包用來存放生成的*mapper.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/jtsys" userId="root"
password="root">
</jdbcConnection>
<!-- <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.jt.entity"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作爲包的後綴 -->
<property name="enableSubPackages" value="false" />
<!-- 從數據庫返回的值被清理前後的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.jt.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作爲包的後綴 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.jt.dao"
targetProject=".\src">
<!-- enableSubPackages:是否讓schema作爲包的後綴 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定數據庫表 -->
<table schema="" tableName="sys_configs"></table>
<table schema="" tableName="sys_depts"></table>
<table schema="" tableName="sys_dicts"></table>
<table schema="" tableName="sys_logs"></table>
<table schema="" tableName="sys_menus"></table>
<table schema="" tableName="sys_role_menus"></table>
<table schema="" tableName="sys_roles"></table>
<table schema="" tableName="sys_user_roles"></table>
<table schema="" tableName="sys_users"></table>
<!-- 有些表的字段需要指定java類型
<table schema="" tableName="">
<columnOverride column="" javaType="" />
</table> -->
</context>
</generatorConfiguration>
配置完畢,編寫一個java類用來啓動這些配置,生成逆向工程代碼。
package com.jt.generator;
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 GeneratorSqlMapper {
public void generator() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
//指定 逆向工程配置文件
File configFile = new File("config.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
//將配置文件的信息轉化爲Configuration對象
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//逆向工程核心對象
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}
public static void main(String[] args) throws Exception {
try {
System.out.println("here");
GeneratorSqlMapper generatorSqlmapper = new GeneratorSqlMapper();
generatorSqlmapper.generator();
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行之後,刷新項目可以看到我們需要的文件都生成在對應包中,此處的*Mapper.java文件就是我們需要的持久層接口。
此處對應數據庫中的每一張表格有生成了兩個.java文件,名字較短的是與數據庫表格完全對應的實體類對象,即類中屬性和數據庫中的字段名完全對應。*Example.java是針對單一表格的CRUD操作進行了封裝,通過這個類裏的方法,我們可以更方便地自定義對數據庫的操作,例如去重複查詢、降序升序、針對單一字段的操作等等。
以下是映射文件。
雖然逆向工程爲開發人員提供了一些方便,不需要自行編寫實體類對象,生成了我們需要的dao接口和映射文件。但是可以逆向工程生成的文件中只涉及到了但以表格的操作,實際項目中往往會涉及到多個關聯表格的聯合操作,還有一些涉及到複雜業務的情況,這時候仍然需要開發人員自行編寫Sql語句。