XML Parser Error on line 39: 必須聲明元素類型 "domainObjectRenamingRule"。 XML Parser Error on line 41: 元素類型為 "table" 的內容必須匹配 "(property*,generatedKey?,columnRenamingRule?,(columnOverride|ignoreColumn|ignoreColumnsByRegex)*)"。 XML Parser Error on line 44: 必須聲明元素類型 "domainObjectRenamingRule"。 XML Parser Error on line 46: 元素類型為 "table" 的內容必須匹配 "(property*,generatedKey?,columnRenamingRule?,(columnOverride|ignoreColumn|ignoreColumnsByRegex)*)"
這是因為在使用的tk-mybatis時候,使用的pom依賴版本過低,導致的這個原因
換成最新的版本就會不報錯了:
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.6</version> </dependency>
domainObjectRenamingRule該功能項是在MBG 1.3.6中新增加的功能,用於定義實體的重命名規則,常見的用途是取消表前綴。類似於columnRenamingRule,前者是重命名生成的模型對象的名稱,后者是重命名表字段的名稱。
如果在低於該版本的MBG中使用該功能,會出現如下錯誤XML Parser Error on line 59: 必須聲明元素類型 "domainObjectRenamingRule"。
首先我們說說“columnRenamingRule”
該功能出現較早,字面上就是在表字段生成屬性名稱,對字段進行重命名,然后生成屬性,searchString使用正則,replaceString為替換的字符串。
比如以下,flower表中有一個字段是flower_name,我希望生成的實體中屬性不是flowerName,而是flower_name -> name。此場景會發生在我們想省略表字段中一些通配的前綴,只保留真正有意義的那部分。
<table tableName="flower"> <generatedKey column="id" sqlStatement="Mysql" identity="true" /> <columnRenamingRule searchString="^flower_" replaceString="" /> </table>
按照上述配置,Flower將使用name屬性對應表中字段flower_name。因為使用了通用Mapper這里生成了注解
public class Flower { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "flower_name") private String name; private String color; setter/getter.... }
FlowerMapper.xml
<resultMap id="BaseResultMap" type="com.xx.Flower"> <id column="id" jdbcType="BIGINT" property="id" /> <result column="flower_name" jdbcType="VARCHAR" property="name" /> <result column="color" jdbcType="VARCHAR" property="color" /> </resultMap>
然后是domainObjectRenamingRule
該功能和columnRenamingRule的配置基本是一致的。在它的基礎上,我便直接上手。數據庫中有兩張表分別是cyber_Link、cyber_movie。我希望生成的模型是Link和Movie,略去前綴Cyber,配置如下。
<table tableName="cyber%"> <generatedKey column="id" sqlStatement="MySql" identity="true" /> <domainObjectRenamingRule searchString="^cyber_" replaceString="" /> </table>
很意外,生成的模型依舊是按默認的方式分別為CyberLink和CyberMovie。表象是好像配置沒有生效一樣。
於是我找到了源碼中org.mybatis.generator.api.FullyQualifiedTable的這一段進行了調試。
if (domainObjectRenamingRule != null) { Pattern pattern = Pattern.compile(domainObjectRenamingRule.getSearchString()); String replaceString = domainObjectRenamingRule.getReplaceString(); replaceString = replaceString == null ? "" : replaceString; //$NON-NLS-1$ Matcher matcher = pattern.matcher(finalDomainObjectName); finalDomainObjectName = matcher.replaceAll(replaceString); }
發現了domainObjectRenamingRule和columnRenamingRule重命名時機的不同,domainObjectRenamingRule的重名發生在生成了默認實體名之后,如本例中,正常流程應該是cyber_movie -> CyberMovie -> Movie(我配置的正則是按照表前綴開頭的,所以我沒能到這一步)。而columnRenamingRule是發生在生成屬性名之前。
所以上面的配置調整為即可
<table tableName="cyber%"> <generatedKey column="id" sqlStatement="MySql" identity="true" /> <domainObjectRenamingRule searchString="^Cyber" replaceString="" /> </table>