在非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的思想,还是尽量不要在控制层写逻辑了。
以上不妥的地方还请波总以及各位大佬指正。