前言
前面有一章節,我專門講解了Java通過JDBC 進行MySQL數據庫操作,這主要講解了MySQL數據庫的連接和簡單的操作,但是在真正的Java項目中,我們要不斷的和數據庫打交道,為了提高數據庫操作的執行效率和增加代碼的復用性,將重新封裝一個Dao層,也就是數據訪問層 ,用來訪問數據庫實現數據的持久化。
Dao層設計
Dao層操作通用的步驟:
- 1.寫SQL語句
- 2.獲取連接
- 3.創建stmt
- 4.執行sql
a)更新
String sql = “delete from admin where id=?””;
String sql = “insert into admin (userName,pwd) values (?,?)”
public void update(String sql, Object[] paramValues);b)查詢
String sql = “select * from admin”;
String sql = “select * from admin where id=? And pwd =?”;
// 傳入的什么類型的對象,就封裝為什么類型
// 要求: 列的名稱,要與指定類型的對象的屬性名稱一樣
Public List query (String sql , Object[] paramValues , Class clazz);
T t; // 對象賦值
- 5.關閉/異常
編寫BaseDao,自己寫的所有的Dao都繼承此類
其中JDBCUtil類在上篇博文Java通過JDBC 進行MySQL數據庫操作中有詳細介紹,這里就比說了。
/** * 通用的dao,自己寫的所有的dao都繼承此類; * 此類定義了2個通用的方法: * 1. 更新 * 2. 查詢 * @author Charlie.chen * */ public class BaseDao { // 初始化參數 private Connection con; private PreparedStatement pstmt; private ResultSet rs; /** * 查詢的通用方法 * @param sql * @param paramsValue */ public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){ try { // 返回的集合 List<T> list = new ArrayList<T>(); // 對象 T t = null; // 1. 獲取連接 con = JdbcUtil.getConnection(); // 2. 創建stmt對象 pstmt = con.prepareStatement(sql); // 3. 獲取占位符參數的個數, 並設置每個參數的值 int count = pstmt.getParameterMetaData().getParameterCount(); if (paramsValue != null && paramsValue.length > 0) { for (int i=0; i<paramsValue.length; i++) { pstmt.setObject(i+1, paramsValue[i]); } } // 4. 執行查詢 rs = pstmt.executeQuery(); // 5. 獲取結果集元數據 ResultSetMetaData rsmd = rs.getMetaData(); // ---> 獲取列的個數 int columnCount = rsmd.getColumnCount(); // 6. 遍歷rs while (rs.next()) { // 要封裝的對象 t = clazz.newInstance(); // 7. 遍歷每一行的每一列, 封裝數據 for (int i=0; i<columnCount; i++) { // 獲取每一列的列名稱 String columnName = rsmd.getColumnName(i + 1); // 獲取每一列的列名稱, 對應的值 Object value = rs.getObject(columnName); // 封裝: 設置到t對象的屬性中 【BeanUtils組件】 BeanUtils.copyProperty(t, columnName, value); } // 把封裝完畢的對象,添加到list集合中 list.add(t); } return list; } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtil.closeAll(con, pstmt, rs); } } /** * 更新的通用方法 * @param sql 更新的sql語句(update/insert/delete) * @param paramsValue sql語句中占位符對應的值(如果沒有占位符,傳入null) */ public void update(String sql,Object[] paramsValue){ try { // 獲取連接 con = JdbcUtil.getConnection(); // 創建執行命令的stmt對象 pstmt = con.prepareStatement(sql); // 參數元數據: 得到占位符參數的個數 int count = pstmt.getParameterMetaData().getParameterCount(); // 設置占位符參數的值 if (paramsValue != null && paramsValue.length > 0) { // 循環給參數賦值 for(int i=0;i<count;i++) { pstmt.setObject(i+1, paramsValue[i]); } } // 執行更新 pstmt.executeUpdate(); } catch (Exception e) { throw new RuntimeException(e); } finally { JdbcUtil.closeAll(con, pstmt, null); } }
編寫實際操作的Dao類繼承自BaseDao
public class AdminDao extends BaseDao { // 刪除 public void delete(int id) { String sql = "delete from admin where id=?"; Object[] paramsValue = {id}; super.update(sql, paramsValue); } // 插入 public void insert(Admin admin) { String sql = "insert into admin (userName,pwd) values (?,?)"; Object[] paramsValue = {admin.getUserName(),admin.getPwd()}; super.update(sql, paramsValue); } // 查詢全部 public List<Admin> getAll(){ String sql = "select * from admin"; List<Admin> list = super.query(sql, null, Admin.class); return list; } // 根據條件查詢(主鍵) public Admin findById(int id){ String sql = "select * from admin where id=?"; List<Admin> list = super.query(sql, new Object[]{id}, Admin.class); return (list!=null&&list.size()>0) ? list.get(0) : null; } }
JavaBean類
/** * 1. bean類設計 * @author Charlie.chen * */ public class Admin { private int id; private String userName; private String pwd; private int age; private Date birth; public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "Admin [age=" + age + ", birth=" + birth + ", id=" + id + ", pwd=" + pwd + ", userName=" + userName + "]"; } }