文章载来源:【http://blog.csdn.net/qq_34825926/article/details/69346084】
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 }
传统数据库访问模式缺点显而易见:
一就是各个模块间的耦合太紧,statement要依赖connection,connection还依赖于数据库的种类。
二就是如果我改变的数据库的种类,或者要提供不同的数据库服务,那么我就要提供大量的重复代码。
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 }
在接口中对方法进行了定义,在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>
下面来看看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 }
显然,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 }
由此看到,这样进行分层,访问数据库和进行service之间的分工明确,如果我需要对service的需求修改,无需改变dao层的代码,只要在实现上改变即可,如果我有访问数据库的新需求,那我也只要在dao层的代码中增添即可。