好奇心驱使之下,研究了一下jfinal自动生成代码模块,由于本人现在的项目中用到了sqlserver2012,所以当我用官网下载下来的demo生成的时候发现对sqlserver2012,还是有一些bug的,现在贴出来,有什么不对的,请大神们轻虐!!
第一:我也是在查询资料之后( 原创地址:http://www.oschina.net/question/2276614_2147333),重写了一些代码,由于我只需要自己创建的表,所以添加用户名“dbo”,这样在循环遍历的时候,集合中就可以只放自己创建的表了
gernerator.setMetaBuilder(new SqlserverMetaBuilder(getDataSource(),true,"dbo"));
第二:我把下面的代码贴出来SqlserverMetaBuilder类
package com.cpa.generator;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;
import javax.sql.DataSource;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.ColumnMeta;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;
public class SqlserverMetaBuilder extends MetaBuilder {
// 是否将不带前缀的表,加入的生成队列 默认true,就是所有表都会自动生成
private boolean flag = true;
//数据库用户名
private String user = "";
public SqlserverMetaBuilder(DataSource dataSource) {
super(dataSource);
// TODO Auto-generated constructor stub
}
public SqlserverMetaBuilder(DataSource dataSource, boolean flag,String user) {
super(dataSource);
this.flag = flag;
this.user = user;
}
protected void buildTableNames(List<TableMeta> ret) throws SQLException {
ResultSet rs = dbMeta.getTables(conn.getCatalog(), null, null,
new String[] { "TABLE"});
while (rs.next()) {
String tableName = "";
String tableSchem = rs.getString("TABLE_SCHEM");
if (user.equalsIgnoreCase(tableSchem)) {
tableName = rs.getString("TABLE_NAME");
}
if (excludedTables.contains(tableName)) {
System.out.println("Skip excluded table :" + tableName);
} else {
TableMeta tableMeta = new TableMeta();
tableMeta.name = tableName;
tableMeta.remarks = rs.getString("REMARKS");
boolean tempFlag = false;
// 移除表名前缀仅用于生成 modelName、baseModelName。tableMeta.name 表名自身不受影响
if (removedTableNamePrefixes != null) {
for (String prefix : removedTableNamePrefixes) {
if (tableName.startsWith(prefix)) {
tableName = tableName.replaceFirst(prefix, "");
tempFlag = true;
break;
}
}
}
if ((flag || tempFlag)&&!tableName.isEmpty()) {
tableMeta.modelName = StrKit.firstCharToUpperCase(StrKit
.toCamelCase(tableName));
tableMeta.baseModelName = "Base" + tableMeta.modelName;
ret.add(tableMeta);
}
}
}
rs.close();
}
protected void buildColumnMetas(TableMeta tableMeta) throws SQLException {
String sql = dialect.forTableBuilderDoBuild(tableMeta.name);
sql = sql.replaceAll("`", "");
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
for (int i=1; i<=rsmd.getColumnCount(); i++) {
ColumnMeta cm = new ColumnMeta();
cm.name = rsmd.getColumnName(i);
String colClassName = rsmd.getColumnClassName(i);
String typeStr = typeMapping.getType(colClassName);
if (typeStr != null) {
cm.javaType = typeStr;
}
else {
int type = rsmd.getColumnType(i);
if (type == Types.BINARY || type == Types.VARBINARY || type == Types.BLOB) {
cm.javaType = "byte[]";
}
else if (type == Types.CLOB || type == Types.NCLOB) {
cm.javaType = "java.lang.String";
}
else {
cm.javaType = "java.lang.String";
}
}
// 构造字段对应的属性名 attrName
cm.attrName = buildAttrName(cm.name);
tableMeta.columnMetas.add(cm);
}
rs.close();
stm.close();
}
}
这里我重写了两个方法buildTableNames和buildColumnMetas
重写第一个方法是因为要获取某个用户下的表,这样不会把系统表也创建出来;
重写第二个方法是因为不知道为什么String sql = dialect.forTableBuilderDoBuild(tableMeta.name);这个sql出来之后,是这个样子的:select * from `表名` where 1 = 2,带了两个中文符号,导致后面查询异常,由于找不到原因,我就把中文符号替换了,sql = sql.replaceAll("`", "");以解燃眉之急,
最后,大神们看见之后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!