代码生成工具的实现思路

1.利用 JDBC中的 ResultSetMetaData 和 DatabaseMetaData 来读取表字段的相关信息


DataSource dataSource = context.getBean("dataSource", DataSource.class);
Connection conn = dataSource.getConnection();
List<Column> lsColumns = new ArrayList<Column>(10);
PreparedStatement stmt = conn.prepareStatement("select * from "+tableName+" where 1=0 ");
ResultSet resultSet = stmt.executeQuery();
ResultSetMetaData rsmd = resultSet.getMetaData();
int n = rsmd.getColumnCount();
for (int i = 1; i <= n; i++)
{
String colName = rsmd.getColumnName(i);
String fieldName = StringUtil.toBeanPatternStr(colName);
Column column = new Column();
column.setName(colName) ;
column.setJavaName(fieldName) ;
column.setDataType(rsmd.getColumnClassName(i));
column.setPrecision(String.valueOf(rsmd.getPrecision(i)));
column.setScale( String.valueOf(rsmd.getScale(i)) );
column.setLength( String.valueOf(rsmd.getColumnDisplaySize(i)));
column.setNullable(String.valueOf("1".equals(rsmd.isNullable(i))));

//获取列注释
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getColumns(null, null, tableName, null);
while (rs.next()) {
if (colName.equals(rs.getString("COLUMN_NAME")))
column.setComments(rs.getString("REMARKS"));
}
//获取主键列
ResultSet rs2 = dbmd.getPrimaryKeys(null, null, tableName);
while (rs2.next()) {
if (colName.equals(rs2.getString("COLUMN_NAME")))
column.setColumnKey("TRUE");
}


2.讲表字段相关信息放入模板引擎的上下文中,根据模板内容生成JAVA文件;


Velocity.addProperty("file.resource.loader.path", getClassPath()
+ tmplDir);
Template template = Velocity.getTemplate(tmplFile, encoding);
VelocityContext tmplContext = new VelocityContext(context);
FileUtil.createFile(absolutePath);
PrintWriter writer = new PrintWriter(
new FileOutputStream(absolutePath), true);
template.merge(tmplContext, writer);
writer.flush();
writer.close();


3.tmplFile模板文件的内容如下:


#if($pkResult.size()>1)
@EmbeddedId
#else
@Id
@Column(name = "$pkResult.get(0).name" )
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="${TABLE_NAME}_SEQ")
#end
private ${keyType} ${keyVar} ;

#foreach($prop in $columnResult)
#set ($fieldName = ${prop.javaName} )
#set ($fieldType = $prop.dataType )
@Column(name = "${prop.name}" )
private $fieldType $fieldName ;

#end


public ${keyType} get${KeyFieldUpper} () {
return ${keyVar};
}

public void set${KeyFieldUpper} (${keyType} ${keyVar}) {
this.${keyVar} = ${keyVar};
}

#foreach($prop in $columnResult)
#set ($fieldName = ${prop.javaName} )
#set ($fieldType = $prop.dataType )
#set ($innerFieldUpper = $stringUtil.capitalize($fieldName) )
public $fieldType get$innerFieldUpper () {
return $fieldName;
}
public void set$innerFieldUpper ($fieldType $fieldName) {
this.$fieldName = $fieldName;
}
#end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值