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