dao和service

1,dao和service对应 
一般情况下,Hibernate DAO只操作一个POJO对象,因此一个DAO对应一个POJO对象。 

Service层是为了处理包含多个POJO对象(即对多个表的数据操作)时,进行事务管理(声明式事务管理)。Service层(其接口的实现类)被注入多个DAO对象,以完成其数据操作。 

2, Service之有无 

   这一点我的看法未必正确,我的脑海现在有两种构建业务层的模式: 

   模式1是Service + DAO,即DAO中只做CRUD及类似的简单操作(称之为功能点,不包含业务逻辑),Service中通过调用一个或多个DAO中的功能点来组合成为业务逻辑.Service的数量应该由功能模块来决定。 

   在这种模型中业务逻辑是放在Service中的,事务的边界也应该在Service中控制. 当然,直接在Service中控制事务会引入非业务逻辑的代码,幸好Spring的AOP可以解决这个问题,这也是引入Spring的原因之一. 

    如果说到缺点,就在于对某些对象的操作就是简单的CRUD,Service层显得累赘. 

    模式2是Service + BO, 而BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。需要注意的是BO中的业务方法往往是针对一个实体对象的,如果需要跨越多个实体对象,则方法应该放在Service中。 

    举例来说,一个简单的银行帐户管理系统,创建帐户这个BO对象,里面可以有修改密码,取钱等业务方法(不难看出,这些方法都只对单个帐户对象进行操作)。现在需要添加一个转账方法,就应该放在Service中。 

    这里Service和BO的关系是什么样的呢?再举一例:以国家行政机关为例:粮食局负责收粮,卖种子等,建设部负责审批土地买卖,建设公路等,这都是行政部分份内的事儿。突然某地发了水灾,救灾时需要粮食局开仓放粮,建设部修建临时房屋,如何协调两个部门?就需要成立专门的救灾委员会,由救灾委员会出面对两个部分的资源进行调拨。这里两个部分就是BO,而救灾委员会就是Service。不知我的意思是否表达准确了,呵呵。 

    模式1的在划分Service和DAO时界限清晰,但会带来一些无必要的代码。 
    模式2的划分相对复杂,然而可以提高编码效率。 

    当然小规模的应用中,没有Service,完全是DAO或BO也是可以接受的。 

3,Service和DAO的接口之有无 

    接口是一种契约,它可以有多种实现。所以接口之有无取决于具体实现是否需要多样化。如果铁定一种DAO或一种Service只有一种实现,那么抽象出接口的意义不大。然而一些大型应用或许需要DAO和Service的多种实现(比如上面例子中的帐户DAO,可能需要一种Hibernate实现、一种CMP实现和一种JDO实现),为了向上一层隐藏具体实现类,需要采用接口。 

    隐藏具体实现类的创建过程,这有两种方法:一是实用工厂方法,代价是代码量大(每个DAO和Service一个工厂)。二是使用Spring的IoC,实现依赖注入,不需要写额外的代码,这也是引入Spring的理由之二。

reply:

55个service 

22个DAO 

141个Pojo 


很多DAO都可以用公用的方法的 
service一般是看有多少种模块 
同一模块的放在一起....... 

(此项目使用了EJB&hibernate)

1对于基础信息来说DAO用一个共用的就可以了。。。。
(基础信息的条数大多不大于100条)
包括增删改,与业务主键查询
2主要业务一个表对应一个DAO
(条数线性增长的表)
如:BBS 中贴子,用户
但是在内部系统中用户就是一个基础信息了。

3特别或增值业务,一个表对应N个DAO
(所有的主要业务的各项统计功能,还有要包含权限问题的查询)
每个功能与每个功能分开,最好一个查询一个类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于注册页面的DaoService代码与具体的业务逻辑和数据库结构有关,因此无法给出通用的代码。以下是一个简单的示例,仅供参考。 1. UserDao ``` public interface UserDao { User findByUsername(String username); void save(User user); } ``` 2. UserService ``` public interface UserService { User findByUsername(String username); void register(User user); } ``` 3. UserDaoImpl ``` @Repository public class UserDaoImpl implements UserDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public User findByUsername(String username) { String sql = "SELECT * FROM user WHERE username=?"; return jdbcTemplate.queryForObject(sql, new Object[]{username}, new UserMapper()); } @Override public void save(User user) { String sql = "INSERT INTO user (username, password) VALUES (?, ?)"; jdbcTemplate.update(sql, user.getUsername(), user.getPassword()); } private static final class UserMapper implements RowMapper<User> { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getLong("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); return user; } } } ``` 4. UserServiceImpl ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User findByUsername(String username) { return userDao.findByUsername(username); } @Override public void register(User user) { User existingUser = userDao.findByUsername(user.getUsername()); if (existingUser != null) { throw new IllegalArgumentException("Username already exists: " + user.getUsername()); } userDao.save(user); } } ``` 在以上示例中,User为一个简单的实体类,包含id、username和password三个字段。UserDao定义了两个方法,分别用于根据用户名查询用户和保存用户。UserDaoImpl实现了这两个方法,使用JdbcTemplate进行数据库操作。UserService也定义了两个方法,分别用于根据用户名查询用户和注册用户。UserServiceImpl实现了这两个方法,使用UserDao进行数据库操作,并在注册用户时检查用户名是否已存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值