Dao拦截器
为啥要实现Dao拦截器
- DaoRunner和DaoExecutor的定制成本较高,拦截器让NutDao更容易定制.
- 之前的设计没法很好的实现事务分离(DaoSupport和NutDaoRunner均有事务相关的代码)
内置的拦截器实现
- log -- 输出SQL语句到日志,这是NutDao默认情况下唯一启用的拦截器
- time -- 打印sql执行耗时
如何自定义
需要实现的接口
public interface DaoInterceptor { void filter(DaoInterceptorChain chain) throws DaoException; } // DaoInterceptorChain 包含当前执行的全部信息,如Connection,DaoStatment等等
示例实现
public class MyDaoInterceptor { public void filter(DaoInterceptorChain chain) throws DaoException { DaoStatement st = chain.getDaoStatement(); if (st instanceof NutPojo) { // 如果是dao.insert(user)之类的操作,会进入这个分支 } else if (st instanceof NutSql) { // 如果是自定义SQL,会进入这个分支 } chain.doChain();//继续下一个拦截器执行 } }
在ioc中的配置,以dao.js为例
var ioc = { dao : { type : "org.nutz.dao.impl.NutDao", args : [{refer:"dataSource"}], fields : { interceptors : [ "log", // 默认的日志还需要的 "time", // 加个时间又如何呢? "net.demo.MyDaoInterceptor" // 加入自己的,才合适 ] } } }