一、DAO 四個包的建立,降低代碼之間的耦合性?
之前寫代碼,都是在一個包下。代碼耦合性較高,不利於后期的維護。
dao(代碼分層?)
有利於后期的維護代碼,修改方便。
com.aaa.dao 存放dao相關的類型 處理 數據庫的鏈接 存取數據。
com.aaa.servlet 存放servlet相關的類 處理 和瀏覽器交互的類
com.aaa.entity 存放實體類 eg Student 接受數據庫對象模型
com.aaa.util 存放工具類 eg DBUtil
二、 通過servlet調用dao 演示代碼分層的好處
package com.aaa.entity; /* 1. 首先要新建數據庫 數據庫要有數據 student (id name age) 2.創建 數據庫表對應的 實體類?-----放在SRC下的com.aaa.entity包中! 實體類作用: 存儲數據庫表中的數據。 需要將數據庫表中的數據 提取到java中時 , 用對象來存儲。 3.entity? 建立數據庫對象模型。 4.在entity包下 新建student實體類 ? student實體類的作用是 用來存儲數據庫中的數據 */ public class Student { //1.成員變量 屬性? 對應數據庫的列名 private int id; private String name; private int age; /* 2.創建構造函數? 一個空參數 一個有參數 為啥? 構造函數的作用就是創建對象時完成初始化,當我們在new一個對象並傳入參數的時候,會自動調用構造函數並完成參數的初始化。 當定義一個類的時候,通常情況下都會默認一個構造函數,此默認構造函數是不帶參數的。 當自定義了含參構造函數時,默認構造函數將需要手動書寫出來。 */ public Student() { } // public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } //get set方法 Alt+insert 自動生成 按住Ctrl鍵 鼠標勾選就可以選中要生成的方法! //目的 通過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 + '}'; } }
com.aaa.entity 實體類完成。建立com.aaa.dao包,定義學生類的接口。
package com.aaa.dao; import com.aaa.entity.Student; /* * 一、學生表的DAO * 在這里 我們寫的是一個接口 定義學生類的接口 寫在dao包下 * 到包 由 接口 和 實現類組成! * * 二、implement功能如下 * 1.添加學生 * 2.根據ID刪除學生 * 3.根據ID修改學生 * 注意 接口中都是抽象的方法 ! * * 三、implement的命名規則? * IStudent ----------------------- 首字母大寫! * * */ public interface IStudentDAO { /*1.添加學生 insert into student (name,age) value(?,?); 2.兩個以上的參數 就用對象傳參 3.學生對象 存放着需要添加的學生信息 4.Boolean 成功就返回true 失敗 就 false */ boolean add(Student s); //2.根據ID刪除學生 delete from student where ID= ? boolean delete(int id); //3.根據ID添加學生 boolean update(Student s); }
接口定義完成,需要建立實現類來實現接口中的功能。在com.aaa.dao包下,新建包impl。
package com.aaa.dao.impl; import com.aaa.dao.IStudentDAO; import com.aaa.entity.Student; import com.aaa.util.DBUtil; /* 接口的實現類 在dao包下新建 impl包。 接口 和實現類 組成了 dao 包 */ public class IStudentDAOImpl 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()); } }
在包com.aaa.util下封裝DBUtil工具類,簡化操作。
package com.aaa.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /* 新建dbu工具類 簡化操作 */ public class DBUtil { static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return DriverManager.getConnection("jdbc:mysql://localhost:3306/qy66?characterEnconding=UTF-8","root","root"); } 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();//正確情況下 會返回1 if (i>0)return true; //判斷 這里是Boolean類型的返回值 } catch (SQLException e) { e.printStackTrace(); }finally { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } return false; } }
可以開始測試我們的代碼了,在com.aaa.servlet包下 創建Text類測試。
package com.aaa.servlet; import com.aaa.dao.IStudentDAO; import com.aaa.dao.impl.IStudentDAOImpl; import com.aaa.entity.Student; public class Text { public static void main(String[] args) { test01(); } public static void test01(){ Student s=new Student(5,"周旭輝",18); //測試增刪改 IStudentDAO dao=new IStudentDAOImpl(); //在數據庫表中添加數據 // dao.add(s); //刪除數據庫 表中的數據 // dao.delete(4); //修改數據庫 表中的數據 dao.update(s); } }
總結,代碼分層。降低了代碼的耦合性,優化代碼結構,便於后期維護。
