Java中DAO的实现
图 1. 应用程序和数据源 
- 一个 DAO 工厂类
- 一个 DAO 接口
- 一个实现了 DAO 接口的具体类
- 数据传输对象(有时称为值对象)
事务界定
| 声明式事务界定 | 编程式事务界定 |
| 程序员用 EJB 部署描述符声明事务属性。 | 程序员负责编写事务逻辑。 |
| 运行时环境(EJB 容器)用这些属性自动管理事务。 | 应用程序通过一个 API 控制事务。 |
- 事务要如何开始?
- 事务应如何结束?
- 哪一个对象将负责开始一个事务?
- 哪一个对象将负责结束一个事务?
- DAO 是否要负责事务的开始和结束?
- 应用程序是否需要通过多个 DAO 访问数据?
- 事务涉及到一个 DAO 还是多个 DAO?
- 一个 DAO 是否调用另一个 DAO 的方法?
清单 1. DAO 方法
tx.begin(); // start the transaction
dao.createWarehouseProfile(profile);
dao.updateWarehouseStatus(id1, status1);
dao.updateWarehouseStatus(id2, status2);
tx.commit(); // end the transactionConnection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法:public void setAutoCommit(boolean)public boolean getAutoCommit()public void commit()public void rollback()
清单 3. 用 JDBC API 进行事务界定
import java.sql.*; |
图 2. 一个事务管理器和资源管理器 
- JDBC 连接
- JDO
PersistenceManager对象 - JMS 队列
- JMS 主题
- 企业 JavaBeans
- 符合 J2EE 连接体系结构(J2EE Connector Architecture)规范的资源适配器
javax.transaction.UserTransaction 接口中的方法。清单 4 显示了对UserTransaction 对象的典型 JNDI 查询:清单 4. 一个对 UserTransaction 对象的 JDNI 查询
import javax.transaction.*; |
UserTransaction 对象后,就可以开始事务了,如清单 5 所示:清单 5. 用 JTA 开始一个事务
utx.begin(); |
commit() 时,事务管理器用一个两阶段的提交协议结束事务。javax.transaction.UserTransaction 接口提供了以下事务控制方法:public void begin()public void commit()public void rollback()public int getStatus()public void setRollbackOnly()public void setTransactionTimeout(int)
begin() 开始事务。应用程序调用 commit() 或者 rollback() 结束事务。javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection s 是参与 JTA 事务的 JDBC 连接。XADataSource 。从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导。javax.sql.DataSource.getConnection() 以获得到数据库的连接。java.sql.Connection.commit() 或者java.sql.Connection.rollback() 。相反,应用程序应该使用 UserTransaction.begin()、UserTransaction.commit() 和 serTransaction.rollback() 。- 事务界定代码嵌入在 DAO 类中。
- DAO 类使用 JDBC API 进行事务界定。
- 调用者不能界定事务。
- 事务范围局限于单个 JDBC 连接。
- 事务用 JTA 界定。
- 事务界定代码从 DAO 中分离出来。
- 调用者负责界定事务。
- DAO 加入一个全局事务。
System.out.println 和 System.err.println 。 Println 语句速度快且使用方便,但是它们没有提供全功能的日志记录系统所具有的功能。表 2 列出了 Java 平台的日志库:| 日志库 | 开放源代码? | URL |
| java.util.logging | 不是 | [url]http://java.sun.com/j2se/[/url] |
| Jakarta Log4j | 是 | [url]http://jakarta.apache.org/log4j/[/url] |
| Jakarta Commons Logging | 是 | [url]http://jakarta.apache.org/commons/logging.html[/url] |
java.util.logging 或者 Jakarta Log4j 一同使用。Commons Logging 是一个日志抽象层,它隔离了应用程序与底层日志实现。使用 Commons Logging,您可以通过改变配置文件更换底层日志实现。Commons Logging 在 Jakarta Struts 1.1 和 Jakarta HttpClient 2.0 中使用。清单 7. DAO 类中的 Jakarta Commons Logging
import org.apache.commons.logging.*; |
- DAO 的公共接口中的方法是否抛出检查过的异常?
- 如果是的话,抛出何种检查过的异常?
- 在 DAO 实现类中如何处理异常?
- DAO 方法应该抛出有意义的异常。
- DAO 方法不应该抛出
java.lang.Exception。java.lang.Exception太一般化了。它不传递关于底层问题的任何信息。 - DAO 方法不应该抛出
java.sql.SQLException。SQLException 是一个低级别的 JDBC 异常。一个 DAO 应该力争封装 JDBC 而不是将 JDBC 公开给应用程序的其余部分。 - 只有在可以合理地预期调用者可以处理异常时,DAO 接口中的方法才应该抛出检查过的异常。如果调用者不能以有意义的方式处理这个异常,那么考虑抛出一个未检查的(运行时)异常。
- 如果数据访问代码捕获了一个异常,不要忽略它。忽略捕获的异常的 DAO 是很难进行故障诊断的。
- 使用链接的异常将低级别的异常转化为高级别的异常。
- 考虑定义标准 DAO 异常类。Spring Framework 提供了很好的一套预定义的 DAO 异常类。
MovieDAO 是一个展示本文中讨论的所有技术的 DAO:事务界定、日志和异常处理。 MovieDAO 源代码。代码分为三个包:daoexamples.exceptiondaoexamples.moviedaoexamples.moviedemo
daoexamples.movie.MovieDAOFactorydaoexamples.movie.MovieDAOdaoexamples.movie.MovieDAOImpldaoexamples.movie.MovieDAOImplJTAdaoexamples.movie.Moviedaoexamples.movie.MovieImpldaoexamples.movie.MovieNotFoundExceptiondaoexamples.movie.MovieUtil
MovieDAO 接口定义了 DAO 的数据操作。这个接口有五个方法,如下所示:public Movie findMovieById(String id)public java.util.Collection findMoviesByYear(String year)public void deleteMovie(String id)public Movie createMovie(String rating, String year, String, title)public void updateMovie(String id, String rating, String year, String title)
daoexamples.movie 包包含 MovieDAO 接口的两个实现。每一个实现使用一种不同的方式进行事务界定,如表 3 所示:| MovieDAOImpl | MovieDAOImplJTA | |
| 实现 MovieDAO 接口? | 是 | 是 |
| 通过 JNDI 获得 DataSource? | 是 | 是 |
| 从 DataSource 获得 java.sql.Connection 对象? | 是 | 是 |
| DAO 在内部界定事务? | 是 | 否 |
| 使用 JDBC 事务? | 是 | 否 |
| 使用一个 XA DataSource? | 否 | 是 |
| 参与 JTA 事务? | 否 | 是 |
daoexamples.moviedemo.DemoServlet 的 servlet 类。 DemoServlet 使用这两个 Movie DAO 查询和更新表中的电影数据。MovieDAO 和 Java 消息服务(Java Message Service)结合到一个事务中,如清单 8 所示。清单 8. 将 MovieDAO 和 JMS 代码结合到一个事务中
UserTransaction utx = MovieUtil.getUserTransaction(); |
Java中DAO的实现的更多相关文章
- Java中DAO/DTO/PO/VO/BO/QO/POJO
ORM:是Object Relational Mapping(对象关系映射)的缩写. 通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R/M的世界里,有两个基本的也是重要的东东需要了 ...
- java中dao层和service层的区别是什么?
首先解释面上意思,service是业务层,dao是数据访问层.呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用 ...
- java中dao层的通用层,通过反射机制,操作数据库的增删改,适用的范围是不包含属性类
这里首先必须注意的是:类的类名.字段必须与数据库中的表名和字段名保持一致,否则无法通过反射机制作出通用层 /** * 学生信息类,数据库中的StuInfo表 * */public class StuI ...
- java中dao层和service层的区别是什么
dao层中已经有操作数据库的方法了,为什么还要service层去封装?有什么好处? tanghui12321 | 浏览 131990 次 我有更好的答案 推荐于2017-10-06 18:44:5 ...
- java中Dao模式
什么是DAO 1.Data Access Object(数据存取对象) 2.位于业务逻辑和持久化数据之间 3.实现对持久化数据的访问 DAO模式的作用 1隔离业务逻辑代码和数据访问代码 2.隔离不 ...
- java中的dao模式
java中Dao模式 什么是DAO 1.Data Access Object(数据存取对象) 2.位于业务逻辑和持久化数据之间 3.实现对持久化数据的访问 DAO模式的作用 1隔离业务逻辑代码 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- SSH 框架学习之初识Java中的Action、Dao、Service、Model-收藏
SSH 框架学习之初识Java中的Action.Dao.Service.Model-----------------------------学到就要查,自己动手动脑!!! 基础知识目前不够,有感性 ...
- [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...
随机推荐
- 使用maven构建scala项目
eclipse安装scala插件和m2e-scala并不是支持的很好,因此使用maven创建scala工程的时候,IDEA可谓是最好的开发利器. 1. 创建工程之前的准备 2. IDEA界面创建Sca ...
- Gitlab+Jenkins学习之路(九)之Jenkins的远程管理和集群
一.Jenkins的远程管理 Jenkins的远程管理方式包含: Shell ssh SSH Plugin ansible.saltstack (1)Shell ssh在项目构建时,jenkins使用 ...
- maven 打 fatjar
备忘. 1. <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> < ...
- java 循环中使用list时,出现list中全部加入了对象导致没有实现分组的解决方案
清空list即可 public List fetchNmapSingleTaskWithDataList() { Map map = new HashMap<>(); List listN ...
- 异常 java.lang.NullPointerException at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)
这是jsp报的异常 jsp代码: <% String LoginUsername = ""; String LoginPassword = ""; try ...
- Altium软件中Unknowpin的详细解决办法
1.Altium软件中Unknowpin第一种原因:PCB封装缺失遗漏,直接加入对应的封装即可.点击箭头指示处的Add,接着点击OK之后,再点击图中所示处Browse...选择封装库的封装即可. 2. ...
- Win环境 Android Studio使用Git 教程 ( 一 )
一. 安装 下载安装完成Git后 进入命令行 输入命令git --version,如果能显示版本则说明安装成功,如果没有显示版本,需要配置环境变量: 在path中添加git的安装位置 二 . 配置信息 ...
- git pull fatal: refusing to merge unrelated histories
1.首先我github有个远程仓库,然后我本地有个仓库 本地仓库我新添加了一个文件,然后我去关联(git remote add origin git@github.com:qshilary/gitte ...
- 算法工程师进化-SQL
1 引言 SQL操作往往是程序员必备的技能,对于算法工程师而言,熟练掌握SQL操作则更为重要.本文以<SQL语句执行顺序>作为学习资料,总结SQL的理论部分. 2 SQL查询语句的执行顺序 ...
- MD5加密简单使用
MD5加密简单使用规则 先写一个加密的工具类吧! public class MD5Util { public static String encoderPassword(String s) throw ...