DAO 四個包的建立


一、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);

    }

}

總結,代碼分層。降低了代碼的耦合性,優化代碼結構,便於后期維護。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM