Dao拦截器

Jul 10, 2017 10:38:44 AM

作者:wendal

为啥要实现Dao拦截器

  • DaoRunner和DaoExecutor的定制成本较高,拦截器让NutDao更容易定制.
  • 之前的设计没法很好的实现事务分离(DaoSupport和NutDaoRunner均有事务相关的代码)

内置的拦截器实现

  • log — 输出SQL语句到日志,这是NutDao默认情况下唯一启用的拦截器
  • time — 打印sql执行耗时
    如何自定义

需要实现的接口

  1. public interface DaoInterceptor {
  2. void filter(DaoInterceptorChain chain) throws DaoException;
  3. }
  4. // DaoInterceptorChain 包含当前执行的全部信息,如Connection,DaoStatment等等

示例实现

  1. public class MyDaoInterceptor implements DaoInterceptor {
  2. public void filter(DaoInterceptorChain chain) throws DaoException {
  3. DaoStatement st = chain.getDaoStatement();
  4. if (st instanceof NutPojo) {
  5. // 如果是dao.insert(user)之类的操作,会进入这个分支
  6. } else if (st instanceof NutSql) {
  7. // 如果是自定义SQL,会进入这个分支
  8. }
  9. chain.doChain();//继续下一个拦截器执行
  10. }
  11. }

在ioc中的配置,以dao.js为例

  1. var ioc = {
  2. dao : {
  3. type : "org.nutz.dao.impl.NutDao",
  4. args : [{refer:"dataSource"}],
  5. fields : {
  6. interceptors : [
  7. "log", // 默认的日志还需要的
  8. "time", // 加个时间又如何呢?
  9. "net.demo.MyDaoInterceptor", // 加入自己的,才合适
  10. {refer:"superI"} // 引用另外一个bean作为拦截器
  11. ]
  12. }
  13. }
  14. }

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/dao/interceptors.html