Mybatis學習日記(六)——Mybatis代碼生成器

 

在使用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屬性即可。


上一篇:Mybatis學習日記(五)——動態SQL第二部分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章