10.3.2 实现DAO组件
为了实现DAO
模式,系统至少需要具有如下三个部分:
对于采用Spring
框架的应用而言,无须额外提供DAO
工厂,因为Spring
容器本身就是DAO
工厂。此外,开发者需要提供DAO
接口和DAO
实现类。每个DAO
组件都应该提供标准的新增
、加载
、更新
和删除
等方法,此外还需提供数量不等的查询方法
。
如下是AuctionUserDao
接口的源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package org.crazyit.auction.dao;
import org.crazyit.auction.domain.AuctionUser; import org.crazyit.common.dao.BaseDao;
public interface AuctionUserDao extends BaseDao<AuctionUser> {
AuctionUser findByNameAndPass(String username, String pass);
AuctionUser findByItemAndPrice(Integer itemId, Double price); }
|
从表面上看,在该AuctionUserDao
接口中只定义了2 个方法,但由于该接口继承了BaseDao<AuctionUser>
,因此该接口其实也包含了增加、修改,根据主键加载、删除等通用的DAO
方法。在该接口中额外定义的findUserByNameAndPass()
方法,可根据用户名、密码查询AuctionUser
,由于本系统在映射AuctionUser
的username
属性时指定了unique="true"
,因此根据username
、pass
查询时不会返回List
,最多只会返回一个AuctionUser
实例。
定义了AuctionUserDao
接口之后,下面就可以为该接口提供实现类了,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package org.crazyit.auction.dao.impl;
import java.util.List; import org.crazyit.auction.dao.AuctionUserDao; import org.crazyit.auction.domain.AuctionUser; import org.crazyit.common.dao.impl.BaseDaoHibernate4;
public class AuctionUserDaoHibernate extends BaseDaoHibernate4<AuctionUser> implements AuctionUserDao {
public AuctionUser findByNameAndPass(String username, String pass) { List<AuctionUser> ul = (List<AuctionUser>) find( "from AuctionUser au where au.username=?0 and au.userpass=?1", username, pass); if (ul != null && ul.size() == 1) { return (AuctionUser) ul.get(0); } return null; }
public AuctionUser findByItemAndPrice(Integer itemId, Double price) { List<AuctionUser> userList = (List<AuctionUser>) find( "select user from AuctionUser user inner join user.bids bid" + " where bid.bidItem.id=?0 and bid.bidPrice=?1", itemId, price); if (userList != null && userList.size() == 1) { return userList.get(0); } return null; } }
|
AuctionUserDaoHibernate
类中的方法稍稍复杂一些,该方法用于根据用户名、密码查找用户。
ItemDao
比AuctionUserDao
稍微复杂一点,下面是ItemDao
接口的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| package org.crazyit.auction.dao;
import java.util.List; import org.crazyit.auction.domain.Item; import org.crazyit.common.dao.BaseDao;
public interface ItemDao extends BaseDao<Item> {
List<Item> findByKind(Integer kindId);
List<Item> findByOwner(Integer userId);
List<Item> findByWiner(Integer userId);
List<Item> findByState(Integer stateId); }
|
同样,让ItemDaoHibernate
继承BaseDaoHibernate4
就能用简单的代码来实现该DAO
组件的全部方法了,下面是ItemDaoHibernate
类的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package org.crazyit.auction.dao.impl;
import java.util.List; import org.crazyit.auction.dao.ItemDao; import org.crazyit.auction.domain.Item; import org.crazyit.common.dao.impl.BaseDaoHibernate4;
public class ItemDaoHibernate extends BaseDaoHibernate4<Item> implements ItemDao {
public List<Item> findByKind(Integer kindId) { return find("from Item as i where i.kind.id=?0 and i.itemState.id=1", kindId); }
public List<Item> findByOwner(Integer userId) { return (List<Item>) find( "from Item as i where i.owner.id=?0 and i.itemState.id=1", userId); }
public List<Item> findByWiner(Integer userId) { return find( "from Item as i where i.winer.id =?0" + " and i.itemState.id=2", userId); }
public List<Item> findByState(Integer stateId) { return find("from Item as i where i.itemState.id = ?0", stateId); } }
|
与AuctionUserDaoHiberante
类相似,ItemDaoHibernate
类也非常简单,几乎所有方法都只要一行代码即可实现。
借助于Spring+Hibernate
的简化结构,开发者可以非常简便地实现所有DAO
组件。系统中的KindDao
、BidDao
、StateDao
类都非常简单,故这里不再给出它们的实现。