更底层定制NutDao

优质
小牛编辑
133浏览
2023-12-01

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

完全控制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 的默认实现。

同 Spring 事务整合的例子

<bean id="nutDao" class="org.nutz.dao.impl.NutDao">
    <property name="dataSource" ref="dataSource"/>
    <!-- 如果要使用Trans,移除springDaoRunner -->
    <property name="runner" ref="springDaoRunner"/>
</bean>
<bean id="springDaoRunner" class="org.nutz.integration.spring.SpringDaoRunner">
</bean>

SpringDaoRunner类可以在nutz-integration-spring (Git@OSC镜像)中找到