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