文档章节

JFinal 自动探测Model 注册插件 AutoScanPlugin

绝望的八皮
 绝望的八皮
发布于 2012/07/18 23:07
字数 598
阅读 1.2K
收藏 9

「深度学习福利」大神带你进阶工程师,立即查看>>>

本插件已经整合重构,新版本自动注册model插件请看这个博客

http://my.oschina.net/b1412/blog/68083

 

--------------------------------------------------------------------------------

在ssh等框架中有不少自动扫包注册的功能,当我们类较多的时候可以减少不少的工作。

根据这个思路写了个简单的自动扫包注册Model的插件。
扫描classes下面所以继承了Model的类注册到ActiveRecordPlugin中。数据库表名默认采用骆峰。
比如MobileBind.Java则映射到mobieBind表.另外也可以选择全部大写和全部小写的策略.


/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		DruidPlugin druidPlugin = new DruidPlugin.DruidBuilder(getProperty("url"), getProperty("username"),
				getProperty("password")).build();
		me.add(druidPlugin);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		arp.setShowSql(true);
      	        SqlReporter.setLogger(true);
		AutoScanPlugin autoScanPligin = new AutoScanPlugin(arp,TableNameStyle.LOWER);
                me.add(autoScanPligin);  //自动扫包注册model插件要在ActiveRecordPlugin之前注册         	
                me.add(arp);	      
       }


package com.jfinal.plugin.autoscan;
import java.io.File;
import java.net.URL;
import java.util.List;

import com.cloud.pxxt.Config;
import com.jfinal.plugin.IPlugin;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.util.StringKit;

/**
 *  自动扫包
 */
public class AutoScanPlugin implements IPlugin {
	private ActiveRecordPlugin arp;

	private TableNameStyle tableNameStyle;
	
	public AutoScanPlugin(ActiveRecordPlugin arp) {
		this.arp = arp;
	}
	public AutoScanPlugin(ActiveRecordPlugin arp,TableNameStyle tableNameStyle) {
		this.arp = arp;
		this.tableNameStyle = tableNameStyle;
	}

	@Override
	public boolean start() {
		try {
			registModel(AutoScanPlugin.class.getResource("/").getFile(), "classes/");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return true;
	}

	@Override
	public boolean stop() {
		return true;
	}

	private void registModel(String fileDir, String pre) throws Exception {
		List<File> classList = FileSearcher.findFiles(fileDir, "*.class");
		for (File classFile : classList) {
			String className = getClassName(classFile, pre);
			Class clazz = Class.forName(className);
			if (clazz.getSuperclass() == Model.class) {
				String tableName = clazz.getSimpleName();
				if(tableNameStyle==TableNameStyle.UP){
					tableName =tableName.toUpperCase();
				}else if(tableNameStyle==TableNameStyle.LOWER){
					tableName =tableName.toLowerCase();
				}else{
					tableName =StringKit.firstCharToLowerCase(tableName);

				}
				arp.addMapping(tableName, clazz);
			}
		}
	}

	private static String getClassName(File classFile, String pre) {
		String objStr = classFile.toString().replaceAll("\\\\", "/");
		String className;
		className = objStr.substring(objStr.indexOf(pre)+pre.length(),objStr.indexOf(".class"));
		if (className.startsWith("/")) {
			className = className.substring(className.indexOf("/")+1);
		}
		return className.replaceAll("/", ".");
	}

}

package com.jfinal.plugin.autoscan;

public enum TableNameStyle {
	UP,LOWER
}

 
 
  其他还有些自动探测的方法,比如我们约定Model对象都用xxModel.java那么可以在探测的时候直接根据这个文件名规则找到所以Model.
目前这种方式是加载类根据该类的父类是否为Mode作为条件.代价要大一点.

 一些问题.,这样自动探测的表名映射规则是否够用,如果数据库表明不是很规则的可能需要再扩展几个根据类名生存数据库表明的策略,比如oracle数据库很多带下划线的命名方式.
另外这种方式还无法探测jar包里面的Model.以后再实现.
 
  以上给大家提供个思路,请高手不惜赐教.

 虽然JFinal本身已经够简单代码量少了,不过我们还可让写的代码更少一些~



 
上一篇: JFinal QuartzPlugin
下一篇: JFinal SqlInXmlPlugin
绝望的八皮

绝望的八皮

粉丝 392
博文 22
码字总数 10505
作品 2
其它
CTO(技术副总裁)
私信 提问
加载中
此博客有 14 条评论,请先登录后再查看。
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
8K
8
5分钟 maven3 快速入门指南

前提条件 你首先需要了解如何在电脑上安装软件。如果你不知道如何做到这一点,请询问你办公室,学校里的人,或花钱找人来解释这个给你。 不建议给Maven的服务邮箱来发邮件寻求支持。 安装Mav...

fanl1982
2014/01/23
1.2W
8

没有更多内容

加载失败,请刷新页面

加载更多

Java8之Optional扫盲

在java8中,引入Optional类,来缓解对每次都需要变量判空的尴尬。Optional在一定程度上,能够减少判空产生的级联深度,运用lambda表达式,也能够在一定程度上简化代码。 创建一个Optional 1、...

osc_lg0msmnd
15分钟前
0
0
YOLOv4(darknet版)后处理:显示置信度、保存检测框的内容到本地

目录 显示置信度 改变检测框的粗细 保存检测框的内容到本地 1.修改detector.c 2.修改image.h和image.c 3.修改image_opencv.h和image_opencv.cpp 之前写了一篇使用YOLOv4训练的博客:https:/...

osc_7slii3nj
16分钟前
0
0
接口和抽象类的区别(绝对经典)

A:成员的区别 抽象类: 构造方法:有构造方法,用于子类实例化使用。 成员变量:可以是变量,也可以是常量。 成员方法:可以是抽象的,也可以是非抽象的。 接口: 构造方法:没有构造方法 成...

osc_caajiue7
17分钟前
0
0
stm32开发3D打印机(一)——介绍(已完成)

如何运用stm32开发3D打印机 首先介绍一下我是如何开发的 这是我第一次写博客,关于stm32开源3D打印机我将在今后的一年里陆续写完 首先介绍一下本人,写这篇文章是于2020年8月开始,同时本人现...

osc_s6yenydw
18分钟前
0
0
Java学习-详谈最高层父类-Object类

目录 1、Object类 2、Object类中的主要方法 2.1对象相等判断方法:equals() 2.2 hashCode()方法 2.3取得对象信息的方法:toString() 4、instanceof操作符 1、Object类 Object类是所有J...

osc_ptcuqdug
19分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部