在任何框架中快速使用jfinal ActiveRecord

在非jfinal的项目中,如果想使用jfinal的ActiveRecord怎么办?毕竟用起来那么爽。下面是个人总结的几个方法。

方法1:jfinal标准用法

<filter>
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.JFinalFilter</filter-class>
    <init-param>
    	<param-name>configClass</param-name>
    	<param-value>com.demo.common.DemoConfig</param-value>
    </init-param>
</filter>
	
<filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/jf/*</url-pattern>
</filter-mapping>

虽然当前不是jfinal的项目,但是你完全可以把jfinal的核心过滤器配上,这样项目启动后,jfinal的ActiveRecord也就能用了。注意,如果你仅仅是想使用ActiveRecord,那么过滤器中filter-mapping可以不用配置,就算配置,你也别配置成/*了。

方法2:单独触发ActiveRecord的初始化

package common.utils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.Engine;

/**
 *@author happyboy
 *@date 2016年5月18日 下午2:29:33
 */
public class DbUtil {
	
	/** 记录是否已经初始化了 */
	public static boolean is_init = false;
	
	/** 数据库整体连接情况 */
	public static boolean is_conn = false;
	
	public static void configEngine(ActiveRecordPlugin arp){
		//设置之后可以直接在sql文件中使用isBlank、notBlank等命令
		Engine me = arp.getSqlKit().getEngine();
		me.addSharedMethod(new com.jfinal.kit.StrKit());		
	}
	
	public static void init(){
		if(is_init){
		    return;
		}
		
		//System.out.println("------数据库初始化------");
		Properties properties = new Properties();
		try {
			//配置文件在src下
			InputStream is = DbUtil.class.getResourceAsStream("/jdbc.properties");
			properties.load(is);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		/** -----第一个数据源配置开始----- */
		String alias = "ds1";
		String url = properties.getProperty("jdbc.url");
		String user = properties.getProperty("jdbc.username");
		String password = properties.getProperty("jdbc.password").trim();
		String driver = properties.getProperty("jdbc.driver");
		DruidPlugin ds1 = new DruidPlugin(url, user, password,driver);
		//ds1.setValidationQuery("select 1 from dual");
		ds1.start();
		
		// 配置ActiveRecord插件
		ActiveRecordPlugin arp1 = new ActiveRecordPlugin(alias,ds1);
		arp1.setShowSql(false);
		arp1.setDialect(new MysqlDialect());
		
		configEngine(arp1);		
		
		arp1.start();
		/** -----第一个数据源配置结束----- */
		
		is_init = true;
	}
	
	/**
	 * 检查数据库的连接情况
	 * @return
	 * @author happyboy
	 * @date 2016年8月12日 上午10:54:49
	 */
	public static boolean checkConn(){
		String sql = "select 1";
		try {
			Db.use("ds1").find(sql);
			System.out.println("数据库连接正常");
			is_conn = true;
		} catch (Exception e) {
			is_conn = false;
			System.out.println("数据库连接异常");
		}	
		
		return is_conn;
	}

}

上面的类,大家可以直接复制使用。有了这个类,下面就是想办法触发init()方法了。触发的方法有很多。

触发方法1:配置监听

package util;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import utils.DbUtil;

public class DbListener implements ServletContextListener{
	
	private static Logger log = LoggerFactory.getLogger(DbListener.class);

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		log.info("ActiveRecord初始化");
		DbUtil.init();
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

}

然后web.xml中注册该监听。

<listener>
    <listener-class>util.DbListener</listener-class>
</listener>

触发方法2:什么都不配置,在BaseService中触发。

思路就是,你所有的service都继承自一个BaseService,然后在BaseService中初始化ActiveRecord。

package common.service;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import utils.DbUtil;

public class BaseService {
	
	static {
	    DbUtil.init();
	}	

}

这样有一个弊端就是在控制层使用可能会有问题,当然也很容易解决了,就是在BaseController中也初始化一下。不过本着MVC的思想,还是尽量不要在控制层写逻辑了。

以上不妥的地方还请波总以及各位大佬指正。

评论区

JFinal

2019-01-23 17:04

两种方案都可以,建议使用第二种方案,纯净一些,感谢分享

山东小木

2019-01-24 12:19

Jbolt就是在eclipse桌面环境里使用的JFinal activeRecord

cctvsod

2019-02-06 09:45

在dbutil中添加静态代码块,初始化active插件,不是更简单吗

happyboy

2019-02-12 09:01

@cctvsod 你不去调用,如何触发加载?还不是同样的道理吗。

hotsmile

2019-02-12 10:03

不错,学习了

热门分享

扫码入社