Mybatis可以自动生成增删改查的sql.xml文件吗
1个回答
展开全部
最近使用到了generator生成代码。主要用来生成DO,DAO,*Mapper.xml。由于仅需要其生成一些基本的公用的sql操作行为(增删改查更一个方法),而且命名也需要自己的规范,所以修改了一些源码记录下来,用于备忘。
使用的版本为1.3.2。主要记录:
1.org/mybatis/generator/api/IntrospectedTable.java类:
calculateJavaClientAttributes方法修改DAO类名;
calculateModelAttributes方法修改DO类名;
calculateXmlAttributes方法修改DAO中方法名和Mapper.xml中的sql标签id。
2.org/mybatis/generator/codegen/mybatis3/javamapper/JavaMapperGenerator.java类:
getCompilationUnits方法修改DAO类中的方法,主要是删除了一个insert方法和一个update方法
3.org/mybatis/generator/codegen/mybatis3/xmlmapper/XMLMapperGenerator.java类:
getSqlMapElement方法修改Mapper.xml中sql,主要是删除了和DAO对应的一个insert和一个update
4.org/mybatis/generator/codegen/mybatis3/xmlmapper/elements/InsertSelectiveElementGenerator.java类:
addElements方法,修改insert sql的生成格式。mysql中如果表主键是自增加的,则每次插入返回自增ID。
[java] view plain copy
//get the auto_increment primary key value
sb.append("<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append(" SELECT LAST_INSERT_ID() AS id ");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("</selectKey>");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("insert into "); //$NON-NLS-1$
4.的补充。经过验证,4是错误的。其实mybatis的generator提供了该方法的可配置性。
[html] view plain copy
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
就会自动生成selectKey标签;
其次4的方式返回值只是成功与否的状态,不是自增主键。只不过采用了这种方式之后自增主键会被mybatis赋给DO,这样可以直接使用DO.getId()得到插入后的主键。
与selectKey标签具有相同效果的还有另外一种方式,这个方式的配置:
[html] view plain copy
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
5.因为generator生成的mapper.xml文件和DAO的java类放在了同级目录。我会一次性生成多个表的,这样粘贴起来很不舒服。所以改了源码,将所有生成的mapper文件放到新建的mapper目录中。
在org.mybatis.generator.api.MyBatisGenerator类中的generate方法中修改:
[java] view plain copy
for (GeneratedXmlFile gxf : generatedXmlFiles) {
projects.add(gxf.getTargetProject());
File targetFile;
String source;
try {
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
if (targetFile.exists()) {
if (gxf.isMergeable()) {
source = XmlFileMergerJaxp.getMergedSource(gxf,
targetFile);
} else if (shellCallback.isOverwriteEnabled()) {
source = gxf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf
.getFileName());
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gxf.getFormattedContent();
}
} catch (ShellException e) {
warnings.add(e.getMessage());
continue;
}
callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, "UTF-8"); //$NON-NLS-1$
}
更改的地方是:
[java] view plain copy
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
这样即可实现。
使用的版本为1.3.2。主要记录:
1.org/mybatis/generator/api/IntrospectedTable.java类:
calculateJavaClientAttributes方法修改DAO类名;
calculateModelAttributes方法修改DO类名;
calculateXmlAttributes方法修改DAO中方法名和Mapper.xml中的sql标签id。
2.org/mybatis/generator/codegen/mybatis3/javamapper/JavaMapperGenerator.java类:
getCompilationUnits方法修改DAO类中的方法,主要是删除了一个insert方法和一个update方法
3.org/mybatis/generator/codegen/mybatis3/xmlmapper/XMLMapperGenerator.java类:
getSqlMapElement方法修改Mapper.xml中sql,主要是删除了和DAO对应的一个insert和一个update
4.org/mybatis/generator/codegen/mybatis3/xmlmapper/elements/InsertSelectiveElementGenerator.java类:
addElements方法,修改insert sql的生成格式。mysql中如果表主键是自增加的,则每次插入返回自增ID。
[java] view plain copy
//get the auto_increment primary key value
sb.append("<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append(" SELECT LAST_INSERT_ID() AS id ");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("</selectKey>");
answer.addElement(new TextElement(sb.toString()));
sb.setLength(0);
sb.append("insert into "); //$NON-NLS-1$
4.的补充。经过验证,4是错误的。其实mybatis的generator提供了该方法的可配置性。
[html] view plain copy
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
就会自动生成selectKey标签;
其次4的方式返回值只是成功与否的状态,不是自增主键。只不过采用了这种方式之后自增主键会被mybatis赋给DO,这样可以直接使用DO.getId()得到插入后的主键。
与selectKey标签具有相同效果的还有另外一种方式,这个方式的配置:
[html] view plain copy
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
5.因为generator生成的mapper.xml文件和DAO的java类放在了同级目录。我会一次性生成多个表的,这样粘贴起来很不舒服。所以改了源码,将所有生成的mapper文件放到新建的mapper目录中。
在org.mybatis.generator.api.MyBatisGenerator类中的generate方法中修改:
[java] view plain copy
for (GeneratedXmlFile gxf : generatedXmlFiles) {
projects.add(gxf.getTargetProject());
File targetFile;
String source;
try {
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
if (targetFile.exists()) {
if (gxf.isMergeable()) {
source = XmlFileMergerJaxp.getMergedSource(gxf,
targetFile);
} else if (shellCallback.isOverwriteEnabled()) {
source = gxf.getFormattedContent();
warnings.add(getString("Warning.11", //$NON-NLS-1$
targetFile.getAbsolutePath()));
} else {
source = gxf.getFormattedContent();
targetFile = getUniqueFileName(directory, gxf
.getFileName());
warnings.add(getString(
"Warning.2", targetFile.getAbsolutePath())); //$NON-NLS-1$
}
} else {
source = gxf.getFormattedContent();
}
} catch (ShellException e) {
warnings.add(e.getMessage());
continue;
}
callback.checkCancel();
callback.startTask(getString(
"Progress.15", targetFile.getName())); //$NON-NLS-1$
writeFile(targetFile, source, "UTF-8"); //$NON-NLS-1$
}
更改的地方是:
[java] view plain copy
//make the xml file location changed
File mapDirec = new File(directory.getAbsolutePath()+"/mapper");
if(!mapDirec.exists()){
mapDirec.mkdir();
}
targetFile = new File(mapDirec, gxf.getFileName());
这样即可实现。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询