文档章节

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

Jim_Ai
 Jim_Ai
发布于 2016/01/27 17:25
字数 695
阅读 729
收藏 2

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


© 著作权归作者所有

Jim_Ai
粉丝 3
博文 15
码字总数 7002
作品 0
虹口
部门经理
私信 提问
加载中

评论(4)

Jim_Ai
Jim_Ai 博主

引用来自“JFinal”的评论

另外,model部分既然是项目同时依赖,建议将model部分抽取成一个单独的模块,然后用maven管理起来,那么当数据表结构发生任何变化时,单独生成、升级这个模块,其它模块只需要改一下maven坐标即可极速可靠地完成升级,感谢分享 83
谢谢波总,目前model,baseModel及mappingkit三部分是作为独立项目运行,只依赖于JFinal,通过JFinal Generator自动生成,开发者不需要关心,非常方便。
Jim_Ai
Jim_Ai 博主

引用来自“JFinal”的评论

jfinal 2.2 已经支持分布式环境下无DataSource时使用Model了,只要调用一下 ActiveRecordPlugin.useAsDataTransfer(...)方法即可,方法配备了很多实用参数,用来在分布式不同节点上保持一致性,建议用一下,然后给我个反馈
测试反馈结果如下,在controller中使用getModel()方法会报错,原因在于com.jfinal.core.Injector.java(95-140行)和TypeConverter.java处理依赖于 TableMapping。
JFinal
JFinal
另外,model部分既然是项目同时依赖,建议将model部分抽取成一个单独的模块,然后用maven管理起来,那么当数据表结构发生任何变化时,单独生成、升级这个模块,其它模块只需要改一下maven坐标即可极速可靠地完成升级,感谢分享 83
JFinal
JFinal
jfinal 2.2 已经支持分布式环境下无DataSource时使用Model了,只要调用一下 ActiveRecordPlugin.useAsDataTransfer(...)方法即可,方法配备了很多实用参数,用来在分布式不同节点上保持一致性,建议用一下,然后给我个反馈
无数据源情况下,Controller.getModel(MyModel.class)异常,导致远程传输Model困难。。。

波总,在使用JFinal开发分布式系统时(Web前端没有数据库),想用Model进行远程传输给服务端进行处理。因为Model使用方便,可直接用于页面数据对象,传输给服务端也不需要进行转换,拿来应用...

糊搞
2014/03/28
785
7
jfinal类加载问题

@JFinal 你好,想跟你请教个问题:詹总好,我正在写一个代码生成器,生成的controller和model想自动注册到jfinal里,不需重启中间件,有没有好的办法呢?

首席救火队员
2016/12/23
231
1
JFinal-layui 极速开发企业应用系统-代码器上线

JFinal-layui极速开发企业应用管理系统今天终于迎来了属于自己的社区-琴海森林 JFinal-layui官方社区,社区提供了代码生成器功能,可以定制专属自己的项目代码模板。 琴海森林 JFinal-layui...

琴海森林
04/22
2.4K
5
JFinal-event v2.2.2 发布,支持JFinal 3.5 新版本inject

JFinal-event 2.x 参考Spring 4.2.x中Event的使用方式而生,为JFinal用户带来更多方便。 更新情况: 2018-10-09 v2.2.2 升级到jfinal 3.5 (不兼容老版本)支持新版本inject,升级到java 8优化...

如梦技术
2018/10/09
676
3
关于在非配置类中动态加载数据源并映射model-数据表的请教

你好,@Jfinal ,又要打扰了。 请问如果想连本地数据库,然后在数据库里面存有其他连接信息,那样的话后面这些数据库是要在 之外配,不然配在里面,本地数据库的查询功能还没生效。 我瞎翻j...

yshumk
2015/08/11
135
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部