JFinal3.0 使用 MS Sql Server

原来我一直都没有分享上来...

使用代码生成的时候发现报错,在俱乐部得到Jfinal作者的帮助,找了jdbc的资料终于可以生成了,需要自己实现一个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();
    }
}

然后在_Generator里设置

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

于是就可以使用了

评论区

JFinal

2017-03-02 12:21

能否在分享中添加上具体解决了哪一个问题,或哪一个异常。 这个分享非常重要,很多人碰到过 sql server 生成器使用的异常,感谢分享

Sigatsu

2017-03-02 14:27

哇!我昨天用sqlserver生成器,一直出错。昨天晚上弄好了,你就上传了,好气呀。
我的方法大概和你一样,getTableResultSet()中不取view, buildTableNames()时,跳过sys

wendell620

2017-03-02 17:05

@JFinal 主要的异常原因是sqlserver会生成大量的系统表,里边不带主键ID,所以生成器就出问题了,重点就是过滤掉系统表
if (schem.equals("sys")) {
System.out.println("Skip table :" + tableName + ",这是Sqlserver生成的表");
continue;
}

wendell620

2017-03-02 17:06

@Sigatsu 是的啊,我年前都写好了,但是那天太晚了,群主说让分享我分享不上就忘记了...

wendell620

2017-03-02 17:10

@Sigatsu 对,不能取VIEW,你在俱乐部一问群主直接就能指出问题所在的

JFinal

2017-03-02 20:14

@wendell620 非常之好,这个贴子我收藏一下,后面有人碰到问题贴个 url 就打完收枪,感谢你的分享

happyboy

2017-03-06 14:04

一直没怎么用代码生成器。

ultra_hqj

2017-03-07 18:08

牛逼!正在 找答案

wwmmddz

2017-03-10 11:44

对于sqlserver 中 date 和 datetime 的处理 在jfinal中用什么类对于比较好? 楼主试过没有 我调试了2天java.sql.date 和 java.sql.timestamp一直调不通 保存的时候一直报 varchar转datetime超过长度限制的错误

暖暖的阳光

2017-03-24 21:18

非常感谢

anewboy

2017-04-28 09:09

非常感谢!!!

ihss23

2017-10-19 14:00

@wendell620 ,求分享一下连接MSSQL的代码。我的一直报错:Can't find bundle for base name com.microsoft.sqlserver.jdbc.SQLServerResource, locale en_US

ihss23

2017-10-19 14:05

data.jdbcUrl=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=osm
#;integratedSecurity=true
data.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
data.user=sa
data.password=-----

wendell620

2017-10-19 14:41

@ihss23 #sqlserver数据库连接
msjdbcUrl=jdbc:sqlserver://127.0.0.1:1433;instance=sql2005;DatabaseName=ConsultDb
msuser=sa
mspassword=----
msdevMode=true

ihss23

2017-10-19 15:11

@wendell620 多谢。虽然还不行。可能是我的是2016.JAR包有不同。

wendell620

2017-10-19 15:19

@ihss23 你在俱乐部群里么?我可以把包发给你

wendell620

2017-10-19 15:21

@ihss23 链接: https://pan.baidu.com/s/1c1MKFq4 密码: budn 可以去这里下载下试试

ihss23

2017-10-20 14:43

@wendell620,我不在群里.非常感谢.

124653847atqq.com

2018-07-10 14:47

如果是仅仅过滤表名的话 是不是在_SqlMetaBuilder类中通过覆盖protected boolean isSkipTable(String tableName) 这个就可以了?

阿秀

2018-09-20 15:46

利害

狗狗

2018-10-12 14:52

非常感谢,棒棒