mybatis-generator 简介
Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们可以利用Mybatis-Generator来帮我们自动生成文件。项目中常用的:
StudentExample example = new StudentExample();
StudentExample.Criteria criteria = example.createCriteria();
deleteByExample
insert
insertSelective
selectByExample ..等等诸如此类的方法,均是通过mybatis-genenrator可以自动生成的 使得开发起来很方便。
mybatis-generator 生成的sql xml几乎涵盖了单表的所有增删改查方法。很方便
mybatis-generator 问题
(mybatis-generator默认合并指的是 123 , 234 合并完 是 123234,而我们需要的结果是1234)
1 生成一次 CourseMapper.java,CourseMapper.xml等文件。
2 现在需要加个批量插入方法,在CouseMapper.java里加
public int batchInsert(List<Course> list);
在CourseMapper.xml里加
<insert id="batchInsert" parameterType="cc.gukeer.smartBoard.persistence.entity.Course">
your sql
</insert>
3 现在数据库加了个字段a,需要对文件再次生成 我们发现,xml里面,updateByPrimaryKey 这样的方法再次生成了一次,而且CourseMapper.java里 的batchInsert 这个方法已经没有了。之前写的代码也就被覆盖了或者出现了问题。我们必须得回滚。。
4 为了解决这个问题,我们不得不扩展 CourseMapper.xml
写 A_CourseMapper.xml 对应 CourseMapper.xml
写 A_CourseMapper.xml 对应 CourseMapper.xml
并把我们的批量方法写到A_***里面,这样再次生成就不会被覆盖了。那么问题来了:
从图中可以看到,这无疑使得我们的文件更繁多,维护更加复杂。
问题解决-xml合并
出现这个问题的原因,我们主要来看一下generator的源码:
org.mybatis.generator.api.MyBatisGenerator 的generate方法,是生成文件的一个入口。
for (GeneratedXmlFile gxf : this.generatedXmlFiles){
this.projects.add(gxf.getTargetProject());
File targetFile;
String source;
try{
File directory = this.shellCallback.getDirectory(gxf.getTargetProject(), gxf.getTargetPackage());
targetFile = new File(directory, gxf.getFileName());
if (targetFile.exists()){
String source;
if (gxf.isMergeable()){
source = XmlFileMergerJaxp.getMergedSource(gxf, targetFile);
}else if (this.shellCallback.isOverwriteEnabled()){
String source = gxf.getFormattedContent();
this.warnings.add(Messages.getString("Warning.11", targetFile.getAbsolutePath()));
}else{
String source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf.getFileName());
this.warnings.add(Messages.getString("Warning.2", targetFile.getAbsolutePath()));
}
}
其中 有对gxf(GeneratedXmlFile) 是否合并判断,如果合并true,将新旧xml通过这个方法合并取合并得到的结果字符串,写到新的文件中。 XmlFileMergerJaxp.getMergedSource
XmlFileMergerJaxp.getMergedSource 部分代码如下:
DocumentType newDocType = newDocument.getDoctype();
...
List<Node> nodesToDelete = new ArrayList();
NodeList children = ex