DAO的实现

 

DAO 模式对开发J2EE应用的人员来说都应该很熟悉的,但是模式的实现各不相同,在这里我将按下面的思路来实现:

1.系统中的所有数据库访问都通过 DAO 进行以实现封装。

2.每个 DAO 实例负责一个主要域对象或实体。

      3DAO 负责域对象的创建、读取(按主键)、更新和删除(CRUD)。

4DAO 可允许基于除主键之外的标准进行查询,返回值通常是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);
}
}

清单 . 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);
}

} 
清单 . 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);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值