DAO 模式对开发J2EE应用的人员来说都应该很熟悉的,但是模式的实现各不相同,在这里我将按下面的思路来实现:
1.系统中的所有数据库访问都通过 DAO 进行以实现封装。
2.每个 DAO 实例负责一个主要域对象或实体。
3.DAO 负责域对象的创建、读取(按主键)、更新和删除(CRUD)。
4.DAO 可允许基于除主键之外的标准进行查询,返回值通常是DAO 负责的域对象集合。
5.像上面说的,DAO 不负责处理事务、会话或连接,而把这交给一个工具类,这样做是为了实现灵活性。
(一)泛型 DAO 接口
泛型 DAO 的基础是其 CRUD 操作。下面的接口定义泛型 DAO 的方法:
提供数据库操作接口给业务层使用
清单1
public interface IMessageDAO {
//对应留言信息Message这个实体对象的操作 public void saveMessage( Message message ); public void updateMessage( Message message ); public List getMessages( ); public void deleteMessage( String id, String userId ); public Message getMessage( String id ); }
清单2
public interface IUserDAO { public void saveUser( User user ); public User getUser( String username ); public User getUserById( String id ); }
(二)泛型DAO的实现
第一个泛型 DAO 的实现
DAO 的实现类,封装数据库逻辑,按<<Hibernate项目开发宝典>>书上所说的将那些持久化操作封装到一个DAO基础类,也相 当于是一个工具类,通过继承这个基础类,DAO的实现类可以在很大程度上简化持久化操作的步骤,减少代码的重复量。这个基础类命名为 HibernateDAO,具体的方法实现如清单2
清单 3.
/** * 使用Hibernate实现DAO的基础类 * 包括了持久化操作的一些基础方法 */ public class HibernateDAO { /** * 保存对象信息到数据库 * @param obj 需要进行持久化操作的对象 */ public void saveObject(Object obj) { HibernateUtil.getCurrentSession().save(obj); }
/** * IUserDAO接口的Hibernate实现 */ public class UserDAO extends HibernateDAO implements IUserDAO {
/** * 保存用户信息到数据库 * @param user 被保存的用户对象 */ public void saveUser(User user) { if (user == null) return;
User u = getUser(user.getName()); if (u != null) throw new MessageDAOException("用户名已经存在,请使用其它用户名!");
saveObject(user); }
/** * 得到用户对象 * @param username 用户的登录名 * @return 指定登录名的用户对象 */ public User getUser(String username) { User u = (User) getObject("from User u where u.name = '" + username + "'"); return u; }
/** * 得到用户对象的信息 * @param id 用户的ID值 * @return 指定的用户信息 */ public User getUserById(String id) { return (User) getObject(User.class, id); }