JFinal 生成指定表的Model, 与排除法相反(mysql)

有的时候数据库表太多, 只需要生成指定表的Model, 这时排除法显得有的费劲. 写了如下mysql工具类(其他数据库自行修改sql语句即可)

1、MysqlKit

import java.util.ArrayList;
import java.util.List;
import com.jfinal.plugin.activerecord.Db;
public class MysqlKit {
@SuppressWarnings("unused")
private static String host, ip, port;
private static String databaseName;
private static String table_list_sql = "select table_name as 'TABLE_NAME' from information_schema.tables where table_schema=?";
public static void init(String jdbcUrl) {
String[] arrays = jdbcUrl.split("/");
host = arrays[2];
if (host.contains(":")) {
ip = host.split(":")[0];
port = host.split(":")[1];
} else {
ip = host;
port = "3306";
}
//获取数据库名称
databaseName = arrays[3].substring(0, arrays[3].indexOf("?"));
}
public static String[] getTablesByDatabaseName(String ...tableName) {
List<String> excludedTableList = new ArrayList<>();
List<String> tablesList = Db.query(table_list_sql, databaseName);
System.out.print("全部表: ");
for (String table : tablesList) {
System.out.print("\""+table+"\", ");
if (isExist(table, tableName)) continue;
excludedTableList.add(table);
}
return excludedTableList.toArray(new String[excludedTableList.size()]);
}
private static Boolean isExist(String table, String ...tableName) {
for (int i = 0; i < tableName.length; i++) {
if (table.equals(tableName[i])) return true;
}
return false;
}
}

2、代码生成类

import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.activerecord.generator.Generator;
import com.jfinal.plugin.druid.DruidPlugin;
import com.sojpt.MainConfig;
import com.sojpt.kit.MysqlKit;
import com.sojpt.metabuilder.MysqlSojptMetaBuilder;
/**
 * GeneratorDemo
 */
public class GeneratorDemo {
// 需要生成的表,控制台会打印出全部表,只需把需要的粘贴到下列数组中即可
public static String[] generatorTables = { "dic_log", "dic_popedom", "dic_role", "dic_role_popedom",
"dic_user", "dic_user_role"};
public static DataSource getDataSource() {
Prop prop = MainConfig.jdbcProp;
DruidPlugin dp = new DruidPlugin(prop.get("jdbcUrl"), prop.get("user"), prop.get("password"));
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
dp.start();
arp.start();
return dp.getDataSource();
}
public static void main(String[] args) {
// base model 所使用的包名
String baseModelPackageName = "com.sojpt.model.base";
// base model 文件保存路径
String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/sojpt/model/base";
System.out.println(baseModelOutputDir);
// model 所使用的包名 (MappingKit 默认使用的包名)
String modelPackageName = "com.sojpt.model";
// model 文件保存路径 (MappingKit 与 DataDictionary 文件默认保存路径)
String modelOutputDir = baseModelOutputDir + "/..";
DataSource ds = getDataSource();
// 创建生成器
Generator gernerator = new Generator(ds, baseModelPackageName, baseModelOutputDir,
modelPackageName, modelOutputDir);
// 设置数据库方言
gernerator.setDialect(new MysqlDialect());
// 初始化Mysqlkit
MysqlKit.init(MainConfig.jdbcProp.get("jdbcUrl"));
// 添加不需要生成的表名
gernerator.addExcludedTable(MysqlKit.getTablesByDatabaseName(generatorTables));
// 设置是否在 Model 中生成 dao 对象
gernerator.setGenerateDaoInModel(true);
// 设置是否生成字典文件
gernerator.setGenerateDataDictionary(false);
// 设置需要被移除的表名前缀用于生成modelName。例如表名 "osc_user",移除前缀 "osc_"后生成的model名为 "User"而非
// gernerator.setRemovedTableNamePrefixes("DIC_");
// 生成
gernerator.generate();
}
}


评论区

JFinal

2019-05-31 23:19

有几个同学提到过这个需求,除了上面的办法以外,还可以通过继承 MetaBuilder 并覆盖里头的 isSkipTable 方法,结合一个 List tableList 来存放指定的 tableName 就好

Sohnny

2019-05-31 23:22

@JFinal 这个主要方便之处在于是直接从数据库读表, 并按数组格式打印出来, 需要的直接粘贴, 不需要一个个手写

Sohnny

2019-05-31 23:26

不知道为啥这个富文本框一点java格式,发出来效果全部左对齐了

JFinal

2019-05-31 23:27

@Sohnny 不需要手写 tableName,这个功能不错

山东小木

2019-06-01 00:01

@JFinal @Sohnny 使用Eclipse的同学可以直接安装JBolt插件 想生成谁就选谁 选谁就生成谁。

Sohnny

2019-06-01 01:41

@山东小木 我记得你这个没有记忆功能,每次打开都得重新配置填写一遍,太麻烦。现在完善没?最好能记住上次配置的参数,或者加个配置保存之类的功能。

山东小木

2019-06-01 11:45

@Sohnny 已经很好用

Sohnny

2019-06-01 11:51

@山东小木 没有记忆功能话,对我个人而言来说觉得不好用。因为我用代码的方式实现,每次直接运行就行了。你这个可能对新手帮助比较大, 毕竟有的项目还存在需要代码模板的扩展,用代码实现灵活。

山东小木

2019-06-01 19:45

@Sohnny 现在是选谁就生成谁 每次表结构变化了或者增加了新表 选中需要生成的就生成了 配置保存

热门分享

扫码入社