1. 程式人生 > >MyBatisGenerator生成資料庫註釋,實現分頁,繼承某一父類,實現Serializable,資料庫列名前加上表名

MyBatisGenerator生成資料庫註釋,實現分頁,繼承某一父類,實現Serializable,資料庫列名前加上表名

最近做專案用到這個逆向工程,發現官方給出的配置並不符合本人要求,於是下載了原始碼經過分析,最終實現了本人想要的效果,現將程式碼及工程全貼出來,方便有需要的同志使用

帖子最後面有工本人修改後的工程原始碼下載地址,拿過去把配置檔案換成你的資料庫名稱跟帳號就可以直接用了,

整體配置檔案程式碼如下:

<?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" defaultModelType="flat">

		<!-- 生成limit分頁屬性	【擴充套件外掛】-->
		 <plugin type="mybitisPlugin.PaginationPlugin" />
		<!--生成的實體類實現序列化介面	【擴充套件外掛】-->
		<plugin type="mybitisPlugin.SerializablePlugin" /> 
		<!--生成的實體類重寫toString方法-->
		<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
		<!-- 生成的實體類重寫hashCode和equals方法 -->
		<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>

		<!-- 生成資料庫欄位註釋及自定義註釋 【擴充套件外掛】 -->
		<commentGenerator type="mybitisPlugin.RemarksCommentGenerator">
			<!-- 格式化java程式碼 -->
			<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
			<!-- 格式化XML程式碼 -->
        		<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>
		</commentGenerator> 
		
<!-- 		<commentGenerator>
			是否去除自動生成的註釋 true:是 : false:否
			<property name="suppressAllComments" value="true" />
			<property name="suppressDate" value="true" />
		</commentGenerator> -->

		<!--MySql資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/electronic" userId="root" password="123456">
		</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="music.struts2.model" targetProject=".\src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="true" />
			<!-- 從資料庫返回的值被清理前後的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

		<!-- targetProject:mapper.xml對映檔案生成的位置 -->
		<sqlMapGenerator targetPackage="music.struts2.mapper" targetProject=".\src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>

		<!-- targetPackage:mapper介面生成的位置 -->
		<javaClientGenerator type="XMLMAPPER" targetPackage="music.struts2.client" targetProject=".\src">
			<!-- enableSubPackages:是否讓schema作為包的字尾 -->
			<property name="enableSubPackages" value="true" />
		</javaClientGenerator>

		<!-- 指定資料庫表 -->
		<table tableName="%" enableUpdateByExample="false" enableUpdateByPrimaryKey="false" enableInsert="false">
			<!-- 
				所有*Model的實體類繼承統一父類 WebBasicModel
				注意這裡的是*Model類而不是*Example類,*Example繼承在後面會說到
				-->
		 	<property name="rootClass" value="music.struts2.webBasic.WebBasicModel"/>
		</table>
	</context>
</generatorConfiguration>


生成資料庫註釋及類註釋等相關程式碼如下 

package mybitisPlugin;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

/**
 * 生成資料庫欄位註釋
 * 類名前加自定義註釋
 * 註釋增加資料欄位是否為必填項
 * 註釋增加資料欄位是否有預設值
 * 註釋增加屬性是否為主健
 */
public class RemarksCommentGenerator extends DefaultCommentGenerator {

    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        topLevelClass.addJavaDocLine("/**");
        topLevelClass.addJavaDocLine(" * @數表名稱 "+introspectedTable.getFullyQualifiedTable());
        topLevelClass.addJavaDocLine(" * @開發日期 "+new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        topLevelClass.addJavaDocLine(" * @開發作者 by:long ");
        topLevelClass.addJavaDocLine(" */");
    }

    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        String remark = introspectedColumn.getRemarks();
        String columnName = introspectedColumn.getActualColumnName();
        List<IntrospectedColumn> primaryKey = introspectedTable.getPrimaryKeyColumns();
        for (IntrospectedColumn pk : primaryKey) {
        	if(columnName.equals(pk.getActualColumnName())){
        		remark +=" (主健ID)";
        		continue;	//主健屬性上無需生明可選項跟必填項介紹
        	}
        	if (StringUtility.stringHasValue(remark)) {
        		remark += introspectedColumn.isNullable() ? "(可選項)" : "(必填項)";
        	}
		}
        String defaultValue = introspectedColumn.getDefaultValue();
        remark += null != defaultValue ? "  (預設值為: "+defaultValue+")" : " (無預設值)";
        field.addJavaDocLine("/** "+ remark+" */");
    }
}

擴充套件自定義外掛需要自定義一個類難後再繼承官方指定的類,再重寫裡面的相關方法,該配置最後生成的程式碼效果如下圖


實現分佈功能程式碼如下

package mybitisPlugin;

import java.util.List;

import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.java.PrimitiveTypeWrapper;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;

/**
 * @author 江西DJ煙仔
 *	@time 2017年5月13日 :下午3:14:02
 *  描述:擴充套件外掛:
 *  生成limit分頁屬性 page跟pageSize
 *  修改分頁屬性page的get方法生成方為 (page-1)*pageSize
 *  同時繼承指定父類
 */
public class PaginationPlugin extends PluginAdapter{
	
	@Override  
    public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {  
        addLimit(topLevelClass, introspectedTable, "page");  
        addLimit(topLevelClass, introspectedTable, "pageSize");  
        addSuperClass(topLevelClass,introspectedTable);
        return super.modelExampleClassGenerated(topLevelClass,  introspectedTable);  
    }  

	@Override  
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(  
        XmlElement element, IntrospectedTable introspectedTable) {  
        XmlElement isNotNullElement = new XmlElement("if");
        isNotNullElement.addAttribute(new Attribute("test", "null != page  and pageSize>=0"));
        isNotNullElement.addElement(new TextElement("limit #{page} , #{pageSize}"));  
        element.addElement(isNotNullElement);  
        return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,introspectedTable);  
    }  
    
    private void addLimit(TopLevelClass topLevelClass,IntrospectedTable introspectedTable, String name) {  
        CommentGenerator commentGenerator = context.getCommentGenerator();  
        Field field = new Field();  
        field.setVisibility(JavaVisibility.PROTECTED);  
        field.setType(PrimitiveTypeWrapper.getIntegerInstance());  
        field.setName(name);  
        commentGenerator.addFieldComment(field, introspectedTable);  
        topLevelClass.addField(field);  
        char c = name.charAt(0);  
        String camel = Character.toUpperCase(c) + name.substring(1);  
        Method method = new Method();  
        method.setVisibility(JavaVisibility.PUBLIC);  
        method.setName("set" + camel);  
        method.addParameter(new Parameter(PrimitiveTypeWrapper.getIntegerInstance(), name));  
        if(name.equals("page")){ 
        	 method.addBodyLine("this." + name + "= (page-1) * pageSize;");
        }else{
        	method.addBodyLine("this." + name + "=" + name + ";");  
        }
        commentGenerator.addGeneralMethodComment(method, introspectedTable);  
        topLevelClass.addMethod(method);  
        method = new Method();  
        method.setVisibility(JavaVisibility.PUBLIC);  
        method.setReturnType(PrimitiveTypeWrapper.getIntegerInstance());  
        method.setName("get" + camel);  
        method.addBodyLine("return " + name + ";");  
        commentGenerator.addGeneralMethodComment(method, introspectedTable);  
        topLevelClass.addMethod(method);  
    }  
    
    //xxxExample類全部繼承WebBasicExample
    public void addSuperClass(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {
		topLevelClass.setSuperClass("WebBasicExample");
        topLevelClass.addImportedType("music.struts2.webBasic.WebBasicExample");  
	}

    public boolean validate(List<String> warnings) {  
        return true;  
    }  
}


生成後的程式碼效果如下:


為*.Model跟*Example都實現序列化介面程式碼如下:

package mybitisPlugin;

import org.mybatis.generator.api.IntrospectedTable;  
import org.mybatis.generator.api.PluginAdapter;  
import org.mybatis.generator.api.dom.java.*;  
  
import java.util.List;  
import java.util.Properties;  

/**
 * 擴充套件 myBatis generator 外掛,
 * 用於生成*Mode l跟 *Example 類都實現序列化介面
 */
public class SerializablePlugin extends PluginAdapter {  
  
    private FullyQualifiedJavaType serializable;  
    private FullyQualifiedJavaType gwtSerializable;  
    private boolean addGWTInterface;  
    private boolean suppressJavaInterface;  
  
    public SerializablePlugin() {  
        super();  
        serializable = new FullyQualifiedJavaType("java.io.Serializable"); //$NON-NLS-1$  
        gwtSerializable = new FullyQualifiedJavaType("com.google.gwt.user.client.rpc.IsSerializable"); //$NON-NLS-1$  
    }  
  
    public boolean validate(List<String> warnings) {  
        // this plugin is always valid  
        return true;  
    }  
  
    @Override  
    public void setProperties(Properties properties) {  
        super.setProperties(properties);  
        addGWTInterface = Boolean.valueOf(properties.getProperty("addGWTInterface")); //$NON-NLS-1$  
        suppressJavaInterface = Boolean.valueOf(properties.getProperty("suppressJavaInterface")); //$NON-NLS-1$  
    }  
  
    @Override  
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {
        makeSerializable(topLevelClass, introspectedTable);  
        
        return true;  
    }  
  
    @Override  
    public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {  
        makeSerializable(topLevelClass, introspectedTable);  
        return true;  
    }  
  
    @Override  
    public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {  
        makeSerializable(topLevelClass, introspectedTable);  
        return true;  
    }  
  
    /** 
     * 新增給Example類序列化的方法 
     * @param topLevelClass 
     * @param introspectedTable 
     * @return 
     */  
    @Override  
    public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable){  
        makeSerializable(topLevelClass, introspectedTable);  
  
        for (InnerClass innerClass : topLevelClass.getInnerClasses()) {  
            if ("GeneratedCriteria".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$  
                innerClass.addSuperInterface(serializable);  
            }  
            if ("Criteria".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$  
                innerClass.addSuperInterface(serializable);  
            }  
            if ("Criterion".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$  
                innerClass.addSuperInterface(serializable);
            }  
        }
        return true;  
    }  
  
    protected void makeSerializable(TopLevelClass topLevelClass,  
                                    IntrospectedTable introspectedTable) {  
        if (addGWTInterface) {  
            topLevelClass.addImportedType(gwtSerializable);  
            topLevelClass.addSuperInterface(gwtSerializable);  
        }  
  
        if (!suppressJavaInterface) {  
            topLevelClass.addImportedType(serializable);  
            topLevelClass.addSuperInterface(serializable);  
  
            Field field = new Field();  
            field.setFinal(true);  
            field.setInitializationString("1L"); //$NON-NLS-1$  
            field.setName("serialVersionUID"); //$NON-NLS-1$  
            field.setStatic(true);  
            field.setType(new FullyQualifiedJavaType("long")); //$NON-NLS-1$  
            field.setVisibility(JavaVisibility.PRIVATE);  
            context.getCommentGenerator().addFieldComment(field, introspectedTable);  
  
            topLevelClass.addField(field);  
        }  
    }  
}  


資料庫列名前加上表名,此處有點複雜,需要修改原始碼,

通過原始碼分析找到如下類為mybatis生成xml檔案中資料庫列名即資料庫欄位對應的sql片段程式碼,那麼接下來我們就可以對他進行操作了

但.jar包都是編譯後的位元組碼.class檔案,對這些檔案我們只能看卻不能修改,所以需要處已從官方或其它地方下載你逆向工程所對應的原始碼工程檔案,

將它匯入myEclipse或其它ide中進行編輯,匯入原始碼工程後,[記住是以專案的形式匯入而不是叫你增加原始碼,檢視因為我們現在要修改它]

原始碼工程匯入完後我們就可以修改它了,因為原始碼都是.java檔案,跟我們平時新建的.java類沒任何區別,接下來找到以下類,

背景為藍色的地方為自已加上去增加表名程式碼,如下圖:


接下來以架包的形式將我們修改過的類匯出成.jar檔案,因為我們只修改了這一個地方所以只匯出它一個就行了,沒必要將專案都導成.jar

右健選擇類,選擇選單上的Export 選擇java 再選擇jar file 點next 操作如下圖 



經過上面兩部在我們指定的目錄裡就有一個修改原始碼.jar的檔案了,雙擊解壓它展開目錄依次後找到導成架包編譯後的.class檔案,如下圖


接下來做最關健的一部,找到你專案引入.jar包將我們修改並編譯好的.class原始碼替換換原專案那個.class檔案,如下圖:


找到目錄中的那個檔案,將我們的檔案拖進去點替換按鈕 [注意,位置一定要找準,不要隨便把它拖到其它不相關的目錄] 如下圖


到這裡就大功告成了,重新整理一下專案,最好是重啟一下開發工具,然後再執行一下逆向工程,效果如下圖,全部乖乖的加上了表名:效果如下圖


好了今天就到這裡,有不懂的地方也可以加我qq 554911540 

 若你不想那麼麻煩的去折騰話,也可以下載本人修改好的,拿過去直接用吧,[記得修改一下資料庫名跟帳號密碼就行了]

連結:http://pan.baidu.com/s/1nvv52R3 密碼:piej

相關推薦

MyBatisGenerator生成資料庫註釋,實現,繼承,實現Serializable,資料庫列名加上

最近做專案用到這個逆向工程,發現官方給出的配置並不符合本人要求,於是下載了原始碼經過分析,最終實現了本人想要的效果,現將程式碼及工程全貼出來,方便有需要的同志使用 帖子最後面有工本人修改後的工程原始碼下載地址,拿過去把配置檔案換成你的資料庫名稱跟帳號就可以直接用了, 整體

總結之java web實現功能(

網頁開發離不開分頁,分頁如何實現呢 可以看一下百度的分頁有什麼功能 上一頁、下一頁、10頁按鈕、一頁顯示10條資訊 定義一個 PageResult類專門返回分頁所需資訊## public class PageResult { //滿足條件的

MySql實現查詢的SQL,mysql實現查詢的sql語句

refs: http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430 摘要: MySQL資料庫實現分頁查詢的SQL語句寫法! 一:分頁需求: 客戶端通過傳遞start(頁碼),limit(每頁顯示的條數

PHP實現資料庫資料的

一、實現思路: 1. 使用bootstrap框架,實現資料庫的連線,以及sql指令的執行; 2.寫html中的table程式碼,用bootstrap中的表格樣式進行修飾; 3.在分頁的連結上新增引數; 4.獲得當前的頁號; 5.控制翻頁(向上不得超過第一頁,向下不得超過最後一頁)

Springboot+easyui實現資料庫前臺資訊顯示

資料庫中的資訊在前臺的分頁顯示.        為什麼要進行要分頁?是為了在前臺頁面中不採用滾動條的形式看起來更加的美觀.同時如果不採用分頁的形式,如果資料量較大的話,瀏覽器的請求會特別的耗費時間,可

Mybatis-利用Mybatis Generator外掛生成基於資料庫方言的語句,統計記錄總數

眾所周知,Mybatis本身沒有提供基於資料庫方言的分頁功能,而是基於JDBC的遊標分頁,很容易出現效能問題。網上有很多分頁的解決方案,不外乎是基於Mybatis本機的外掛機制,通過攔截Sql做分頁。但是在像Oracle這樣的資料庫上,攔截器生成的Sql語句沒有變數繫

Javaweb中結合mysql資料庫實現功能

Javaweb分頁技術實現 分頁技術就是通過SQL語句(如下)來獲取資料,具體實現看下面程式碼 //分頁查詢語句 select * from 表名 where limit page , count; 和 //獲取表中的總資料,確定頁數 select count(*) f

MySQL資料庫+jsp+servlet實現查詢

    前一段做的那個jsp+servlet的小專案用到了分頁查詢,今天總結到部落格上面,以後忘記了自己可以看,也分享給大家.     這個專案使用的資料庫是MySQL,在MySQL資料庫中使用 select user_id,username from us

jsp實現顯示資訊(資料庫、EL表示式、連線池)

一、準備工作 1.1在mysql資料庫中你建立學生的表 1.2細節: 1.2.0. 先匯入musql的jar包 1.2.1. 性別一般用列舉型 1.2.2. 要將錶轉儲sql檔案,放在web專案額web-info下面

基於Oracle資料庫,用SSM框架和easyUI實現查詢操作

基於Oracle資料庫,用SSM框架和easyUI來實現分頁查詢操作: 第一步,首先擬定好資料庫中的表,在eclipse裡面用maver專案搭配好SSM框架(其中關於SSM框架的pom.xml,spring-mvc.xml,spring-bean.xml,以及webapp目錄下的WEB-INF

hibernate(jpa)根據實體動態生成查詢條件,並實現問題的解決方案

hibernate如何根據傳進去實體的不為空屬性生成動態查詢,並實現分頁,經過檢視hibernate api需要用到Criteria ,但是Criteria 有個缺點就是當另一個表A中某一外來鍵列是該表B的主鍵,如果A表中有兩條記錄對應B表的某一主鍵,則查詢結果中B表的該記錄

利用資料庫實現,並顯示在Table中

資料庫實現每次獲得N(可以更改)條資料並下一次跳過已獲得的資料 MYsql:    String sql = "select * from GoodsType LIMIT "+start+","+sum;為Mysql資料庫SQL:       String sql = "s

SSH——基於datagrid實現查詢

sel 雙擊 datagrid auto roman .... img order 信息 1. 修改頁面中datagrid的URL地址,訪問action // 取派員信息表格 $(‘#grid‘).datagrid( {

[Asp.Net Core] - 使用 ViewComponents 實現控件

world asi action span ring easyn eba orm clas 分頁控件(定義分頁參數) ~/ViewComponents/PaginationViewComponent.cs using HelloWorld.DataContext; u

jQuery 插件(jQuery.pagination.js)ajax 實現

height var 實現 before 狀態 pin 好的 調用 是否 首先需要引入jQuery 再次需要引入 <script src="jquery/jquery.pagination.js"></script>同時也要引入 <link r

hibernate查詢之Criteria實現方法(GROOVY語法)

tracking b2b earch urn eat con div 查詢 mod public int searchTest(String name, Integer pageIndex, List<Test> resultList){ def

myBatis學習筆記(10)——使用攔截器實現查詢

條件 iba execute rri itl alias property gen func 1. Page package com.sm.model; import java.util.List; public class Page<T&g

asp.net MVC 使用PagedList.MVC實現

nbsp 超出 inf length names .cn www 名稱 ger 在上一篇的EF之DB First中,存在以下的兩個問題: 1. 添加/編輯頁面顯示的是屬性名稱,而非自定義的名稱(如:姓名、專業...) 2. 添加/編輯時沒有加入驗證 3. 數據展示使用分頁

java實現功能的

oid gen asf agen pre 首頁 != eno true package smn.util; public class Pager { private int pageNow; private int pageSize=4; pri

Angularjs+Bootstrap實現指令

效果圖 博客 要求 config 大小 cti 說明 cal 自己   本插件的開發目的主要給前端同學使用,本人是專註於後臺開發的,對css樣式不熟悉,但逼於前端要求做一個共公組件方便日常開發,所以這個插件在樣式上可能不適合大部分人,喜歡的拿走吧,不喜歡的也請別噴。 一