1. 程式人生 > 實用技巧 >MYSQL 之 JDBC(九):增刪改查(七)DAO的補充和重構

MYSQL 之 JDBC(九):增刪改查(七)DAO的補充和重構

DAO重構後的程式碼

package com.litian.jdbc;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: Li Tian
 * @contact: [email protected]
 * @software: IntelliJ IDEA
 * @file: DAO.java
 * @time: 2020/3/26 18:37
 * @desc: |
 
*/ public class DAO { // insert, update, delete 操作都可以包含在其中 void update(String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; try { conn = JDBCTools.getConnection(); ps = conn.prepareStatement(sql); for (int
i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(null, ps, conn); } } // 查詢一條記錄,返回對應的物件 <T> T get(Class<T> clazz, String sql, Object... args) { List
<T> result = getForList(clazz, sql, args); if (result.size() > 0) { return result.get(0); } return null; /* 根據下面的方法進行了改寫 T entity = null; Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1. 獲取Connection conn = JDBCTools.getConnection(); // 2. 獲取PreparedStatement ps = conn.prepareStatement(sql); // 3. 填充佔位符 for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } // 4. 進行查詢,得到ResultSet rs = ps.executeQuery(); // 5. 若ResultSet中有記錄,準備一個Map<String, Object>: 鍵:存放列的別名;值:存放列的值 if (rs.next()) { Map<String, Object> values = new HashMap<>(); // 6. 得到ResultSetMetaData物件 ResultSetMetaData rsmd = rs.getMetaData(); // 7. 處理ResultSet,把指標向下移動一個單位 // 8. 由ResultSetMetaData物件得到結果集中有多少列 int columnCount = rsmd.getColumnCount(); // 9. 由ResultSetMetaData得到每一列的別名,由ResultSet得到具體每一列的值 for (int i = 0; i < columnCount; i++) { String columnLabel = rsmd.getColumnLabel(i + 1); Object columnValue = rs.getObject(columnLabel); // 10. 填充Map物件 values.put(columnLabel, columnValue); } // 11. 用反射建立Class物件的物件 entity = clazz.newInstance(); // 12. 遍歷Map物件,用反射填充物件的屬性值:屬性名為Map中的Key,屬性值為Map中的Value for (Map.Entry<String, Object> entry : values.entrySet()) { String propertyName = entry.getKey(); Object value = entry.getValue(); BeanUtils.setProperty(entity, propertyName, value); } } } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(rs, ps, conn); } return entity; */ } // 查詢多條記錄,返回對應的物件的集合 <T> List<T> getForList(Class<T> clazz, String sql, Object... args) { List<T> list = new ArrayList<>(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1. 得到結果集 conn = JDBCTools.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 2. 處理結果集,得到一個Map對應的List,其中一個Map物件就是一條記錄,Map的Key為rs中列的別名,Value為列的值 List<Map<String, Object>> values = handleResultSetToMapList(rs); // 3. 把Map的List轉為clazz對應的List,其中Map的key即clazz對應的物件的propertyName,value即為clazz對應物件的propertyValue list = transferMapListToBeanList(clazz, values); } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(rs, ps, conn); } return list; } public <T> List<T> transferMapListToBeanList(Class<T> clazz, List<Map<String, Object>> values) throws Exception { // 12. 判斷List是否為空集合,若不為空,則遍歷List,得到一個個Map物件,再把一個Map物件轉為一個Class引數對應的Object物件。 List<T> result = new ArrayList<T>(); T bean = null; if (values.size() > 0) { for (Map<String, Object> m : values) { bean = clazz.newInstance(); for (Map.Entry<String, Object> entry : m.entrySet()) { String propertyName = entry.getKey(); Object value = entry.getValue(); BeanUtils.setProperty(bean, propertyName, value); } result.add(bean); } } return result; } /** * 處理結果集,得到Map的一個List,其中一個Map物件對應一條記錄 * * @param rs * @return * @throws SQLException */ private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs) throws SQLException { // 5. 若ResultSet中有記錄,準備一個List<Map<String, Object>> // 鍵:存放列的別名;值:存放列的值,其中一個Map物件對應著一條記錄 List<Map<String, Object>> values = new ArrayList<>(); List<String> columnLabels = getColumnLabels(rs); // 7. 處理ResultSet,使用while迴圈 Map<String, Object> maps = null; while (rs.next()) { maps = new HashMap<>(); for (String columnLabel : columnLabels) { Object value = rs.getObject(columnLabel); maps.put(columnLabel, value); } // 11. 把一條記錄的填充好的Map物件放入5準備的List中 values.add(maps); } return values; } /** * 獲取結果集ColumnLabel對應的結果集 */ private List<String> getColumnLabels(ResultSet rs) throws SQLException { List<String> labels = new ArrayList<>(); ResultSetMetaData rsmd = rs.getMetaData(); for (int i = 0; i < rsmd.getColumnCount(); i++) { String columnLabel = rsmd.getColumnLabel(i + 1); labels.add(columnLabel); } return labels; } // 返回某條記錄的某一個欄位的值或一個統計的值(一共有多少記錄等。) <E> E getForValue(String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1. 得到結果集 conn = JDBCTools.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } rs = ps.executeQuery(); // 2. 取得結果 if (rs.next()){ return (E) rs.getObject(1); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCTools.release(rs, ps, conn); } return null; } }
View Code

測試

package com.litian.jdbc;

import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;

/**
 * @author: Li Tian
 * @contact: [email protected]
 * @software: IntelliJ IDEA
 * @file: DAOTest.java
 * @time: 2020/3/26 18:59
 * @desc: |
 */

public class DAOTest {
    public static void main(String[] args) {
        DAO dao = new DAO();
        // 測試update
        // String sql = "insert into t_user(id, username, pwd, regTime, lastLoginTime) values(?,?,?,?,?)";
        // dao.update(sql, 4, "李英俊", "123456", new Date(System.currentTimeMillis()), new Timestamp(System.currentTimeMillis()));

        // 測試get
        // String sql = "select id, username, pwd, regTime, lastLoginTime from t_user where id=?";
        // User u = dao.get(User.class, sql, 4);
        // System.out.println(u);

        // 測試getForList
        // String sql2 = "select id, username, pwd, regTime, lastLoginTime from t_user where id<?";
        // List<User> us = dao.getForList(User.class, sql2, 10);
        // System.out.println(us);

        // 測試getForValue
        String sql3 = "select username from t_user where id = ?";
        String cc = dao.getForValue(sql3, 1);
        System.out.println(cc);
    }
}
View Code