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);
}
/**
* 更新持久化对象
* @param obj 需要更新的对象
*/
public void updateObject(Object obj)
{
HibernateUtil.getCurrentSession().update(obj);
}
/**
* 使用HQL语句进行查询
* @param hsql 查询语句
* @return 符合条件的对象集合
*/
public List getObjects(String hsql)
{
List result = HibernateUtil.getCurrentSession().createQuery(hsql).list();
return result;
}
/**
* 使用HQL语句进行对象的查询
* @param hsql 查询语句
* @return 符合条件的对象
*/
public Object getObject(String hsql)
{
Object result = HibernateUtil.getCurrentSession().createQuery(hsql).uniqueResult();
return result;
}
/**
* 根据ID值得到持久化的对象
* @param cls 对象的类型
* @param id ID值
* @return 指定ID的对象
*/
public Object getObject(Class cls, String id)
{
Object result = HibernateUtil.getCurrentSession().get(cls, id);
return result;
}
/**
* 删除对象信息
* @param obj 被删除的对象
*/
public void deleteObject(Object obj)
{
HibernateUtil.getCurrentSession().delete(obj);
}
}
清单 4. IMessageDAO接口的实现类
/**
* IMessageDAO接口的Hibernate实现
*/
public class MessageDAO extends HibernateDAO implements IMessageDAO
{
/**
* 保存留言信息
*
* @param message
* 被保存的留言对象
*/
public void saveMessage(Message message)
{
super.saveObject(message);
}
/**
* 得到所有的留言信息
*
* @return 返回所有的留言信息
*/
public List getMessages()
{
String hsql = "from Message";
return super.getObjects(hsql);
}
/**
* 删除留言信息
*
* @param id
* 要删除的留言信息的ID值
* @param userId
* 执行删除操作的用户ID
*/
public void deleteMessage(String id, String userId)
{
Message msg = getMessage(id);
if (msg == null)
{
throw new MessageDAOException("找不到你所要删除的留言!");
}
if (!msg.getUser().getId().equals(userId))
{
throw new MessageDAOException("你不能删除别人的留言!");
}
deleteObject(msg);
}
/**
* 得到留言信息
*
* @param id
* 留言的ID值
* @return 指定ID值得留言对象
*/
public Message getMessage(String id)
{
return (Message) getObject(Message.class, id);
}
/**
* 更新留言信息
*
* @param message
* 欲更新的留言对象
*/
public void updateMessage(Message message)
{
updateObject(message);
}
}
清单 5. IUserDAO接口的实现类
/**
* 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);
}
}