您的位置:首页 > 数据库

JFinal2.2自动生成SQLServer2012其中的一些bug

2016-01-21 16:42 323 查看
好奇心驱使之下,研究了一下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("`", "");以解燃眉之急,

最后,大神们看见之后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: