`
dawuafang
  • 浏览: 1112842 次
文章分类
社区版块
存档分类
最新评论

更底层定制org.nutz.dao.impl.NutDao

 
阅读更多

#Top

Dao 接口的默认实现 NutDao

Nutz 的 Dao 接口是它最大的一个接口,这个接口封装了一组更便利的数据库操作,同时 Nutz 也提供了一个默认的实现 :org.nutz.dao.impl.NutDao,基本上这个实现足够你使用。但是有些时候你希望对它进行更加深刻的,触及灵魂的定制,比如你打算让 Dao 的使用 Spring 的事务管理器等等,那么你可以读读这篇文档,它告诉你几个 NutDao 类的几个扩展点,可以让你更加底层定制 NutDao


#Top

完全控制SQL语句的执行

NutDao 中无论任何操作,最终都要生成一个 SQL 语句,并传入给 JDBC 来执行。

  • PojoMaker 接口负责语句的生成
  • DaoExecutor 接口负责语句的执行

我们很鼓励你自己实现自己的 DaoExecutor 接口替换掉默认的实现,但是 PojoMaker 接口则暂时不建议你这么做,因为里面的逻辑稍微有点复杂,你非常容易弄错。

DaoExecutor 接口的源码如下:

public interface DaoExecutor {
  void exec(Connection conn, DaoStatement st);
}

它的实现类面对的是一个 DaoStatement,无论你是用自定义SQL,还是直接操作 POJO,最后NutDao都要生成DaoStatement 接口的一个实例,然后交付给 DaoExecutor 来运行.

Nutz 默认提供的 NutDaoExecutor 也不太复杂,算上空行和注释,240多行,你如果有兴趣看看它的源码,它倒是能成为你自定义 DaoExecutor 的一个很好的参考。

总之,通过 DaoExecutor 接口,你可以完全控制单条SQL语句的执行,当然,到现在,似乎还没有人明确的希望控制这个接口,大家都在用 Nutz 的默认实现。


#Top

终极扩展点 - DaoRunner

如果你使用的是 Dao 接口的默认实现类 (org.nutz.dao.impl.NutDao),你觉得任何事情都很满意,但是就是单单事务这部分你很不喜欢。你很不喜欢事务模板的写法:

public void doSomething(final Pet pet){
  Trans.exec(new Atom(){
    public void runt(){
      dao.update(pet);  
      dao.update(pet.getMaster());
    }
  });
}

看看,这样写代码太多了。因此,你甚至开始怀念 Spring,它的声明式事务管理,可以让你的代码完全不用这么繁琐。怎么办呢?

虽然 Nutz 也提供了声明式事务,但是你的项目是个老项目,一直在用 Spring,你所有的 CRUD 都是由 Spring来管理的,但是你很想试试 Nutz.Dao,你可以做到吗?

我们提供了一个扩展点。通过修改这个接口,你可以为 Dao 的默认实现类 NutDao 彻底定制事务行为 它就是 DaoRunner,它只有一个方法:

public interface DaoRunner {

  public void run(DataSource dataSource, ConnCallback callback);

}

你可以根据自己的喜欢实现这个接口,然后

dao.setRuner(yourRuner);

当然,你可以通过 IOC 容器,将你的 runner 注入进 NutDao 对象中


#Top

同 Spring 事务整合的例子

这个特性是在 1.a.27 之后,由知足常乐(hzzdong)在博客《Nutz DAO与spring集成讨论》提出的,我们因此得到了 Issue 162。

在做了一点修改后,现在(1.a.28),只要你提供一个这样的 DaoRunner

import org.springframework.jdbc.datasource.DataSourceUtils;

public class SpringDaoRunner implements DaoRunner {

  public void run(DataSource dataSource, ConnCallback callback) {
    Connection con = DataSourceUtils.getConnection(dataSource); 
    try { 
      callback.invoke(con); 
    }
    catch (Exception e) { 
      if (e instanceof RuntimeException) 
        throw (RuntimeException) e; 
      else 
        throw new RuntimeException(e); 
    } finally { 
      DataSourceUtils.releaseConnection(con, dataSource);
    } 
  }
}

任何时候你可以通过:

dao.setRunner(new SpringDaoRunner());

修改 NutDao 的默认事务行为。 当然,如果你的 Dao 对像本身就是通过 Ioc 容器获得,我想你一定知道如何为你的对象设置一个属性,对吧。

分享到:
评论

相关推荐

    nutz框架jar包

    nutz-1.r.62.jar、druid-1.0.26.jar、gson-2.8.0.jar、javase-3.2.1.jar、jstl.jar、mysql-connector-java-5.1.26-bin.jar、standard.jar

    nutz-web:码头发射器

    nutz-webA Jetty launcher + Nutz.Mvc Ajax View添加依赖(maven)<dependency><groupId>org.nutz</groupId><artifactId>nutz-web</artifactId><version>1.r.62</version></dependency>新建一个配置文件web....

    nutz初使用之MVC HelloWorld (netbeans html,jquery版)

    NULL 博文链接:https://yunhaifeiwu.iteye.com/blog/743368

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.b.52.zip

    如果你觉得 Hibernate 控制比较繁琐,iBatis 编写SQL又比较麻烦,Nutz.Dao 专为你设计。 如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计 如果你觉得直接写 XML 配置文件很麻烦,...

    org.quartz.tool包源码

    org.quartz.tool包源码,使用方法请搜索《 quartz-2.2.1定制工具类,方便nutz使用js配置quartz》

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    Nutz-1.b.38

    Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    数据库访问层 -- Nutz.Dao 反转注入支持 -- Nutz.Ioc Mvc 框架 -- Nutz.Mvc Json 解析器 -- Nutz.Json 更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立...

    NutzBoot的maven插件

    <groupId>org.nutz.boot <artifactId>nutzboot-maven-plugin ${nutzboot.version} 打包jar文件 mvn clean package nutzboot:shade 打包后jar文件可直接运行 java -jar XXX.jar 若需要设置jvm内存大小等参数...

    nutzmore:让Nutz更好用

    Nutz的插件与集成库各种插件和集成的集合每个插件都有自己的文件夹,均为maven module, 请按需获取.<dependency><groupId>org.nutz</groupId><artifactId>填nutz插件名</artifactId><version>1.r.67</version></...

    SpringMVC+Nutz框架介绍.pdf

    SpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架介绍.pdfSpringMVC+Nutz框架...

    SpringMVC+Nutz框架介绍.docx

    SpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+...

    nutz-1.r.62.zip

    nutz-1.r.62.zip 强大的Java框架,里面有许多好玩的方便的约定配置,有兴趣的可以下载再看看

    nutz-1.r.61.r2.jar包

    nutz-1.r.61.r2-发布包_修正JDK6兼容性

    nutz微信应用开发项目nuby.zip

    Nutz easyui mpsdk4j 七牛云服务微信应用开发项目 1. 实现微信基本的消息互动功能,菜单响应,用户信息同步等 2. 最新的JSSDK功能,如分享,图片上传, 网页授权, 一键关注等 ...

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.48-manual.pdf 文档

    java 框架 nutz-1.b.48-manual.pdf

    nutz-1.b.40-manual.pdf

    •活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 •整 -- 它所有功能均不依赖第三方 jar 文件。 这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 ...

Global site tag (gtag.js) - Google Analytics