mybatis3 generator 生成代码的规范修改

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

更改的地方是:

//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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值