-
- å¿«éå¼å§
- ç¯å¢é ç½®
- çæ代ç
- æºç ä¿®æ¹
- ä¿®æ¹é ç½®æ件
- å å
¥è§£æå¨
- ä¿®æ¹DTDæ ¡éªæ件
- æ°å»ºè§£æå¨
- è·å表æ°æ®
- çææ件åºç¡ä¿¡æ¯
- çæèµæºçæå¨
- ä¿åèµæºæ件信æ¯
- èªå®ä¹æ件
- æ°å»ºæ件
- åºç¨æ件
- æ§è¡
- å¿«éå¼å§
MyBatis Generator è½å¿«é代ç çæå·¥å ·ï¼å°½ç®¡å·²ç»æä¾äºå¤§éçé ç½®æ ç¾ï¼ä½æ¯æ¯ä¸ªå ¬å¸é½æèªå·±ç代ç è§èï¼è¿ä¸ªæ¶åï¼å«äººæä¾çä¸åéï¼é£å°±åªè½èªå·±ä¸æäºï¼æ¯ç«éåèªå·±çææ¯æ顺æçã
å¯è½æ¯CSDNé®é¢ï¼å¤å¶çxmlç²è´´å°ç½é¡µéåï¼æ¯ä¸ªæ ç¾èªå¨éåäºï¼ç»å°¾èªå¨å¸¦äºâ/âï¼å¤å¶ä»£ç æ¶è¯·æ³¨æã
å¿«éå¼å§
èèå°æç读è 没æ使ç¨è¿ï¼æ¬ç« 为äºå¿«éå顾MyBatis Generatorç使ç¨ï¼å·²ç»ä¼ç¨è¯·èªè¡è·³è¿ã
ç¯å¢é ç½®
åºç¡JAVAå¼åç¯å¢è¯·èªè¡é 置好ï¼è¿éä¸å¤åéè¿°ãåæ¶ï¼ä»å®ç½çGitHubä¸æåæºç ï¼ç¹å»è¿é ï¼æè ä»ä¸æ¹ç´æ¥copyä»åºå°åæåã
å½æåå®æ¯çç®å½çä¸å¾ï¼æ ¸å¿çç®å½å°±æ¯coreï¼åç»çä¿®æ¹é½æ¯åºäºå®å¼å§çã
çæ代ç
åç产代ç åæ以ä¸å 个æ¥éª¤è¦åï¼
å建ä¸å¼ 表
è¿éæ°å»ºäºä¸ä¸ªteståºï¼åæ¶å å ¥äºä¸å¼ hello表ã
CREATE TABLE `hello` (
`id` bigint() NOT NULL AUTO_INCREMENT COMMENT '主é®',
`code` smallint() DEFAULT NULL COMMENT 'ç¶æç ',
`msg` mediumtext COMMENT 'è¿åç»æ',
`created_time` datetime DEFAULT NULL COMMENT 'å建æ¶é´',
`updated_time` datetime DEFAULT NULL COMMENT 'æ´æ°æ¶é´',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
æ°å»ºé ç½®æ件
å¨é¡¹ç®ä¸å»ºç«ä¸ä¸ª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>
<classPathEntry location="D:\IDEA\generator\core\mybatis-generator-core\src\test\resources\mysql-connector-java-5.1.36.jar" />
<context id="XHTables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<commentGenerator>
<property name="suppressDate" value="true" />
<!-- æ¯å¦[å»é¤]èªå¨çæç注é trueï¼æ¯ ï¼ false:å¦ -->
<property name="suppressAllComments" value="false" />
<property name="addRemarkComments" value="true" />
</commentGenerator>
<!--æ°æ®åºè¿æ¥-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://106.14.216.248:3306/test?useUnicode=true&characterEncoding=UTF-8"
userId="root"
password="meiyoumima123">
</jdbcConnection>
<!--model å exampleä½ç½®-->
<javaModelGenerator targetPackage="dto" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</javaModelGenerator>
<!--mappingæ件ä½ç½®-->
<sqlMapGenerator targetPackage="mapping" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--XMLä½ç½®-->
<javaClientGenerator type="XMLMAPPER" targetPackage="dao" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--è¦çæç表å-->
<table tableName="hello" domainObjectName="Hello"
enableCountByExample="true"
enableUpdateByExample="true"
enableDeleteByExample="true"
enableSelectByExample="true"
selectByExampleQueryId="false">
<generatedKey column="ID" sqlStatement="MYSQL" identity="true" />
</table>
</context>
</generatorConfiguration>
è¿è¡
å¹³æ¶æ们使ç¨æ件æ¶ï¼ç´æ¥ä½¿ç¨çæ¯jarå ï¼è¿è¡çæ¶åæ¯æ²å»å½ä»¤çæ:
å 为ï¼æ们è¿éæ¯åææºç ï¼æ们éè¦ç¥éç¨åºå ¥å£ï¼é£ä¹ä»¥DOSä¸æ²javaå½ä»¤è¿ä¸ªçº¿ç´¢æ们å»å¯»æ¾ä¸»å ¥å£ã
解åjaræ件ï¼jaræ件éè¿mavenä¾èµå¯ä»¥ç´æ¥å¾å°ï¼æè èªè¡ä¸è½½ï¼ï¼æ们æ¾å°META-INF/MANIFEST.MFï¼æ¤æ件ä½ç¨è¯·èªè¡ç¾åº¦ï¼æ件ä¸æ¾å°è¿ä¹ä¸å¥ï¼Main-Class: org.mybatis.generator.api.ShellRunnerï¼æ²¡éï¼è¿å°±æ¯ç¨åºå ¥å£ï¼è§ä¸å¾ï¼
é£ä¹ï¼åå°é¡¹ç®ï¼æç´¢è¿ä¸ªç±»ï¼è§ä¸å¾ï¼
åçï¼æ们åå¯å¨Mainæ¹æ³ä¹åé ç½®ï¼ä¸ä¼é çè¯ï¼æµè¯æ¶å¯ä»¥å åæ»å¨mainæ¹æ³éï¼ä¼ å ¥åæ°ï¼
-configfile D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\Hello.xml
-overwrite
-verbose
å ¶ä¸ï¼-verbose æ¯æå°æ§è¡è¿ç¨ï¼ä¸å å没æãå¨ShellRunnerä¸å¯¹åºçæ¯ä¸é¢è¿ä¸è¡ä»£ç ï¼
ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback()
: null;
å¦æï¼é ç½®æ 误并æ£ç¡®æ§è¡çè¯ï¼å°å¨æ§å¶å°çå°ä»¥ä¸ä¿¡æ¯ï¼
Connecting to the Database
Introspecting table hello
Generating Example class for table hello
Generating Record class for table hello
Generating Mapper Interface for table hello
Generating SQL Map for table hello
Saving file HelloMapper.xml
Saving file HelloExample.java
Saving file Hello.java
Saving file HelloMapper.java
MyBatis Generator finished successfully.
çæçç®å½å¦ä¸ï¼
å¦æ¤ï¼æææä½ä¾¿å®æäºãé¢æ³äºè§£æ´å¤ï¼è¯·ç¾åº¦ï¼ä¸è¾¹å°è¿å ¥åææºç åæä¿®æ¹æºç ç¯èã
æºç ä¿®æ¹
ç°å¨ç¨Maven管ç项ç®æ¯ä¸ä»¶å¾æ®éçäºï¼å ¬å¸å¯¹äºä»£ç 管çæä¸¥æ ¼çè¦æ±ï¼å¯¹å¤æä¾æå¡çåªè½æ¯APIï¼å¾®æå¡ä¸è¬æ¯è¿æ ·ï¼ï¼ä¸APIï¼å¯¹å¤æä¾æå¡ï¼æ å ³çé£ä¹æ¯ä¸å 许对å¤æä¾è®¿é®æ¹å¼çã
æ¯å¦ï¼ç°å¨æï¼AãBï¼2个模åï¼è¿é对å¤æä¾çA模ååªè½æModelï¼è¿é对åºHello.javaï¼,å ¶ä»çæ件ï¼HelloMapper.javaãHelloExample.javaãHelloMapper.xmlï¼é½åªè½å¨Bç模åä¸ï¼é£ä¹Genneratorå¯ä»¥ä¿®æ¹daoåmappingæ件ç®å½ä¸ºBçç®å½ï¼éæ°çæå³å¯ãä½æ¯HelloExampleå´ä¸è½éè¿é ç½®å»åï¼å 为æºç æ¯å°HelloåHelloExampleç»å®å¨äºä¸èµ·äºï¼è¿æ¶å°±è¦é æ们èªå·±æ¥å®ç°è¿ä¸ªåè½äºã
注ï¼æåå¦è¯´ï¼ææå¨å°HelloExampleä»Aå¤å¶å°Bä¸å°±å¯ä»¥äºä¹ï¼å¹²åè¦è¿ä¹éº»ç¦ï¼å¦æè¿æ ·æ³ï¼ä¹æ²¡é®é¢ï¼è¿ä½åå¦ä½ å¯ä»¥ç¦»å¼äºï¼åå ï¼èªå·±æï¼ã
ä¿®æ¹é ç½®æ件
<!--model å exampleä½ç½®-->
<javaModelGenerator >....çç¥...</javaModelGenerator>
<!--mappingæ件ä½ç½®-->
<sqlMapGenerator>....çç¥...</sqlMapGenerator>
<!--XMLä½ç½®-->
<javaClientGenerator >....çç¥.../javaClientGenerator>
æ们çé ç½®æ件åç°æ¢ç¶å°äºä¸ä¸ªé ç½®æ ç¾ï¼é£ä¹æ们就å æ°å¢ä¸ä¸ªæ ç¾ï¼å¤å¶ä¸ä¸ªâjavaModelGenerator âæ ç¾ï¼å¹¶å°ååæ¹ä¸ºâjavaExampleGenerator âï¼
<?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>
<classPathEntry location="D:\IDEA\generator\core\mybatis-generator-core\src\test\resources\mysql-connector-java-5.1.36.jar" />
<context id="XHTables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<commentGenerator>
<property name="suppressDate" value="true" />
<!-- æ¯å¦[å»é¤]èªå¨çæç注é trueï¼æ¯ ï¼ false:å¦ -->
<property name="suppressAllComments" value="false" />
<property name="addRemarkComments" value="true" />
</commentGenerator>
<!--æ°æ®åºè¿æ¥-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://106.14.216.248:3306/test?useUnicode=true&characterEncoding=UTF-8"
userId="root"
password="meiyoumima123">
</jdbcConnection>
<!--model å exampleä½ç½®-->
<javaModelGenerator targetPackage="dto" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</javaModelGenerator>
<!-- æ°å å
¥æ ç¾ï¼å°çæç Exampleæ件æ¾å°æå®å
ä¸ï¼å®æ¹æ¯å javaModelGenerator å¨ä¸ä¸ªå
ä¸ï¼ä¸æ¯æåç¬é
ç½®-->
<javaExampleGenerator targetPackage="exampleModel" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</javaExampleGenerator>
<!--mappingæ件ä½ç½®-->
<sqlMapGenerator targetPackage="mapping" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!--XMLä½ç½®-->
<javaClientGenerator type="XMLMAPPER" targetPackage="dao" targetProject="D:\IDEA\generator1\generator-master\core\mybatis-generator-core\src\test\resources\test">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--è¦çæç表å-->
<table tableName="hello" domainObjectName="Hello"
enableCountByExample="true"
enableUpdateByExample="true"
enableDeleteByExample="true"
enableSelectByExample="true"
selectByExampleQueryId="false">
<generatedKey column="ID" sqlStatement="MYSQL" identity="true" />
</table>
</context>
</generatorConfiguration>
å¦æ¤ï¼é ç½®æ件修æ¹å®æ¯ï¼å¦æIDEå¯ç¨éªè¯XML个æ¯çè¯ï¼è¿éå å ¥å®æ¯åä¼æ¾ç¤ºæ¥éï¼å 为DTDéªè¯ï¼èªè¡ç¾ç§ï¼ä¸éè¿ï¼æ们åç»è¿æä¿®æ¹.dtdæ件ãä¸è¿ï¼æ们æ¢ç¶åææºç ï¼é£å°±ä¸æ¥ä¸æ¥æ¥ï¼å ä¸ç®¡è¿ä¸ªæ¥éã
å å ¥è§£æå¨
/**
* åå§åé
置解æå¨
*/
ConfigurationParser cp = new ConfigurationParser(warnings);
/**
* è°ç¨é
置解æå¨å建é
置对象
*
*/
Configuration config = cp.parseConfiguration(configurationFile);
/**
* shellcallbackæ¥å£ä¸»è¦ç¨æ¥å¤çæ件çå建åå并ï¼ä¼ å
¥overwriteåæ°ï¼é»è®¤çshellcallbackæ¯ä¸æ¯ææ件å并çï¼
*/
DefaultShellCallback shellCallback = new DefaultShellCallback(
arguments.containsKey(OVERWRITE));
/**
* å建ä¸ä¸ªMyBatisGenerator对象ãMyBatisGeneratorç±»æ¯çæ£ç¨æ¥æ§è¡çæå¨ä½çç±»
*/
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);
/**
* -verbose ç¨System.outæå°æ§è¡è¿ç¨
*
*/
ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback(): null;
/**
* æ§è¡çææä½ï¼contextsåfullyqualifiedTablesé½æ¯å
¥å£è¿æ¥çåæ°ï¼èªè¡ç¾åº¦ã
*/
myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables);
å¦ä¸ï¼å¨ShellRunnerä¸è¿é使æä»¬å ³æ³¨çç¦ç¹ï¼å¼å§è·è¸ªä»£ç æ§è¡è¿ç¨ï¼ä» Configuration config = cp.parseConfiguration(configurationFile) ä¸è·¯è·è¸ªå°parseConfiguration(InputSource inputSource)
throws IOException, XMLParserExceptionè¿ä¸ªæ¹æ³ï¼
为äºä»£ç è¯ä»¶ï¼è¿éåªæ¾ç¤ºå ³é®ä»£ç ï¼
private Configuration parseConfiguration(InputSource inputSource)
throws IOException, XMLParserException {
//1 è®¾ç½®æ ¡éªçdtdèµæºæ件
builder.setEntityResolver(new ParserEntityResolver());
//2 解æé
ç½®
config = parseMyBatisGeneratorConfiguration(rootNode);
}
ä¿®æ¹DTDæ ¡éªæ件
å çæ è¯1ç代ç ï¼ParserEntityResolver æ¯ç¨æ¥ådtdéªè¯ï¼è¿å ¥è¿ä¸ªå¯¹è±¡ï¼å¹¶æ¥çä¸é¢è¿ä¸ªæ¹æ³resolveEntity(String publicId, String systemId)ï¼ä¼æ¾å°è¿ä¸å¥ï¼
InputStream is = getClass()getClassLoader().getResourceAsStream("org/mybatis/generator/config/xml/mybatis-generator-config_1_0.dtd");
InputSource ins = new InputSource(is);
å 为æ们é ç½®çhello.xmlæ件头æ¯è¿ä¸ªï¼åå¤ææ¡ä»¶ä¸è´ï¼
ææï¼å®è¯»çdtdæ件路å¾ç¥éäºï¼
æ件ä½ç½®ä»¥org/mybatis/generator/config/xml/mybatis-generator-config_1_0.dtdï¼å©ä¸çå°±æ¯ä¿®æ¹è¿ä¸ªæ件ï¼å¤å¶javaModelGeneratorï¼å°å¤å¶çè¿ä¸ªæ¹ä¸èç¹åå为javaExampleGeneratorï¼å¦å¾æä½ï¼
è¿æ²¡å®ï¼è¿ä¸ªæ¯åå»çhello.xmlï¼å¦æå¼äºéªè¯çè¯ï¼åç°è¿æ¯å¨æ¥éï¼å 为è¿æä¸ä¸ªå°æ¹ï¼
åæ ·å å ¥æ°å¢çjavaExampleGeneratorèç¹ï¼è¿æ¶ååå»hello.xmlçå°±ä¸æ¥éäºã
æ°å»ºè§£æå¨
åå°ConfigurationParser.parseConfiguration(InputSource inputSource)çè¿ä¸ªæ¹æ³ã
private Configuration parseConfiguration(InputSource inputSource)
throws IOException, XMLParserException {
//1 è®¾ç½®æ ¡éªçdtdèµæºæ件
builder.setEntityResolver(new ParserEntityResolver());
//2 解æé
ç½®
config = parseMyBatisGeneratorConfiguration(rootNode);
}
åæï¼åæäº1çæ¹æ³ï¼ådtdä¸æ ·ï¼å 为hello.xmlç头æ们已ç»åºå®äºï¼æ以è¿éç¨çæ¯parseMyBatisGeneratorConfigurationï¼*ï¼è¿ä¸ªæ¹æ³ï¼ç°å¨æ¾å°2è¿ä¸è¡ç»§ç»è·è¸ªï¼
private Configuration parseMyBatisGeneratorConfiguration(Element rootNode)
throws XMLParserException {
MyBatisGeneratorConfigurationParser parser = new MyBatisGeneratorConfigurationParser(
extraProperties);
return parser.parseConfiguration(rootNode);
}
åç°å°è¿éæ¢æäºMyBatisGeneratorConfigurationParserç解æå¨ï¼ç»§ç»ï¼
public Configuration parseConfiguration(Element rootNode)
throws XMLParserException {
...
parseContext(configuration, childNode);
...
return configuration;
}
éè¿hello.xmlåç°ï¼ä¸è®ºæ¯javaModelGeneratoræ ç¾è¿æ¯æ们æ°å çjavaExampleGeneratoré½æ¯contextçåæ ç¾ï¼ç±parseContext继ç»å¾ä¸ï¼
private void parseContext(Configuration configuration, Node node) {
...
if ("property".equals(childNode.getNodeName())) { //$NON-NLS-$
parseProperty(context, childNode);
} else if ("plugin".equals(childNode.getNodeName())) { //$NON-NLS-$
parsePlugin(context, childNode);
} else if ("commentGenerator".equals(childNode.getNodeName())) { //$NON-NLS-$
parseCommentGenerator(context, childNode);
} else if ("jdbcConnection".equals(childNode.getNodeName())) { //$NON-NLS-$
parseJdbcConnection(context, childNode);
} else if ("connectionFactory".equals(childNode.getNodeName())) { //$NON-NLS-$
parseConnectionFactory(context, childNode);
} else if ("javaModelGenerator".equals(childNode.getNodeName())) { //$NON-NLS-$
parseJavaModelGenerator(context, childNode);
}
...
è¿éåç°ï¼å®æ ¹æ®ä¸åæ ç¾è¿è¡è§£æï¼ä»¥âparseJavaModelGeneratorâ为ä¾ï¼æ¥çparseJavaModelGenerator(context, childNode)è¿ä¸ªæ¹æ³ï¼
protected void parseJavaModelGenerator(Context context, Node node) {
//1 èªå®ä¹è§£æå¨
JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
// 2 å°è§£æå¨æ¾å
¥ä¸ä¸æ
context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);
}
ä¸é¾çåºï¼æ ¸å¿æ¹æ³æ2个ï¼é£å°±ç §çå¤å¶ä¿®æ¹åï¼
å å®ä½JavaModelGeneratorConfigurationç±»ï¼å¤å¶ä¸ä»½ä¿®æ¹ç±»å为JavaExampleGeneratorConfigurationï¼å¹¶å°toXmlElementéçèç¹ååæ¢ææ们æ°å å ¥çæ ç¾ã
è¿éåªæ¯å å ¥äºè§£æå¨ï¼æ们éè¦ç¨ä¸æ们ç解æå¨ï¼å¹¶ä¸æ解æå°çå 容æ¾å ¥å°ä¸ä¸æä¸ï¼å æ¤ï¼
1ãå¤å¶parseJavaModelGeneratoræ¹æ³å¹¶æ¹å为parseJavaExampleGeneratorï¼ç¶ååºç¨æ们ç解æå¨ï¼
ä¸è¾¹æ¯åºç¨äºè§£æå¨ï¼ä½æ¯æ们çä¸ä¸æè¿æ²¡ææ¾è§£æçå 容ï¼æ³¨æç´«è²æ¡æ¡ã
2ãç´«è²æ¡æ¡éçContext对象æ¯åæ¾ä¸ä¸æä¿¡æ¯çï¼æ们å°è§£æå¨å å ¥å°Contextä¸ï¼å¹¶çægetter/setter:
private JavaExampleGeneratorConfiguration javaExampleGeneratorConfiguration;
public JavaExampleGeneratorConfiguration getJavaExampleGeneratorConfiguration() {
return javaExampleGeneratorConfiguration;
}
public void setJavaExampleGeneratorConfiguration(JavaExampleGeneratorConfiguration javaExampleGeneratorConfiguration) {
this.javaExampleGeneratorConfiguration = javaExampleGeneratorConfiguration;
}
3ã让DOM读å°æ°å æ ç¾æ¶ï¼äº¤ç»æ们ç解æå¨å¤çï¼å æ¤è¿éè¦å¨parseContext(Configuration configuration, Node node)ä¸å å ¥æ们çåæ¯èç¹ï¼
è³æ¤ï¼æ们æ°å å ¥çæ ç¾å·²ç»å¯ä»¥æ£ç¡®è§£æï¼æ°æ®åå¤é¶æ®µå·²å®æãä¸ä¸æ¥è¦åçæ¯è®©çæå·¥å ·è½è¯»å°æ们æ°å ç解æå¨ï¼å¹¶ä½¿ç¨å ¶ä¸çä¿¡æ¯ã
è·å表æ°æ®
åæçåå¤å·¥ä½å·²å®æï¼ç°å¨å¼å§ä»çæ代ç å¼å§å¾ä¸è·ï¼åå°ShellRunnerï¼ä»¥ä¸é¢çgenerate(*)å¾ä¸è·è¸ªä»£ç ï¼
è¿å ¥ä»£ç åï¼
public void generate(ProgressCallback callback, Set<String> contextIds,
Set<String> fullyQualifiedTableNames, boolean writeFiles) throws SQLException, IOException, InterruptedException {
...
//ã è¿æ¥æ°æ®åºï¼è§£æ表å段
for (Context context : contextsToRun) {
context.introspectTables(callback, warnings,fullyQualifiedTableNames);
}
//ãçæJAVAåxml对åºèµæºæ件
for (Context context : contextsToRun) {
context.generateFiles(callback, generatedJavaFiles,generatedXmlFiles, warnings);
}
//ãä¿åæ件
if (writeFiles) {
...
}
å çè¿æ¥æ°æ®åºï¼
public void introspectTables(ProgressCallback callback,
List<String> warnings, Set<String> fullyQualifiedTableNames)
throws SQLException, InterruptedException {
// åå§å表æ°ç»
introspectedTables = new ArrayList<IntrospectedTable>();
// è·å表信æ¯
for (TableConfiguration tc : tableConfigurations) {
...
List<IntrospectedTable> tables = databaseIntrospector.introspectTables(tc);
...
}
}
éè¿databaseIntrospector.introspectTables(tc);å¾ä¸è¿½è¸ªï¼
public List<IntrospectedTable> introspectTables(TableConfiguration tc)
throws SQLException {
List<IntrospectedTable> introspectedTables = calculateIntrospectedTables(
tc, columns)
}
private List<IntrospectedTable> calculateIntrospectedTables(
TableConfiguration tc,
Map<ActualTableName, List<IntrospectedColumn>> columns) {
IntrospectedTable introspectedTable = ObjectFactory
.createIntrospectedTable(tc, table, context);
}
public static IntrospectedTable createIntrospectedTable(
TableConfiguration tableConfiguration, FullyQualifiedTable table,
Context context) {
IntrospectedTable answer = createIntrospectedTableForValidation(context);
}
public static IntrospectedTable createIntrospectedTableForValidation(Context context) {
String type = context.getTargetRuntime();
if ("MyBatis3".equalsIgnoreCase(type)) {
type = IntrospectedTableMyBatis3Impl.class.getName();
}
// IntrospectedTable å
¶å®å°±æ¯ IntrospectedTableMyBatis3Impl对象
IntrospectedTable answer = (IntrospectedTable) createInternalObject(type);
}
注æï¼IntrospectedTable å ¶å®å°±æ¯ IntrospectedTableMyBatis3Impl对象ï¼è¿ä¸ªåè¾¹ä¼ç¨å°ã
以ä¸ä»£ç 忽ç¥äºå ¶ä»å 容ï¼ä¸»è¦æ¯å¯¹æ¥å°ç表æ°æ®è¿è¡è¿æ»¤çéï¼ç»å»ºåç»èµæºæ件æéç对象ï¼æå ´è¶£å¯ä»¥èªè¡è°è¯ï¼
è¿é主è¦æ¯çå° IntrospectedTableMyBatis3Impl.classè¿ä¸ªå¯¹è±¡ççæãèè¿ä¸ªType å¯¹åº çæ¯helllo.xmlä¸contextæ ç¾çâtargetRuntime=âMyBatis3âãèæ¯ä¸ä¸ªIntrospectedTableé½å°è£ äºå¯¹åºä¸ä¸ªè¡¨çå ¨é¨æ建信æ¯ã
çææ件åºç¡ä¿¡æ¯
çå®è¿æ¥æ°æ®åºï¼åç第ä¸æ¥ââçæJAVAåXML对åºçèµæºæ件âï¼å¾ä¸èµ°ï¼
public void generateFiles(ProgressCallback callback,
List<GeneratedJavaFile> generatedJavaFiles,
List<GeneratedXmlFile> generatedXmlFiles, List<String> warnings)
throws InterruptedException {
//ãæ件å®ä¾å
for (PluginConfiguration pluginConfiguration : pluginConfigurations) {
...
}
...
if (introspectedTables != null) {
for (IntrospectedTable introspectedTable : introspectedTables) {
callback.checkCancel();
//ãåå§åçæè§åãå
å表å
introspectedTable.initialize();
introspectedTable.calculateGenerators(warnings, callback); // ãæ·»å 解æå¨åæ°
generatedJavaFiles.addAll(introspectedTable.getGeneratedJavaFiles()); // ãçæJavaç±» *Example
generatedXmlFiles.addAll(introspectedTable.getGeneratedXmlFiles()); // ãçæxml
...
}
}
}
ä¸å¾ï¼ç¬¬ä¸æ¥æ件å®ä¾åï¼è¿ä¸ªæ们å æ éå ³å¿ï¼åç»æ们æåæ件çæ¶åï¼è¿éæä¼æ¯éç¹ãç第äºæ¥ï¼
public void initialize() {
calculateJavaClientAttributes(); // mapper
calculateModelAttributes();// daoãexampleèµæºä½ç½®è¿éçæ
calculateXmlAttributes(); // xml
...
}
è¿éæ们主è¦ç calculateModelAttributes()æ¹æ³ï¼
protected void calculateModelAttributes() {
// ã读åçæ¯javaModelGenerator æ ç¾çå
è·¯å¾
String pakkage = calculateJavaModelPackage();
// ãæ¼è£
å
¨éå®åï¼ä¼å½±åçæHelloçä½ç½®
sb.setLength();
sb.append(pakkage);
sb.append('.');
sb.append(fullyQualifiedTable.getDomainObjectName());
setBaseRecordType(sb.toString());
// ãæ¼è£
å
¨éå®åï¼ä¼å½±åçæHelloExampleçä½ç½®
sb.setLength();
sb.append(pakkage);
sb.append('.');
sb.append(fullyQualifiedTable.getDomainObjectName());
sb.append("Example"); //$NON-NLS-1$
setExampleType(sb.toString());
}
ä¸å¾ï¼æ们çå°è¿éå°HelloåHelloExampleçå ¨éå®ç±»åæåºæ¥äºï¼è¿ä¸ªä¼å½±åæç»æ件çä½ç½®ï¼ç¶èString pakkage = calculateJavaModelPackage();æ¹æ³è·è¸ªè¿å»ï¼
protected String calculateJavaModelPackage() {
// è·åContextä¸ä¸æä¸å·²ç»ç¼åäºjavaModelGeneratoræ ç¾å±æ§ä¿¡æ¯çJavaModelGeneratorConfiguration解æå¨
JavaModelGeneratorConfiguration config = context.getJavaModelGeneratorConfiguration();
StringBuilder sb = new StringBuilder();
sb.append(config.getTargetPackage());// javaModelGenerator æ ç¾ä¸ targetPackage å±æ§çå¼
sb.append(fullyQualifiedTable.getSubPackageForModel(isSubPackagesEnabled(config)));
return sb.toString();
}
æè¿é注éçå¾æç½äºï¼æ们ä¹åºè¯¥æç½ä¸ºå¥è¯´HelloåHelloExampleæ¯ç»å®å¨ä¸èµ·äºã
å¦æ¤ï¼æ¾å°ç æ ¹ï¼é£å°±å¥½è§£å³äºï¼æ¢ç¶ç»å¨ä¸èµ·é£æ们就æå®æå¼ï¼
1ãå¤å¶calculateJavaModelPackage()并å½å为calculateJavaExamplePackage()ï¼ç¶åéä»Contextä¸è·åæ们èªå®ä¹è§£æå¨çä¿¡æ¯ï¼ä¸ä¸æ¥å°ä¼ç¨å°è¿ä¸ªæ¹æ³ï¼
2ãå¤å¶calculateModelAttributes()并æ¹ä¸º calculateExampleAttributes()ï¼å° calculateExampleAttributes()ä¸æ¼æ¥HelloExampleå ¨éå®ç±»ååªè´´å°calculateExampleAttributes()æ¹æ³ä¸ï¼æ³¨ææ°æ¹æ³åºç¨çæ¯æ们èªå·±å ç解æå¨å³ç¨çæ¯ä¸ä¸æ¥æä½ä¸å¤å¶çcalculateJavaExamplePackage()æ¹æ³åï¼
çæèµæºçæå¨
éæ°åå°çæèµæºæ件è¿éï¼åååæå®äºç¬¬äºæ¥ï¼ç°å¨ç第ä¸æ¥ï¼å¨è¿æ¥æ°æ®åºé£ä¸æ¥ï¼
æ们已ç»ç¥éIntrospectedTable å ¶å®å°±æ¯ IntrospectedTableMyBatis3Impl对象ï¼æ¥çcalculateGenerators.calculateGenerators()æ¹æ³ï¼
@Override
public void calculateGenerators(List<String> warnings,
ProgressCallback progressCallback) {
// æ·»å ModelãExampleççæå¨
calculateJavaModelGenerators(warnings, progressCallback);
// æ·»å Mapperççæå¨
AbstractJavaClientGenerator javaClientGenerator =
calculateClientGenerators(warnings, progressCallback);
// æ·»å xmlçæå¨
calculateXmlMapperGenerator(javaClientGenerator, warnings, progressCallback);
}
protected void calculateJavaModelGenerators(List<String> warnings,
ProgressCallback progressCallback) {
// æ ¹æ®è§åå¤ææ¯å¦éè¦Exampleçæå¨ï¼å³HelloExample
if (getRules().generateExampleClass()) {
AbstractJavaGenerator javaGenerator = new ExampleGenerator();
initializeAbstractGenerator(javaGenerator, warnings,
progressCallback);
javaModelGenerators.add(javaGenerator);
}
...
//æ ¹æ®è§åå¤ææ¯å¦éè¦Modelçæå¨ï¼å³çæHello
if (getRules().generateBaseRecordClass()) {
AbstractJavaGenerator javaGenerator = new BaseRecordGenerator();
initializeAbstractGenerator(javaGenerator, warnings,
progressCallback);
javaModelGenerators.add(javaGenerator);
}
}
å¨calculateJavaModelGenerators()æ¹æ³ä¸çå°æé å¨é½æ¾å¨javaModelGeneratorsè¿ä¸ªListä¸ï¼è¿ä¸ªä¼å½±åå°åç»è·åå è·¯å¾é®é¢ï¼å æ¤æ们è¦å¨æ¤ç±»ä¸å å ¥ä¸ä¸ªæ们å®ä¹æ ç¾çæ°ç»ï¼
ç¶åï¼ä¿®æ¹calculateJavaModelGenerators() æ¹æ³ï¼å°getRules().generateExampleClass()çjavaModelGeneratorsæ¿æ¢ææ°å çjavaExampleGeneratorsæ°ç»ä¸ï¼
if (getRules().generateExampleClass()) {
AbstractJavaGenerator javaGenerator = new ExampleGenerator();
initializeAbstractGenerator(javaGenerator, warnings,
progressCallback);
javaExampleGenerators.add(javaGenerator);
}
ä¿åèµæºæ件信æ¯
çå®ç¬¬ä¸æ¥ï¼å¨ç第åæ¥ï¼
public void generateFiles(ProgressCallback callback,
List<GeneratedJavaFile> generatedJavaFiles,
List<GeneratedXmlFile> generatedXmlFiles, List<String> warnings)
throws InterruptedException {
//ãæ件å®ä¾å
for (PluginConfiguration pluginConfiguration : pluginConfigurations) {
...
}
...
if (introspectedTables != null) {
for (IntrospectedTable introspectedTable : introspectedTables) {
callback.checkCancel();
//ãåå§åçæè§åãå
å表å
introspectedTable.initialize();
introspectedTable.calculateGenerators(warnings, callback); // ãæ·»å 解æå¨åæ°
generatedJavaFiles.addAll(introspectedTable.getGeneratedJavaFiles()); // ãçæJavaç±» *Example
generatedXmlFiles.addAll(introspectedTable.getGeneratedXmlFiles()); // ãçæxml
...
}
}
}
第åæ¥çintrospectedTable.getGeneratedJavaFiles()æ¹æ³ï¼å¨è¿æ¥æ°æ®åºé£ä¸æ¥ï¼
æ们已ç»ç¥éIntrospectedTable å ¶å®å°±æ¯ IntrospectedTableMyBatis3Impl对象ï¼é£ä¹æ们ççIntrospectedTableMyBatis3Impl.getGeneratedJavaFiles()çå®ç°ï¼
å¨ç¬¬ä¸æ¥åæçæ¶åå·²ç»å°HelloExampleæ件ä»javaModelGeneratorsä¸åç¬æ½ç¦»äºï¼æ们æ¯æ¾å¨javaExampleGeneratorsä¸ï¼å¦æä¸æ½ç¦»åºæ¥å¨è¿éå¯ä»¥æç¡®çåºHelloåHelloExampleé½å¨javaModelGeneratorsä¸ï¼è·åçé½æ¯javaModelGenerator解æå¨éåçå åï¼å³å¯¹åºçè¿æ¯javaModelGeneratoræ ç¾çå¼ï¼èä¸æ¯æ们èªå®ä¹çã
æ¹å¨å¦ä¸ï¼
æåï¼å¾ªç¯ä¿åæ件ï¼è¿éå°±ä¸å¤éè¿°äºã
è³æ¤ï¼æºç ä¿®æ¹å®æ¯äºï¼æ们è¿è¡ä¸ShellRunneræ¥çä¸å§ï¼
大ååæï¼å¿«æå æjarè¯è¯çå§ï¼
èªå®ä¹æ件
ä¸å¾ï¼æ¯æ们çæçHelloæ件ï¼æ们已ç»çå°å®å·²ç»å®ç°äºåºååãéæ°HashCodeãtoStringï¼è¿æ¯å 为æ们å¨é ç½®æ件æè¿ä¹å 个é ç½®:
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
ä»ä»¬åå«æ¯å¯ç¨äºå·²æçåºååæ件ãHashCodeæ件ãToStringæ件ã
ç°å¨åçHello.javaå¾çï¼ç°å¨å设æ们æ³ç»æ¯ä¸ªçæçModelå ä¸æ³¨è§£ï¼å¹¶ä¸åä¸æ们èªå·±ç注éï¼æç»çææï¼
/**
* Hello 设置KryoçCompatibleFieldSerializer
* ç¨åºèªå¨çæï¼æ éæ´æ¹ã
*/
@DefaultSerializer(CompatibleFieldSerializer.class)
public class Hello implements Serializable {
...
}
å°±æ¯ä½¿ç¨æ³¨è§£çæ¹å¼ä½¿ç¨Kryoçåºååææ¯ï¼ç®æ æç¡®å¼å§å®ç°ã
æ°å»ºæ件
æ们å çä¸SerializablePluginçåæ³ï¼æ们åç°å¨è¿å ä¸é¤äºæ们é ç½®çToStringPluginãEqualsHashCodePluginãSerializablePluginæ件å¤ï¼è¿æå ¶ä»æ件ï¼ä½ä»ä»¬é½æä¸ä¸ªå ±åç¹é½æ¯ç»§æ¿èªPluginAdapterï¼å¹¶éåäºéé¢çæ¹æ³ã
å¦æ¤ï¼å å¤å¶SerializablePlugin并éå½å为SerializableAnnoPluginï¼ç¶åå¼å§å®ç°æ们èªå·±çæ¹æ³ï¼
public class SerializableAnnoPlugin extends PluginAdapter {
private FullyQualifiedJavaType defaultSerializer;
private FullyQualifiedJavaType compatibleFieldSerializer;
public SerializableAnnoPlugin() {
super();
defaultSerializer = new FullyQualifiedJavaType("com.esotericsoftware.kryo.DefaultSerializer");
compatibleFieldSerializer = new FullyQualifiedJavaType("com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer");
}
@Override
public boolean validate(List<String> warnings) {
return true;
}
@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;
}
protected void makeSerializable(TopLevelClass topLevelClass,
IntrospectedTable introspectedTable) {
...
}
}
defaultSerializer å compatibleFieldSerializer åå«æ·»å çæ¯å ¨éå®ç±»åï¼è¿ä¸ªå ¶å®ç¸å½äºå¯¼å ¥jarçæä½ï¼ä¼å¨å¤´é¨çæï¼
import com.esotericsoftware.kryo.DefaultSerializer;
import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer;
import java.io.Serializable;
makeSerializable()ç°å¨æ¯ç©ºæ¹æ³ï¼å æ¤ï¼æ们è¦æä¹å»åå¢ï¼æ ¢æ ¢åæã
1ãæ们ä»ç®å½å»æ¾å°âçæèµæºçæå¨âé£ä¸é¨åï¼å³IntrospectedTableMyBatis3ImpldçcalculateJavaModelGeneratorsæ¹æ³ï¼æ们æ¾å°å¯¹åºççæå¨ï¼
protected void calculateJavaModelGenerators(List<String> warnings,
ProgressCallback progressCallback) {
if (getRules().generateExampleClass()) {
AbstractJavaGenerator javaGenerator = new ExampleGenerator();
initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
javaExampleGenerators.add(javaGenerator);
}
...
if (getRules().generateBaseRecordClass()) {
AbstractJavaGenerator javaGenerator = new BaseRecordGenerator();
initializeAbstractGenerator(javaGenerator, warnings, progressCallback);
javaModelGenerators.add(javaGenerator);
}
}
2ãnew BaseRecordGenerator();è¿ä¸ªå°±æ¯çæModelçå ³é®æä½ãå¨çè¿ç±»çæ¹æ³getGeneratedJavaFiles()ï¼è¿ä¸ªæ¹æ³ä½ç¨å边已ç»åæè¿ï¼ä½æ³¨æçjavaGenerator.getCompilationUnits()è¿ä¸å¥:
public List<GeneratedJavaFile> getGeneratedJavaFiles() {
List<GeneratedJavaFile> answer = new ArrayList<GeneratedJavaFile>();
for (AbstractJavaGenerator javaGenerator : javaModelGenerators) {
List<CompilationUnit> compilationUnits = javaGenerator.getCompilationUnits();
for (CompilationUnit compilationUnit : compilationUnits) {
GeneratedJavaFile gjf = new GeneratedJavaFile(compilationUnit, context.getJavaModelGeneratorConfiguration().getTargetProject(), context.getProperty(PropertyRegistry.CONTEXT_JAVA_FILE_ENCODING), context.getJavaFormatter());
answer.add(gjf);
}
}
}
è¿ä¸ªçæå¨å ¶å®æ¯è°ç¨BaseRecordGeneratorçgetCompilationUnits()æ¹æ³ï¼è¿éå°±æ¯çæèµæºçæ ¸å¿äºï¼
public List<CompilationUnit> getCompilationUnits() {
CommentGenerator commentGenerator = context.getCommentGenerator();
...
// Modelç注é
commentGenerator.addModelClassComment(topLevelClass, introspectedTable);
...
return answer;
}
æ们çå°ï¼å ä»ä¸ä¸ææ¿å°æé å¨context.getCommentGenerator()ãç¶åè¿å ¥ commentGenerator.addModelClassComment(topLevelClass, introspectedTable)åç°è¿ä¸ªå ¶å®å°±æ¯çæDOCçæ¹æ³ï¼å æ¤ï¼æä»¬å° commentGenerator.addModelClassComment(topLevelClass, introspectedTable)注éæï¼ç¶åå°éè¾¹çæ¹æ³å¤å¶å°æ们SerializableAnnoPluginéçmakeSerializableï¼ï¼æ¹æ³éï¼ç¶åç¨ä½ä¿®æ¹ï¼
protected void makeSerializable(TopLevelClass topLevelClass,
IntrospectedTable introspectedTable) {
topLevelClass.addImportedType(this.defaultSerializer);
topLevelClass.addImportedType(this.compatibleFieldSerializer);
CommentGenerator commentGenerator = this.context.getCommentGenerator();
topLevelClass.addJavaDocLine("/**");
topLevelClass.addJavaDocLine(String.format("* %s设置KryoçCompatibleFieldSerializer", introspectedTable.getRules().calculateAllFieldsClass().getShortName()));
topLevelClass.addJavaDocLine("* ç¨åºèªå¨çæï¼æ éæ´æ¹ã");
topLevelClass.addJavaDocLine("*/");
commentGenerator.addJavaFileComment(topLevelClass);
StringBuilder sb = new StringBuilder();
topLevelClass.addAnnotation(sb.append("@DefaultSerializer(").append(this.compatibleFieldSerializer.getShortName()).append(".class)").toString());
}
åºç¨æ件
æåä¸æ¥ï¼å¨Hello.xmlå å ¥æ们çæ件ï¼
<plugin type="org.mybatis.generator.plugins.SerializableAnnoPlugin" />
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
æ§è¡
æ§è¡ä¸ä¸å§ï¼å¤§ååæï¼
ãå®ã