dao层和serivce层的作用和区别

2023年8月10日11:05:22

文章载来源:【http://blog.csdn.net/qq_34825926/article/details/69346084

  • 访问数据库的传统方法 
    传统访问数据库的方法非常面向过程,分为以下几步 
    – 实例化connection 
    – 实例化statement 
    – 通过statement的参数sql语句访问数据库,返回数据进行处理

    dao层和serivce层的作用和区别

    dao层和serivce层的作用和区别
     1 import java.sql.Statement;
     2 import java.util.Properties;
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.IOException;
     6 import java.sql.Connection;
     7 import java.sql.DriverManager;
     8 import java.sql.ResultSet;
     9 import java.sql.SQLException;
    10 
    11 public class DBAccess {
    12 
    13     public static void main(String[] args) throws SQLException, FileNotFoundException, IOException
    14     {
    15         DBAccess access = new DBAccess();
    16         access.test();
    17     }
    18 
    19     private void test() throws SQLException, FileNotFoundException, IOException
    20     {
    21         String url = "jdbc:postgresql://localhost:5432/rylynn"; 
    22 
    23         Properties p = new Properties();
    24         p.load(new FileInputStream("reg.txt"));
    25 
    26         Connection connection = DriverManager.getConnection(url,p);       //建立connection
    27         Statement statement = connection.createStatement();       //建立satatement
    28         statement.execute("insert into abo values((001),'hnb')");       //执行sql语句
    29 
    30         ResultSet resultSet = statement.executeQuery("select number from abo where number < 2");
    31         while(resultSet.next())
    32         {
    33             int id = resultSet.getInt(1);
    34     //      String name = resultSet.getString(1);
    35             System.out.println("ID:" + id);
    36         }
    37         statement.close();
    38         connection.close();
    39     }
    40 }    
    dao层和serivce层的作用和区别

    传统数据库访问模式缺点显而易见: 
    一就是各个模块间的耦合太紧,statement要依赖connection,connection还依赖于数据库的种类。 
    二就是如果我改变的数据库的种类,或者要提供不同的数据库服务,那么我就要提供大量的重复代码。

  • dao层:dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查
  • service层:service层叫服务层,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来,至于为什么service层要使用接口来定义有以下几点好处: 
    service实现类:也顾名思义,service实现类实现了service接口,进行具体的业务操作。

    • 在java中接口是多继承的,而类是单继承的,如果你需要一个类实现多个service,你用接口可以实现,用类定义service就没那么灵活
    • 要提供不同的数据库的服务时,我们只需要面对接口用不同的类实现即可,而不用重复地定义类
    • 编程规范问题,接口化的编程为的就是将实现封装起来,然调用者只关心接口不关心实现,也就是“高内聚,低耦合”的思想。
  • 以对于user的操作为例进行说明: 
    userdao:
  • dao层和serivce层的作用和区别

    dao层和serivce层的作用和区别
     1 public interface UserDao {
     2 
     3     public List<User> findAll();
     4 
     5     public User findById(String id);
     6 
     7     public void update(User user);
     8 
     9     public void add(User user);
    10 
    11     public void delete(String id);
    12 
    13     public User findByIdAndPassword(@Param("id") String username, @Param("password") String password);
    14 
    15     public void updatePassword(@Param("userId") String id, @Param("password") String password);
    16 
    17     User findByUsername(String username);
    18 }
    dao层和serivce层的作用和区别

    在接口中对方法进行了定义,在UserDao.xml中给出了sql语句实现 
    在UserDao中,就对user这个实体的增删补查各类基本的操作进行了声明,并用mybatis框架进行实现。

    下面给出部分UserDao.xml的代码

  • dao层和serivce层的作用和区别

    dao层和serivce层的作用和区别
     1 <select id="findAll" resultMap="user_map">
     2         SELECT * FROM user WHERE user_id != 'admin'
     3     </select>
     4 
     5     <select id="findById" parameterType="String" resultMap="user_map">
     6         SELECT * FROM user WHERE user_id = #{value}
     7     </select>
     8 
     9     <update id="update" parameterType="User">
    10         UPDATE user SET password = #{password} ,authority = #{authority} WHERE user_id = #{userId}
    11     </update>
    12 
    13     <update id="updatePassword" parameterType="map">
    14         UPDATE user SET password = #{password} WHERE user_id = #{userId}
    15     </update>
    16 
    17     <insert id="add" parameterType="User">
    18         INSERT INTO user(user_id,password,salt,role_ids,locked) VALUES(#{userId},#{password},#{salt},#{roleIdsStr},#{locked})
    19     </insert>
    20 
    21     <select id="findByIdAndPassword" parameterType="map" resultMap="user_map">
    22         SELECT * FROM user WHERE user_id = #{id} AND password = #{password}
    23     </select>
    dao层和serivce层的作用和区别

    下面来看看service层的代码

  • dao层和serivce层的作用和区别

    dao层和serivce层的作用和区别
     1 import com.giit.www.entity.User;
     2 import com.giit.www.entity.custom.UserVo;
     3 
     4 import java.lang.reflect.InvocationTargetException;
     5 import java.util.List;
     6 import java.util.Set;
     7 
     8 /**
     9  * Created by c0de8ug on 16-2-9.
    10  */
    11 public interface UserBiz {
    12     public List<UserVo> findAll() throws InvocationTargetException, IllegalAccessException;
    13 
    14     public User findById(String id);
    15 
    16     public void update(User user);
    17 
    18     public void add(User user);
    19 
    20     public void delete(String id);
    21 
    22     public void changePassword(String userId, String newPassword);
    23 
    24 
    25     public User findByUsername(String username);
    26 
    27     public Set<String> findRoles(String username);
    28 
    29     public Set<String> findPermissions(String username);
    30 }
    dao层和serivce层的作用和区别

         显然,service层里面的方法相较于dao层中的方法进行了一层包装,例如通过id查找用户,通过用户名查找用户,是在基础的操作上又增加了一层包装的,实现的是相对高级的操作。最后将这些操作在serviceimpl类中实现,代码比较多,这里还是只给出了部分代码。

  • dao层和serivce层的作用和区别

    dao层和serivce层的作用和区别
     1 import com.giit.www.college.dao.StaffDao;
     2 import com.giit.www.entity.Role;
     3 import com.giit.www.entity.Staff;
     4 import com.giit.www.entity.User;
     5 import com.giit.www.entity.custom.UserVo;
     6 import com.giit.www.system.dao.RoleDao;
     7 import com.giit.www.system.dao.UserDao;
     8 import com.giit.www.system.service.RoleBiz;
     9 import com.giit.www.system.service.UserBiz;
    10 import com.giit.www.util.PasswordHelper;
    11 import org.apache.commons.beanutils.BeanUtils;
    12 import org.springframework.stereotype.Service;
    13 import org.springframework.transaction.annotation.Transactional;
    14 
    15 import javax.annotation.Resource;
    16 import java.lang.reflect.InvocationTargetException;
    17 import java.util.*;
    18 
    19 /**
    20  * Created by c0de8ug on 16-2-9.
    21  */
    22 
    23 @Service
    24 public class UserBizImpl implements UserBiz {
    25 
    26     @Resource
    27     UserDao userDao;
    28 
    29     @Resource
    30     RoleDao roleDao;
    31 
    32     @Resource
    33     StaffDao staffDao;
    34 
    35     @Resource
    36     private PasswordHelper passwordHelper;
    37     @Resource(name = "roleBizImpl")
    38     private RoleBiz roleBiz;
    39 
    40     @Override
    41     public List<UserVo> findAll() throws InvocationTargetException, IllegalAccessException {
    42         List<UserVo> userVoList = new ArrayList<>();
    43         List userList = userDao.findAll();
    44 
    45 
    46         Iterator iterator = userList.iterator();
    47 
    48         while (iterator.hasNext()) {
    49             StringBuilder s = new StringBuilder();
    50             User user = (User) iterator.next();
    51             List<Long> roleIds = user.getRoleIds();
    52 
    53             UserVo userVo = new UserVo();
    54             BeanUtils.copyProperties(userVo, user);
    55 
    56             if (roleIds != null) {
    57                 int i = 0;
    58                 int size = roleIds.size();
    59                 for (; i < size - 1; i++) {
    60                     Role role = roleDao.findOne(roleIds.get(i));
    61 
    62                     s.append(role.getDescription());
    63                     s.append(",");
    64                 }
    65                 Role role = roleDao.findOne(roleIds.get(i));
    66                 s.append(role.getDescription());
    67                 userVo.setRoleIdsStr(s.toString());
    68             }
    69 
    70 
    71             userVoList.add(userVo);
    72 
    73         }
    74 
    75         return userVoList;
    76     }
    dao层和serivce层的作用和区别

         由此看到,这样进行分层,访问数据库和进行service之间的分工明确,如果我需要对service的需求修改,无需改变dao层的代码,只要在实现上改变即可,如果我有访问数据库的新需求,那我也只要在dao层的代码中增添即可。

  • 作者:qq_38507556
  • 原文链接:https://blog.csdn.net/qq_38507556/article/details/80936424
    更新时间:2023年8月10日11:05:22 ,共 5664 字。