mybatis3 generator 生成代码的规范修改

来源:互联网 发布:双色球公式计算法2017 编辑:程序博客网 时间:2024/06/01 10:24

      最近使用到了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。

 //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提供了该方法的可配置性。

<generatedKey column="id" sqlStatement="MySql" identity="true"/>
就会自动生成selectKey标签;

其次4的方式返回值只是成功与否的状态,不是自增主键。只不过采用了这种方式之后自增主键会被mybatis赋给DO,这样可以直接使用DO.getId()得到插入后的主键。

与selectKey标签具有相同效果的还有另外一种方式,这个方式的配置:

<generatedKey column="id" sqlStatement="JDBC" identity="true"/>

        5.因为generator生成的mapper.xml文件和DAO的java类放在了同级目录。我会一次性生成多个表的,这样粘贴起来很不舒服。所以改了源码,将所有生成的mapper文件放到新建的mapper目录中。

在org.mybatis.generator.api.MyBatisGenerator类中的generate方法中修改:

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 changedFile 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$}

更改的地方是:

//make the xml file location changedFile mapDirec = new File(directory.getAbsolutePath()+"/mapper");if(!mapDirec.exists()){mapDirec.mkdir();}targetFile = new File(mapDirec, gxf.getFileName());

这样即可实现。

0 0
原创粉丝点击