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;
}