最近在进行JFinal与Dubbo架构设计,发现在Consumer层无法使用model进行数据传输,需要将所有Model所需要的数据先手动注册到TableMapping中。由于数据结构可能经常发生变化,配合JFinal Generator,完成了Model手动注册到TableMapping中的代码生成器。
1、初始化或数据库有变动时,运行一下ToolConsumerTableInit.java进行代码自动生成
2、将生成在D:\TableInit.txt中的代码拷贝到TableInitKit.java的init()方法中
3、通过JFinal自带的GeneratorDemo.java生成对应的model。
4、在配置文件ConsumerConfig.java中加入如下方法
public void afterJFinalStart() {
TableInitKit.init();
}
直接上代码
ToolConsumerTableInit.java
package com.platform.tools; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; import javax.sql.DataSource; import com.jfinal.plugin.activerecord.dialect.PostgreSqlDialect; import com.jfinal.plugin.activerecord.generator.ColumnMeta; import com.jfinal.plugin.activerecord.generator.MetaBuilder; import com.jfinal.plugin.activerecord.generator.TableMeta; import com.jfinal.plugin.druid.DruidPlugin; /** * 数据库有变动时,运行一下进行代码自动重构 * * @author Jim * */ public class ToolConsumerTableInit { public static void main(String[] args) throws IOException { //设置 MetaBuilder MetaBuilder metaBuilder = new MetaBuilder(getDataSource()); //设置数据库方言 metaBuilder.setDialect(new PostgreSqlDialect()); List<TableMeta> tableMetas = metaBuilder.build(); if (tableMetas.size() == 0) { System.out.println("TableMeta 数量为 0,不生成任何文件"); return ; } //文件内容 StringBuilder sb = new StringBuilder(); //循环表 for (TableMeta tableMeta : tableMetas){ sb.append("Map<String, Class<?>> columnMap = new HashMap<String, Class<?>>();\r\n"); //循环列 for (ColumnMeta columnMeta : tableMeta.columnMetas) { //生成格式为columnMap.put("id", java.lang.String.class); sb.append("columnMap.put(\""); sb.append(columnMeta.name); sb.append("\", "); sb.append(columnMeta.javaType); sb.append(".class);\r\n"); } //手动注册表,生成格式为TableInitKit.init("blog", "id", Blog.class, columnMap); sb.append("init(\""); sb.append(tableMeta.name); sb.append("\", \""); sb.append(tableMeta.primaryKey); sb.append("\", "); sb.append(tableMeta.modelName); sb.append(".class, columnMap);\r\n"); sb.append("\r\n"); //提醒该表未设计primaryKey if("".equals(tableMeta.primaryKey)){ System.out.println(tableMeta.modelName + "表primaryKey未设置!!!"); } } //写入文件 wirtToFile(sb); } /**取得数据库连接信息 * @author Jim * @return DataSource */ public static DataSource getDataSource() { DruidPlugin druidPlugin = new DruidPlugin( "jdbc:postgresql://127.0.0.1:5432/postgres", "postgres", "postgres","org.postgresql.Driver"); druidPlugin.start(); return druidPlugin.getDataSource(); } /**写入文件 * @author Jim * @return DataSource */ protected static void wirtToFile(StringBuilder ret) { FileWriter fw = null; try { File f = new File("D:\\TableInit.txt"); fw = new FileWriter(f); fw.write(ret.toString()); } catch (IOException e) { throw new RuntimeException(e); } finally { if (fw != null) try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
TableInitKit.java
package com.jfinal.plugin.activerecord; import java.util.HashMap; import java.util.Map; import com.platform.mvc.model.Blog; public final class TableInitKit { /** * 此处放入ToolConsumerTableInit.java自动生成的代码 * @author Jim */ public static void init() { //可通过工具类ToolConsumerTableInit.java自动生成-Start Map<String, Class<?>> columnMap = new HashMap<String, Class<?>>(); columnMap.put("id", java.lang.String.class); columnMap.put("title", java.lang.String.class); columnMap.put("content", java.lang.String.class); init("blog", "id", Blog.class, columnMap); //可通过工具类ToolConsumerTableInit.java自动生成-End } /** * 在JFinal的Config中,将所有Model所需要的数据先手动注册到TableMapping中, * 绕过ActiveRecordPlugin启动时通过数据库映射表结构到TableMapping。 * @author Jim */ public static void init(String tableName, String primaryKey, Class<? extends Model<?>> modelClass, Map<String, Class<?>> attrTypeMapTypeMap) { Table table = new Table(tableName, primaryKey, modelClass); table.setColumnTypeMap(attrTypeMapTypeMap); TableMapping.me().putTable(table); } }
TableInit.txt
Map<String, Class<?>> columnMap = new HashMap<String, Class<?>>(); columnMap.put("id", java.lang.String.class); columnMap.put("title", java.lang.String.class); columnMap.put("content", java.lang.String.class); init("blog", "id", Blog.class, columnMap);