在使用Mybatis的過程中,我們知道需要爲每個表創建對應的實體類,而一旦表的字段很多的話,實體類的創建就非常麻煩,而且是重複的體力勞動,沒有任何營養,所以我們需要利用一些現有的工具來減少這些重複的操作。Mybatis提供了一個很強大的代碼生成器——Mybatis Generator,它可以通過用戶不同的配置生成不同類型的代碼。接下來我們將簡單的介紹這個代碼生成器的用法。
一.添加Mybatis Generator的jar包
要使用代碼生成器,首先需要將其jar包添加到項目中,由於我們創建的是maven項目,所以我們可以直接使用maven的方式引入對應的依賴,在pom.xml文件中添加如下依賴:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.4</version>
</dependency>
代碼生成器的版本和Mybatis的版本沒有直接關係,但是不同代碼生成器的版本包含的參數可能會不同,這裏我使用的是1.3.4的版本。
二.準備數據庫的表
由於使用mybatis代碼生成器會覆蓋掉原有的代碼,所以我們創建一個新的數據庫,並在其中添加學生信息表如下:
三.代碼生成器配置
我們在此創建一個簡單的代碼生成器配置,以方便學習。首先在項目src/main/resources中創建一個generator目錄,在該目錄下創建一個generatorConfig.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="MySqlContext" targetRuntime="MyBatis3Simple"
defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis2"
userId="root"
password="123456">
</jdbcConnection>
<javaModelGenerator targetPackage="test.model"
targetProject="src\main\java">
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="test.dao" targetProject="src\main\java"/>
<table tableName="%">
<generatedKey column="stu_id" sqlStatement="MySql"/>
</table>
</context>
</generatorConfiguration>
簡單認識一下配置文件中的各個標籤:
1.context標籤:該標籤用於指定生成一組對象的環境,至少配置一個,也可以配置多個。它只有一個必選屬性id,用來確定該標籤,還有defalutModelType,targetRuntime,introspectedColumnImpl等屬性。其中defaultModelType屬性定義瞭如何生成實體類,有3個選項conditional、flat、hierarchical分別指的是如果一個表的主鍵只有一個字段,那麼會將該字段合併到基本實體類中(conditional);爲每張表生成一各實體類(flat);如果表有主鍵,那麼會產生一個單獨的主鍵實體類(hierarchical)。targetRuntime屬性指定生成的代碼的運行時環境,有兩個選項MyBatis3和MyBatis3Simple兩個選項,後者不會生成與Example相關的方法。
2.property標籤:該標籤是context的子標籤,該標籤可以配置數據庫的分隔符和java文件的編碼,在該例子中主要使用它的前後分隔符屬性,因爲mysql中的分隔符是`,所以將其前後分隔符都設置成`。
3.commentGenerator標籤:該標籤是context的子標籤,用來配置如何生成註釋信息,最多可配置1個。該標籤有一個可選屬性type可以指定用戶自己創建的註釋生成類。提供了3個可選屬性suppressAllComments,suppressDate,addRemarkComments分別用來阻止生成註釋、阻止生成的註釋包含時間戳、註釋是否添加數據庫表中的備註信息。
4.jdbcConnection標籤:該標籤配置了連接的數據庫信息。
5.javaModelGenerator標籤:該標籤用來控制生成的實體類,必須配置一個。該標籤中有兩個必選屬性targetPackage和targetProject,前者用來生成實體類存放的包名,後者用來指定目標項目路徑。
6.sqlMapGenerator標籤:該標籤用來配置SQL映射生成器(Mapper.xml文件)的屬性,其兩個必選屬性與javaModelGenerator標籤的兩個必須屬性一致
7.javaClientGenerator標籤:該標籤用於配置Mapper接口的屬性,如果不設置該標籤,就不會生成Mapper接口。其中兩個必選屬性與上兩個標籤一致,還有一個type屬性用來設置Mapper接口的生成器。
8.table標籤:該標籤很重要,用於配置需要通過內省數據庫的表,只有在該標籤中配置,才能生成最終的代碼,至少要配置一個。該標籤只有一個必選屬性tableName指定要生成的表名,可以匹配多個表,如果要生成全部的表,使用%進行配置。table標籤下的子標籤衆多,在這裏就不一一贅述,感興趣的夥伴可以去研究一下。只簡單說明一下上例中的generatedKey標籤用來指定自動生成主鍵的屬性。
四.運行代碼生成器
MyBatis Generator提供了很多種運行方式如java編寫代碼運行、命令行運行、使用maven Plugin運行、使用eclipse插件運行。在這裏我們只介紹使用java代碼運行,我們在項目中添加tk.mybatis.generator包,創建Generator.java類如下:
package tk.mybaits.generator;
import java.io.InputStream;
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 Generator {
public static void main(String[] args) throws Exception{
//執行過程中的警告信息
List<String> warnings = new ArrayList<String>();
//生成的代碼重複時,覆蓋原代碼
boolean overwrite = true;
//讀取配置文件
InputStream is = Generator.class.getResourceAsStream("/generator/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//創建代碼生成器
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
//執行生成代碼
myBatisGenerator.generate(null);
//輸出警告信息
for(String warning : warnings) System.out.println(warning);
}
}
運行之後,系統會自動生成相應的代碼。
五.其他
如果對系統自動生成的註釋不滿意,可以自己實現一個註釋生成器類如下:
package tk.mybaits.generator;
import java.util.Properties;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;
/*
* 註釋生成器
* */
public class MyCommentGenerator extends DefaultCommentGenerator{
//重新定義一遍子類參數,因爲默認類中沒有可以訪問這些參數的方法
private boolean suppressAllComments;
private boolean addRemarkComments;
//設置用戶配置的參數
public void addConfigurationProperties(Properties properties){
//調用父類方法
super.addConfigurationProperties(properties);
//獲取suppressAllComments參數值
suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
addRemarkComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
}
//添加註釋信息
public void addFieldComment(Field field,
IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
//阻止生成所有註釋、直接返回
if (suppressAllComments) {
return;
}
field.addJavaDocLine("/**");
//獲取數據庫中字段的備註信息
String remarks = introspectedColumn.getRemarks();
//根據參數和備註信息判斷是否添加備註信息
if (addRemarkComments && StringUtility.stringHasValue(remarks))
{
String[] remarkLines = remarks.split(System.getProperty("line. separatpr"));
for (String remarkLine : remarkLines){
field.addJavaDocLine(" * " + remarkLine);
}
}
field.addJavaDocLine(" * " + introspectedColumn.getActualColumnName());
field.addJavaDocLine(" */");
}
private boolean isTrue(String property) {
// TODO Auto-generated method stub
if (property.equals(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS)) return true;
if (property.equals(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS)) return false;
return false;
}
}
然後在commentGenerator標籤中加上type屬性即可。