20. 代码生成
20.1. 生成pojo 和 md文件
beetsql支持调用SQLManager.gen… 方法生成表对应的pojo类,如:
SQLManager sqlManager = new SQLManager(style,loader,cs,new DefaultNameConversion(), new Interceptor[]{new DebugInterceptor()});
//sql.genPojoCodeToConsole("userRole"); 快速生成,显示到控制台
// 或者直接生成java文件
GenConfig config = new GenConfig();
config.preferBigDecimal(true);
config.setBaseClass("com.test.User");
sqlManager.genPojoCode("UserRole","com.test",config);
生成的路径位于工程的scr目录下,beetlsql自动判断是传统java项目还是maven项目,以使得生成的代码和sql放到正确的位置上。你也可以通过调用GenKit.setSrcPathRelativeToSrc 来设置代码生成路径,调用setResourcePathRelativeToSrc来设置生成的sql文件路径
config 类用来配置生成喜好,目前支持生成pojo是否继承某个基类, 是否用BigDecimal代替Double,是否采用Date而不是Timestamp来表示日期,是否是直接输出到控制台而不是文件等 生成的代码如下:
package com.test;
import java.math.*;
import java.sql.*;
public class UserRole extends com.test.User{
private Integer id;
/* 数据库注释 */
private String userName;
}
也可以自己设定输出模版,通过GenConfig.initTemplate(String classPath),指定模版文件在classpath 的路径,或者直接设置一个字符串模版 GenConfig.initStringTemplate. 系统默认的模版如下:
package ${package};
${imports}
/*
* ${comment}
* gen by beetsql ${date(),"yyyy-MM-dd"}
*/
public class ${className} ${!isEmpty(ext)?"extends "+ext} {
@for(attr in attrs){
@if(!isEmpty(attr.comment)){
//${attr.comment}
@}
private ${attr.type} ${attr.name} ;
@}
}
如果你需要给beetl模板注册函数等扩展,可以在生成sqlManager.genPojoCode之前,先注册扩展函数
SourceGen.gt.registerFunction("xxx",yourFunction)
这样就可以再代码模板里使用扩展函数了
注意,GenConfig构造函数期望的是一个classpath路径,并非文件路径
20.2. 生成更多的代码
可以实现MapperCodeGen的genCode接口,然后添加到 GenConfig里,这样再生成代码后,也会调用自定义的MapperCodeGen来生成更多代码。如系统内置的生成Mapper的代码
MapperCodeGen mapper = new MapperCodeGen("com.dao");
config.codeGens.add(mapper);
sql.genPojoCodeToConsole("user", config);
这样,除了生成pojo代码外,还生成mapper代码,内置的mapper代码实现如下,供参考
public class MapperCodeGen implements CodeGen {
String pkg = null;
public MapperCodeGen(){
}
public MapperCodeGen(String pkg){
this.pkg = pkg;
}
public static String mapperTemplate="";
static {
mapperTemplate = GenConfig.getTemplate("/org/beetl/sql/ext/gen/mapper.btl");
}
@Override
public void genCode(String entityPkg, String entityClass, TableDesc tableDesc,GenConfig config,boolean isDisplay) {
if(pkg==null){
pkg = entityPkg;
}
Template template = SourceGen.gt.getTemplate(mapperTemplate);
String mapperClass = entityClass+"Dao";
template.binding("className", mapperClass);
template.binding("package",pkg);
template.binding("entityClass", entityClass);
String mapperHead = "import "+entityPkg+".*;"+SourceGen.CR;
template.binding("imports", mapperHead);
String mapperCode = template.render();
if(isDisplay){
System.out.println();
System.out.println(mapperCode);
}else{
try {
SourceGen.saveSourceFile(GenKit.getJavaSRCPath(), pkg, mapperClass, mapperCode);
} catch (IOException e) {
throw new RuntimeException("mapper代码生成失败",e);
}
}
}
}