項目中使用mybatis + 通用mapper,用mybatis generator生成代碼時有些不方便,參考了網上的一些例子,修改mybatis genrerator的源碼。
首先,下載mybatis generator 1.3.6 源碼(注意,版本不同代碼肯定有比較大的差別),打開之后目錄結果如下,所有要修改的代碼,都在子項目mybatis-generator-core中
1、禁止生成mybatis自帶的example文件及相應的方法,禁止數據庫字段名駝峰轉換,去掉數據庫表名前綴
這些都不需要改源碼,只需要在自己寫的mybatis generator配置文件中做一下設置,如下圖
【注意】第二條,domainObjectRenamingRule,此屬性,我印象中在mybatis-generator-1.3.6/1.3.7存在,以前版本好像沒有,具體我就不考證了。
2、實體類
2.1 去掉getter,setter方法,使用lombok的@Data注解代替,加入@Table注解,@Id等注解。
在包org.mybatis.generator.plugins下,新建一個繼承自PluginAdapter(位於org.mybatis.generator.api下)的類,名字隨意,我這里的名字叫LombokPlugin,
在LombokPlugin中覆寫PluginAdapter的PluginAdapter.modelSetterMethodGenerated()以及modelGetterMethodGenerated(),令兩個方法都返回false
2.2 修改類注解
覆寫PluginAdapter.modelBaseRecordClassGenerated()
這里實體類上加入了@Data,@Accessors,@Table,通過參數intrspectedTable獲取到數據庫表名
2.3 在id字段上加入@Id和@GeneratedValue
覆寫PluginAdapter.modelFieldGenerated(),給自增的字段或者名為id的字段增加注解@Id和GeneratedValue,所有字段,都添加@Column
3、禁止生成所有默認的方法,
禁止生成selectByPrimaryKey,updateByPrimaryKey,deleteByPrimaryKey,insert,insertSelective,包括interface和xml文件中
這個只要對以下配置全部置為false就可以,
然而,雖然方法都沒有了,可造成兩個后果1、實體類、interface、xml文件不生成了;2、即便生成,xml文件缺少<resultMap>元素
對於后果1,修改org.mybatis.generator.config.Context.introspectTables(),把如下位置的continue語句注釋掉,這樣,在mybatis 配置文件的table元素,當所有enableInsert enableSelectByPrimaryKey等等都為false的情況下,仍然可以生成entity,interface,xml
對於后果2,xml文件缺少<resultMap>,比較麻煩,因為通過代碼發現,生成resultMap的代碼在org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator.addElements()中,因此enableSelectByPrimaryKey必須為true
這樣就必須修改在interface和xml中生成selectByPrimaryKey的方法,
3.1 修改接口方法
修改org.mybatis.generator.codegen.mybatis3.javamapper.elements.SelectByPrimaryKeyMethodGenerator.addInterfaceElements()
注釋interfaze.addMethod(method);
3.2 修改生成xml的方法
修改org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator.addElements()
注釋parentElement.addElement(answer);
通過以上修改,enableSelectByPrimaryKey=true,也不會在interface和xml中生成selectByPrimaryKey,並且保留xml中的<resultMap>。
4、mapper接口文件添加extends Mapper<實體類>,並且加入import語句
在LombokPlugin中,覆寫PluginAdapter.clientGenerated(),
introspectedTable.getBaseRecordType獲取實體類名
interfaze.addSuperInterface添加繼承類
interfaze.addImportedType添加要import的類型
5、打包
修改了代碼,還需要生成jar包,並把jar包更新到本地maven repository中
6、如何使用mybatis generator
當修改了代碼的mybatis generator的jar包更新到本地maven倉庫中后(上一步),就可以在項目中通過maven命令生成文件,操作方法如下
在項目pom文件中引入mybatis generator
然后,在pom中添加如下內容,其中generatorConfig.xml是你的mybatis generator配置文件,這個文件mybatis generator有模板,這里不做說明
然后,修改mybatis generator 配置文件各個參數,如數據庫鏈接,生成的路徑,指定表名或全部生成等參數,
最后,在Maven Projects的如圖位置,雙擊mybatis-generator:generate,即可生成文件。