jfinal是如何实现表与类映射以及字段的映射的呢

今天有朋友在JFinal-bbs群里问起这个问题。那我们来分析一下,jfinal究竟是如何实现表与类映射的呢?

注意:下面的代码示例为JFinal1.9中的源码,注明以排除版本差异

首先,不管你是使用的ActiveRecordPlugin还是使用扒皮的AutoTableBindPlugin或者自己扩展的表绑定插件实质上都执行了ActiveRecordPlugin中的addMapping方法:

public ActiveRecordPlugin addMapping(String tableName, String primaryKey, Class<? extends Model<?>> modelClass) {
	tableList.add(new Table(tableName, primaryKey, modelClass));
	return this;
}

这里主要是绑定tableName,primaryKey(不传默认为id)和modelClass。

大家可以看到这里有个tableList记录这些信息,我们追踪一下该插件start的代码:

public boolean start() {
	if (isStarted)
		return true;
	
	if (dataSourceProvider != null)
		dataSource = dataSourceProvider.getDataSource();
	if (dataSource == null)
		throw new RuntimeException("ActiveRecord start error: ActiveRecordPlugin need DataSource or DataSourceProvider");
	
	if (config == null)
		config = new Config(configName, dataSource, dialect, showSql, devMode, transactionLevel, containerFactory, cache);
	DbKit.addConfig(config);
	
	boolean succeed = TableBuilder.build(tableList, config);
	if (succeed) {
		Db.init();
		isStarted = true;
	}
	return succeed;
}

start上面部分是完成数据源的初始化和config的配置,下面则有个TableBuilder,绑定了一下这个list和数据源的配置信息,我们再次跟踪一下TableBuilder的build方法,来点图片,免得视觉疲劳,嘿嘿。

这里循环了tableList,并调用了doBuild方法来真正完成绑定

我们来看看究竟是构造了一条什么sql,这里拿mysql反应来举例:

public String forTableBuilderDoBuild(String tableName) {
	return "select * from `" + tableName + "` where 1 = 2";
}

这条sql并不会返回结果集,但是我们可以利用ResultSetMetaData从连接中拿到表信息。for循环中再对表的具体字段信息添加到Table信息中储存,完成表字段信息的绑定,整个过程就是这样,比较简单,感兴趣的童鞋可以打上断点走一遍源码!

捐助共勉
版权声明:若无特殊注明,本文皆为原创,转载请保留文章出处。