文章载来源:【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层的代码中增添即可。