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

好奇心驱使之下,研究了一下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("`", "");以解燃眉之急,

最后,大神们看见之后,有什么好的想法,欢迎评论,我是小白,勿喷,轻虐!!!!

你可能感兴趣的:(JFinal2.2自动生成SQLServer2012其中的一些bug)