JDBC的封裝,自己總結的自己總結的自己總結的
dao (代碼分層)命名規范:
1、com.XXX.dao 存放dao相關的類型 例如 StudentDAOImpl 處理 數據庫的鏈接 存取數據
2、com.XXX.servlet 存放servlet相關的類 例如:StudentServlet 處理 與瀏覽器交互的類
3、com.XXX.entity 存放實體類 例如 Student 接受數據庫對象模型
4、com.XXX.util 存放工具類 例如 DBUtil
操作步驟:
首先,創建一個數據庫表單,起名為Studetn。內有:id、name、age、sex四個屬性。將id設為主鍵並且設置自動遞增。
第二,在數據庫建立完表單之后,在Java中創建一個數據庫表單的實體類。(類名和表名一致)
內有:
1、表單的屬性值和屬性的基本數據類型。
2、無參的構造函數。
3、有參的構造函數。
4、Get和Set方法。
5、toString方法。
第三:創建一個工具類。
內有:
1、寫一個靜態代碼塊。將注冊驅動寫入其中。
原因:驅動只需要加載一次即可,
所以寫在靜態代碼段中(static),類的靜態代碼塊,隨着類的加載,只執行一次。
2、將建立連接進行封裝。
3、將增刪改的通用方法也一並進行封裝。
第四,先在dao層創建一個接口
內有:
1、返回值類型和方法名、參數。
1.1、可根據增刪改分為不同的寫法。
1.2、兩個以上的參數,全部使用對象傳參。
第五:在dao層下創建一個包,命名為Impl,在這個包內創建一個接口實現類。
內有:
1、寫入SQL語句,要增刪改的內容可用占位符代替。
2、返回在工具類里給增刪改通用方法設定的調用方法。
3、在返回調用方法里加入占位符所代表的對象。
第六:在servlet里創建測試類。
內有:
1、通過創建的實體類來賦值。
2、通過實現類來調用接口里的方法。
3、調用方法。
實例:
第一步:創建數據庫表單。

第二步: 創建一個數據庫表單的實體類。
1 package com.Wuchuang.entiy; 2 3 public class Student { 4 5 private int id; 6 private String name; 7 private int age; 8 private String sex; 9 10 11 public Student() { 12 } 13 14 public Student(int id, String name, int age, String sex) { 15 this.id = id; 16 this.name = name; 17 this.age = age; 18 this.sex = sex; 19 } 20 21 public int getId() { 22 return id; 23 } 24 25 public void setId(int id) { 26 this.id = id; 27 } 28 29 public String getName() { 30 return name; 31 } 32 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public int getAge() { 38 return age; 39 } 40 41 public void setAge(int age) { 42 this.age = age; 43 } 44 45 public String getSex() { 46 return sex; 47 } 48 49 public void setSex(String sex) { 50 this.sex = sex; 51 } 52 53 @Override 54 public String toString() { 55 return "Student{" + 56 "id=" + id + 57 ", name='" + name + '\'' + 58 ", age=" + age + 59 ", sex='" + sex + '\'' + 60 '}'; 61 } 62 }
第三步:創建一個工具類。
1 package com.Wuchuang.util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.SQLException; 7 8 public class DBUtil { 9 //注冊驅動,驅動只需要加載一次即可 10 //所以寫在靜態代碼段中(static) 11 //類的靜態代碼塊,隨着類的加載,只執行一次。 12 static { 13 try { 14 Class.forName("com.mysql.jdbc.Driver"); 15 } catch (ClassNotFoundException e) { 16 e.printStackTrace(); 17 } 18 } 19 //建立鏈接。需要單獨創建一個方法。 20 //通過返回值返回鏈接對象。 21 //鏈接每次用完之后就會關閉。 22 public static Connection getConnection() { 23 try { 24 return DriverManager.getConnection("jdbc:mysql:///test?characterEnconding=UTF-8", "數據庫賬戶", "密碼"); 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } 28 return null; 29 } 30 31 /** 增刪改的通用方法 32 * @param String sql 要執行的sql 33 * @param Object[] obj 對象類型的數組 里面存放着 sql執行的占位符參數 34 * Object... 可變參數 35 * */ 36 public static boolean executeUpdate(String sql,Object... args){ 37 PreparedStatement ps = null; 38 39 try { 40 ps = getConnection().prepareStatement(sql); 41 for (int i = 0;i<args.length;i++){ 42 ps.setObject(i+1,args[i]); 43 } 44 int i = ps.executeUpdate(); 45 if (i>0)return true; 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 }finally {
close(conn,ps,null);
}
49 return false;
50 }
51 }
1 // c查詢的通用方法 2 public static List<Map<String,Object>> executeQuery(String sql,Object... args){ 3 Connection conn = null; 4 PreparedStatement ps = null; 5 ResultSet set = null; 6 try { 7 conn = DBUtil.getConnection(); 8 ps = conn.prepareStatement(sql); 9 /* 有可能有參數 */ 10 for (int i=0;i<args.length;i++){ 11 ps.setObject(i+1,args[i]); 12 } 13 /*執行*/ 14 set = ps.executeQuery(); 15 /*需要將所有數據都存放到 List中 每一行 用一個 map存放*/ 16 List<Map<String,Object>> list = new ArrayList<>(); 17 /*獲取本次查詢結果集有多少列*/ 18 int count = set.getMetaData().getColumnCount(); 19 20 while(set.next()){ 21 Map<String, Object> map = new HashMap<>();//一行數據 用一個map 接收 22 23 for(int i=0;i<count;i++){ 24 String name = set.getMetaData().getColumnLabel(i+1); 25 map.put(name,set.getObject(name)); 26 } 27 /*將每行的map存放到 List中*/ 28 list.add(map); 29 } 30 return list; 31 } catch (Exception e) { 32 e.printStackTrace(); 33 }finally { 34 close(conn,ps,set); 35 } 36 return null; 37 } 38 39 / /關閉的通用方法 40 private static void close(Connection conn,PreparedStatement st,ResultSet set){ 41 try { 42 if(set!=null){ 43 set.close(); 44 } 45 if(st!=null){ 46 st.close(); 47 } 48 if(conn != null){ 49 conn.close(); 50 } 51 }catch (Exception e){ 52 e.printStackTrace(); 53 } 54 } 55 }
第四步:在dao層創建一個接口。
1 package com.Wuchuang.dao; 2 3 import com.Wuchuang.entiy.Student; 4 5 public interface IStudentDAO { 6 /** 7 * 添加新學生 8 * insert into student (name,age,sex) values (?,?,?); 9 * 兩個以上的參數 全用對象傳參 10 * @param 學生對象 里面存放當着需要添加的學生信息 11 * @return boolean 成功返回 true 失敗 返回 false 12 */ 13 boolean add (Student s); 14 15 16 /** 17 * 根據id刪除學生,所以返回值可以直接填寫id的數據類型和id 18 * delete from student where id = ? 19 */ 20 boolean delete(int id); 21 22 23 /** 24 * 根據id修改學生 25 * update student set name = ?,age= ? where id = ? 26 */ 27 boolean update(Student s); 28 }
第五步:創建一個接口實現類。
1 package com.Wuchuang.dao.Impl; 2 3 import com.Wuchuang.dao.IStudentDAO; 4 import com.Wuchuang.entiy.Student; 5 import com.Wuchuang.util.DBUtil; 6 7 public class StudentDAOImpl implements IStudentDAO { 8 @Override 9 public boolean add(Student s) { 10 String sql = "insert into Student (name,age,sex) values (?,?,?)"; 11 12 return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex()); 13 } 14 15 @Override 16 public boolean delete(int id) { 17 String sql = "delete from Student where id = ?"; 18 19 return DBUtil.executeUpdate(sql,id); 20 } 21 22 @Override 23 public boolean update(Student s) { 24 String sql = "update Student set name = ?,age = ?,sex = ? where id = ?"; 25 26 return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getSex(),s.getId()); 27 28 } 29 }
第六步:進行測試。
1 package com.Wuchuang.servlet; 2 3 import com.Wuchuang.dao.IStudentDAO; 4 import com.Wuchuang.dao.Impl.StudentDAOImpl; 5 import com.Wuchuang.entiy.Student; 6 import org.junit.Test; 7 8 public class ServletTest{ 9 @Test 10 public void test(){ 11 Student s = new Student(1,"吃飯",38,"男"); 12 13 IStudentDAO dao = new StudentDAOImpl(); 14 15 dao.add(s); 16 } 17 18 }
2019年4月11日17:22:31
