dao層和service層的區別


文章載來源:【http://blog.csdn.net/qq_34825926/article/details/69346084

  • 訪問數據庫的傳統方法 
    傳統訪問數據庫的方法非常面向過程,分為以下幾步 
    – 實例化connection 
    – 實例化statement 
    – 通過statement的參數sql語句訪問數據庫,返回數據進行處理
     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 }    
    View Code

    傳統數據庫訪問模式缺點顯而易見: 
    一就是各個模塊間的耦合太緊,statement要依賴connection,connection還依賴於數據庫的種類。 
    二就是如果我改變的數據庫的種類,或者要提供不同的數據庫服務,那么我就要提供大量的重復代碼。

  • dao層:dao層叫數據訪問層,全稱為data access object,屬於一種比較底層,比較基礎的操作,具體到對於某個表、某個實體的增刪改查
  • service層:service層叫服務層,被稱為服務,肯定是相比之下比較高層次的一層結構,相當於將幾種操作封裝起來,至於為什么service層要使用接口來定義有以下幾點好處: 
    service實現類:也顧名思義,service實現類實現了service接口,進行具體的業務操作。
    • 在java中接口是多繼承的,而類是單繼承的,如果你需要一個類實現多個service,你用接口可以實現,用類定義service就沒那么靈活
    • 要提供不同的數據庫的服務時,我們只需要面對接口用不同的類實現即可,而不用重復地定義類
    • 編程規范問題,接口化的編程為的就是將實現封裝起來,然調用者只關心接口不關心實現,也就是“高內聚,低耦合”的思想。
  • 以對於user的操作為例進行說明: 
    userdao:
  •  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 }
    View Code

    在接口中對方法進行了定義,在UserDao.xml中給出了sql語句實現 
    在UserDao中,就對user這個實體的增刪補查各類基本的操作進行了聲明,並用mybatis框架進行實現。

    下面給出部分UserDao.xml的代碼

  •  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>
    View Code

    下面來看看service層的代碼

  •  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 }
    View Code

         顯然,service層里面的方法相較於dao層中的方法進行了一層包裝,例如通過id查找用戶,通過用戶名查找用戶,是在基礎的操作上又增加了一層包裝的,實現的是相對高級的操作。最后將這些操作在serviceimpl類中實現,代碼比較多,這里還是只給出了部分代碼。

  •  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     }
    View Code

         由此看到,這樣進行分層,訪問數據庫和進行service之間的分工明確,如果我需要對service的需求修改,無需改變dao層的代碼,只要在實現上改變即可,如果我有訪問數據庫的新需求,那我也只要在dao層的代碼中增添即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM