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

本文介绍Nutz框架中Dao接口的默认实现NutDao及其扩展点,包括如何通过DaoExecutor控制SQL执行及通过DaoRunner定制事务行为,还提供了一个与Spring事务整合的具体例子。

#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 容器获得,我想你一定知道如何为你的对象设置一个属性,对吧。

正文内容:在深入探讨这一固件的相关知识点之前,首先需要对固件以及萤石产品有一个基本的认识。固件(Firmware)是一种嵌入在硬件中的软件,它是硬件设备的控制程序,不同于普通的应用软件,固件直接控制硬件的行为和性能。萤石是中国一家知名的视频监控产品和服务供应商,提供包括监控摄像机、录像机、门禁系统等多种安防产品。本次讨论的固件文件名为“CS-TY4-4WCN_转_公版_XP1-8B4WF-wifi8188.Bin”,这里的“CS-TY4-4WCN”指的是该固件适用的特定型号的萤石主板。该固件文件的名称中包含了多个关键词,如“公版”表示这是一个非定制化的通用版本固件,“XP1-8B4WF”则可能是该硬件的某个系列型号或版本号。而“wifi8188”则表明这个固件支持8188型号的Wi-Fi模块。在实际使用过程中,固件升级是一项技术性较强的活动,它涉及到硬件和软件的紧密配合。由于“电信CS-TY4-4WCN_转_公版萤石_XP1-8B4WF-wifi8188”是一个.bin格式的固件文件,通常需要通过专门的编程器进行烧录。这里需要强调的是,并非所有的TY4型号主板都兼容该固件,因此在下载和升级之前,用户必须确认自己的设备型号是否匹配,以避免造成设备损坏。在进行固件升级之前,用户需要了解升级固件的目的和预期效果。一般而言,固件新能够带来新的功能,改善系统稳定性,提升性能,或者修复已知的bug。然而,在升级的过程中,如果操作不当,或者使用了错误的固件文件,都有可能导致设备无法正常工作,甚至完全损坏。除了升级固件,一些设备还支持通过网络远程新。但在此案例中,由于是编程器烧录,因此涉及到的步骤和风险与网络新大不相同。需要具备一定的电子知识和实操经验,比如识别硬件接口,正确连接编程器,以及在烧录过程中正确处理可能出现的错误提示。对于涉及具体型号的固件升级,建议用户先咨询萤石的官方技术支持,获取详细的升级指导和风险评估。同时,保留旧版固件的备份也是个良好的习惯,一旦新固件升级后出现问题,可以迅速恢复到之前的稳定状态。固件升级是一个既可能带来新希望,也可能带来风险的过程。在升级前,用户必须做好充足的准备工作,了解升级的必要性和步骤,并在可能的情况下寻求专业帮助。而萤石CS-TY4-4WCN_转_公版_XP1-8B4WF-wifi8188的固件,正是这样一种需谨慎处理的升级文件,以便在提升设备性能的同时,避免不必要的损失
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值