解决jfinal 3.0+ 使用gernerator工具生成sqlserver对象报错问题

1、确定数据库连接信息配置文件格式正确

sqlserver正确格式(亲测)

jdbcUrl =jdbc:sqlserver://localhost:1433;DatabaseName=WineERP

driverClass =com.microsoft.sqlserver.jdbc.SQLServerDriver

user =sa

password =1

 

2、确定项目中添加正确的sqlserver连接驱动

    驱动名称:sqljdbc4.jar

    下载sqljdbc4.jar包

    在有sqljdbc4.jar包的文件夹下,通过shift+右键的方式--》此处打开命令窗口,然后执行以下maven命令

    mvn install:install-file -Dfile=sqljdbc4.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0

    进入本地maven仓库目录下的安装该jar包目录下

    我的是 C:\Users\gm\.m2\repository\com\microsoft\sqlserver\sqljdbc4\4.0

    将sqljdbc4.jar改名为sqljdbc4-4.0.jar

3、自己实现一个MetaBuilder

package com.ssjy.consult.common.model;
 
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.dialect.SqlServerDialect;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;
 
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
 
/**
 * Created by wendell on 2017/1/25.
 */
public class _SqlMetaBuilder extends MetaBuilder {
    protected Set<String> containTables = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    public _SqlMetaBuilder(DataSource dataSource) {
        super(dataSource);
    }
 
    @Override
    protected ResultSet getTablesResultSet() throws SQLException {
        setDialect(new SqlServerDialect());
        String schemaPattern = dialect instanceof OracleDialect ? dbMeta.getUserName() : null;
        ResultSet rs = dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE"});
 
        return rs;
    }
    @Override
    protected void buildTableNames(List<TableMeta> ret) throws SQLException {
        ResultSet rs = getTablesResultSet();
        while (rs.next()) {
            String schem = rs.getString("TABLE_SCHEM");
            String tableName = rs.getString("TABLE_Name");
 
            if (schem.equals("sys")) {
                System.out.println("Skip table :" + tableName + ",这是Sqlserver生成的表");
                continue;
            }
            if (excludedTables.contains(tableName)) {
                System.out.println("Skip table :" + tableName);
                continue;
            }
            if (isSkipTable(tableName)) {
                System.out.println("Skip table :" + tableName);
                continue;
            }
            TableMeta tableMeta = new TableMeta();
            tableMeta.name = tableName;
            tableMeta.remarks = rs.getString("REMARKS");
 
            tableMeta.modelName = buildModelName(tableName);
            tableMeta.baseModelName = buildBaseModelName(tableMeta.modelName);
            ret.add(tableMeta);
        }
        rs.close();
    }
 
    protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException {
        ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name);
 
        String primaryKey = "";
        int index = 0;
        while (rs.next()) {
            if (index++ > 0) {
                primaryKey += ",";
            }
            primaryKey += rs.getString("COLUMN_NAME");
        }
        if (StrKit.isBlank(primaryKey)) {
            throw new RuntimeException("primaryKey required by active record pattern,Table Name:" + tableMeta.name);
        }
        tableMeta.primaryKey = primaryKey;
        rs.close();
    }
}

 然后在_JFinalDemoGenerator.java里设置

// 设置数据库方言
gen.setDialect(new SqlServerDialect());
gen.setMetaBuilder(new _SqlMetaBuilder(getDataSource()));

然后就OK了。

 

 

其实实现原理很简单,这个BUG的原因是sqlserver会生成大量的系统表,里边不带主键ID,所以生成器就出问题了,重点就是过滤掉系统表

if (schem.equals("sys")) {
System.out.println("Skip table :" + tableName + ",这是Sqlserver生成的表");
continue;
}

 

转载于:https://my.oschina.net/dong706/blog/1635126

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值