JFinal Model手动注册到TableMapping中的代码生成器

最近在进行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);


你可能感兴趣的:(JFinal Model手动注册到TableMapping中的代码生成器)