jdbc封裝 1 dao (代碼分層) com.aaa.dao 存放dao相關的類型 例如 StudentDAOImpl 處理 數據庫的鏈接 存取數據 com.aaa.servlet 存放servlet相關的類 例如:StudentServlet 處理 與瀏覽器交互的類 com.aaa.entity 存放實體類 例如 Student 接受數據庫對象模型 com.aaa.util 存放工具類 例如 DBUtil 2 練習 模擬 servlet調用 dao 2.1 創建一個數據庫表 Student( id name age ) 2.2 創建數據庫表對應的實體類 (為什么要創建實體類?作用:以后數據庫表中的數據 提取到 java中的時候 用 對象來存儲) 2.3 創建DAO A 組成 兩部分: 接口 ( 聲明 )和 實現類 接口的命名規則例如: IStudentDAO I 代表這是一個接口 Student 對應業務名稱(表名) DAO 后綴 表明當前是一個dao接口 實現類的命名規則例如: StudentDAOImpl Student 代表業務名稱(表明) DAOImpl 代表dao接口的實現 為什么需要接口+實現類? 因為 我們需要一個多態的特征。 ---------------------多態------------------------ 什么是多態? 多種狀態 如何產生多態? 繼承多態 父類的引用 子類的對象 例如 : Animal a = new Dog(); 基本上不用 接口多態 接口的應用 實現類的對象 例如: IStudentDAO dao = new StudentDAOImpl(); 為什么要使用多態? 程序解耦 解除程序的耦合性 (不使用多態會產生什么問題?) ------------------------------------------------ B 接口聲明的方法(接口中該寫哪些方法) 重要:根據業務需求 / CRUD 增刪改查 2.4 接口中 聲明 五個方法 (一個方法:返回值 參數 試想一下 這個業務的sql ) A 添加新學生 B 根據id刪除學生 C 根據id修改學生 D 根據id查詢學生 E 查詢所有學生 2.5 對方法完成實現 2.6 測試代碼 3 jdbc封裝 我們發現 在dao的實現類中 有很多重復代碼 我們可以將其封裝起來 3.1 創建一個類 DBUtil 3.2 加載驅動和建立鏈接的代碼 完全一樣 加載驅動寫到靜態代碼快中 :因為 驅動只需要加載一次即可 比如:你安裝了一台電腦 只需要下載一次qq 以后直接使用就可以了 類的靜態代碼塊 隨着類的加載 只執行一次 建立鏈接的代碼 單獨創建一個方法 通過返回值返回鏈接對象:為什么鏈接要鏈接多次 因為鏈接用完了就關閉了 3.3 關閉的代碼也需要封裝 3.4 增刪改的預處理代碼 也基本一樣 4.11日 練習 1 dao的創建 2 增刪改的三個方法(聲明) 3 學會使用 DBUtil 4 弄清楚 executeupdate的原理 5 能自主封裝 最終目的 dao封裝 20分鍾
1.創建實體類
package com.aaa.entity; /** * 學生實體類 ---- table student */ public class Student { /* 成員變量 屬性 */ private int id; private String name; private int age; /*構造函數*/ public Student() { } public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } /*set和get*/ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /*toString*/ @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
2.創建DAO(接口)
package com.aaa.dao; import com.aaa.entity.Student; /** * 學生表的DAO */ public interface IStudentDAO { /** * 添加新學生 * insert into student (name,age) values (?,?); * 兩個以上的參數 全用對象出傳參 * @param 學生對象 里面存放當這需要添加的學生信息 * @return boolean 成功返回 true 失敗 返回 false */ boolean add(Student s); /**\ * 根據id刪除學生 * delete from student where id = ? */ boolean delete(int id); /** * 根據id修改學生 * update student set name = ?,age= ? where id = ? */ boolean update(Student s); }
2.1創建dao層 (實現類)
package com.aaa.dao.impl; import com.aaa.dao.IStudentDAO; import com.aaa.entity.Student; import com.aaa.util.DBUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class StudentDAOImpl implements IStudentDAO { //借助工具類 增加數據 @Override public boolean add(Student s) { String sql = "insert into student (name,age) values (?,?)"; return DBUtil.executeUpdate(sql,s.getName(),s.getAge()); } //借助工具類 刪除 @Override public boolean delete(int id) { String sql = "delete from student where id = ?"; return DBUtil.executeUpdate(sql,id); } //借助工具類 修改數據 @Override public boolean update(Student s) { String sql = "update student set name=?,age=? where id = ?"; return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId()); }
//查詢所有
@Override public List<Map<String, Object>> getAllStu() { //原生代碼 /* try { List<Map<String,Object>> list=new ArrayList<>(); Connection conn = DBUtils.getConnection(); String sql="select * from student"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while(rs.next()){ Map<String,Object> maps=new HashMap<>(); maps.put("id",rs.getObject("id")); maps.put("name",rs.getObject("name")); maps.put("age",rs.getObject("age")); list.add(maps); } return list; } catch (SQLException e) { e.printStackTrace(); }*/
//借助工具類 查詢所有 String sql="select * from student"; List<Map<String, Object>> list = DBUtils.executeQuery(sql); if (list.size()>0){ return list; } return null; }
}
工具類
package com.aaa.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DBUtil { static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEnconding=UTF-8", "root", "123456"); } catch (SQLException e) { e.printStackTrace(); } return null; } /** 增刪改的通用方法 * @param String sql 要執行的sql * @param Object[] obj 對象類型的數組 里面存放着 sql執行的占位符參數 * 【name,age,id】 * 【id】 * 【name,age】 * Object... 可變參數 * */ public static boolean executeUpdate(String sql,Object... args){ PreparedStatement ps = null; try { ps = getConnection().prepareStatement(sql); for (int i=0;i<args.length;i++){ ps.setObject(i+1,args[i]); } /* ps.setObject(1,s.getName()); ps.setObject(2,s.getAge()); ps.setObject(3,s.getId());*/ int i = ps.executeUpdate(); if (i>0)return true; } catch (SQLException e) { e.printStackTrace(); } finally { //關閉 } return false; }
/** * 查詢的通用方法 * @param sql * @param args * @return */ public static List<Map<String, Object>> executeQuery(String sql, Object... args) { try { /** * 需要將所有數據都存到List中 每一行 用一個map存放 */ List<Map<String, Object>> list = new ArrayList<>(); Connection conn = DBUtils.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); /** * 有可能有參數 查詢不是所有 而是查詢其中幾條 */ for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } /** * 執行sql */ ResultSet rs = ps.executeQuery(); /** *獲得本次查詢的總列數 */ int count = rs.getMetaData().getColumnCount(); while (rs.next()) { Map<String, Object> maps = new HashMap<>(); for (int i = 1; i <= count; i++) { /** * 獲得每列的字段名 */ String name = rs.getMetaData().getColumnLabel(i); maps.put(name, rs.getObject(i)); } /** * 將每行的map存放到List中 */ list.add(maps); } return list; } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 關閉的通用方法 */ private static void close(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } }
}
測試類(模擬Servlet)
package com.aaa.servlet; import com.aaa.dao.IStudentDAO; import com.aaa.dao.impl.StudentDAOImpl; import com.aaa.entity.Student; import org.junit.Test; public class JavaTest { @Test public void test1(){ Student s = new Student(1, "測試吃飯", 28); /*測試 dao 的增刪改*/ IStudentDAO dao = new StudentDAOImpl(); /*增*/ dao.add(s); dao.delete(3); dao.update(s);
//查詢所有 借助工具類 增刪改代碼可不寫 IStudentDAO sd=new StudentDAOImpl(); List<Map<String, Object>> allStu = sd.getAllStu(); System.out.println(allStu);
}
}