文章載來源:【http://blog.csdn.net/qq_34825926/article/details/69346084】
- 訪問數據庫的傳統方法
傳統訪問數據庫的方法非常面向過程,分為以下幾步
– 實例化connection
– 實例化statement
– 通過statement的參數sql語句訪問數據庫,返回數據進行處理
View Code1 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 }傳統數據庫訪問模式缺點顯而易見:
一就是各個模塊間的耦合太緊,statement要依賴connection,connection還依賴於數據庫的種類。
二就是如果我改變的數據庫的種類,或者要提供不同的數據庫服務,那么我就要提供大量的重復代碼。 - dao層:dao層叫數據訪問層,全稱為data access object,屬於一種比較底層,比較基礎的操作,具體到對於某個表、某個實體的增刪改查
- service層:service層叫服務層,被稱為服務,肯定是相比之下比較高層次的一層結構,相當於將幾種操作封裝起來,至於為什么service層要使用接口來定義有以下幾點好處:
service實現類:也顧名思義,service實現類實現了service接口,進行具體的業務操作。- 在java中接口是多繼承的,而類是單繼承的,如果你需要一個類實現多個service,你用接口可以實現,用類定義service就沒那么靈活
- 要提供不同的數據庫的服務時,我們只需要面對接口用不同的類實現即可,而不用重復地定義類
- 編程規范問題,接口化的編程為的就是將實現封裝起來,然調用者只關心接口不關心實現,也就是“高內聚,低耦合”的思想。
- 以對於user的操作為例進行說明:
userdao: -
View Code1 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 }
在接口中對方法進行了定義,在UserDao.xml中給出了sql語句實現
在UserDao中,就對user這個實體的增刪補查各類基本的操作進行了聲明,並用mybatis框架進行實現。下面給出部分UserDao.xml的代碼
-
View Code1 <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>
下面來看看service層的代碼
-
View Code1 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 }
顯然,service層里面的方法相較於dao層中的方法進行了一層包裝,例如通過id查找用戶,通過用戶名查找用戶,是在基礎的操作上又增加了一層包裝的,實現的是相對高級的操作。最后將這些操作在serviceimpl類中實現,代碼比較多,這里還是只給出了部分代碼。
-
View Code1 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 }
由此看到,這樣進行分層,訪問數據庫和進行service之間的分工明確,如果我需要對service的需求修改,無需改變dao層的代碼,只要在實現上改變即可,如果我有訪問數據庫的新需求,那我也只要在dao層的代碼中增添即可。

