jdbc增刪改查進行封裝


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

 



    }

}

 


免責聲明!

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



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