BaseDao

#### 10.1 DAO概念> DAO:Data Access Object,數據訪問對象。
>
> Java是面向對象語言,數據在Java中通常以對象的形式存在。一張表對應一個實體類,一張表的操作對應一個DAO對象!

? ? >

> 在Java操作數據庫時,我們會將對同一張表的增刪改查操作統一維護起來,維護的這個類就是DAO層。
>

????在開發中,我們會為數據庫中的每一張表創建一個對應的DAO 類,這個 DAO 類專門負責處理與該表相關的所有數據庫操作。

  • 如果數據庫中有一張user表(存儲用戶信息),我們就會創建一個UserDAO
  • 這個UserDAO類中只會包含對user表的操作方法:
    • 添加用戶(對應user表的 INSERT 操作)
    • 查詢用戶(對應user表的 SELECT 操作)
    • 更新用戶(對應user表的 UPDATE 操作)
    • 刪除用戶(對應user表的 DELETE 操作)
DAO層只關注對數據庫的操作,供業務層Service調用,將職責劃分清楚!# 10.1 BaseDAO概念> 基本上每一個數據表都應該有一個對應的DAO接口及其實現類,發現對所有表的操作(增、刪、改、查)代碼重復度很高,所以可以抽取公共代碼,給這些DAO的實現類可以抽取一個公共的父類,復用增刪改查的基本操作,我們稱為BaseDAO。/*** 通用的查詢:多行多列、單行多列、單行單列*      多行多列:List<Employee>*      單行多列:Employee*      單行單列:封裝的是一個結果。Double、Integer、。。。。。*  封裝過程:*      1、返回的類型:泛型:類型不確定,調用者知道,調用時,將此次查詢的結果類型告知BaseDAO就可以了。*      2、返回的結果:通用,List  可以存儲多個結果,也可以存儲一個結果 get(0)*      3、結果的封裝:反射,要求調用者告知BaseDAO要封裝對象的類對象。 Class*/

?if(params!=null && params.length > 0){
for (int i = 0; i < params.length; i++) {
//占位符是從1開始的。參數的數組是從0開始的
preparedStatement.setObject(i+1,params[i] );
}
}

? ? /*
通用的查詢多個Javabean對象的方法,例如:多個員工對象,多個部門對象等
這里的clazz接收的是T類型的Class對象,
如果查詢員工信息,clazz代表Employee.class,
如果查詢部門信息,clazz代表Department.class,
返回List<T> list
*/

? ? ? ?/*
獲取結果集的元數據對象。
元數據對象中有該結果集一共有幾列、列名稱是什么等信息
*/

? ResultSetMetaData metaData = res.getMetaData();
int columnCount = metaData.getColumnCount();//獲取結果集列數

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;/*** 將共性的數據庫的操作代碼封裝在BaseDAO里。*/
public class BaseDAO {/*** 通用的增刪改的方法。* @param sql 調用者要執行的SQL語句* @param params SQL語句中的占位符要賦值的參數* @return 受影響的行數*/public int executeUpdate(String sql,Object... params)throws Exception{//1.通過JDBCUtilV2獲取數據庫連接Connection connection = JDBCUtilV2.getConnection();//2.預編譯SQL語句PreparedStatement preparedStatement = connection.prepareStatement(sql);//4.為占位符賦值,執行SQL,接受返回結果if(params!=null && params.length > 0){for (int i = 0; i < params.length; i++) {//占位符是從1開始的。參數的數組是從0開始的preparedStatement.setObject(i+1,params[i] );}}int row = preparedStatement.executeUpdate();//5.釋放資源preparedStatement.close();if(connection.getAutoCommit()){JDBCUtilV2.release();}//6.返回結果return row;}/*** 通用的查詢:多行多列、單行多列、單行單列*      多行多列:List<Employee>*      單行多列:Employee*      單行單列:封裝的是一個結果。Double、Integer、。。。。。*  封裝過程:*      1、返回的類型:泛型:類型不確定,調用者知道,調用時,將此次查詢的結果類型告知BaseDAO就可以了。*      2、返回的結果:通用,List  可以存儲多個結果,也可以存儲一個結果 get(0)*      3、結果的封裝:反射,要求調用者告知BaseDAO要封裝對象的類對象。 Class*/public <T> List<T> executeQuery(Class<T> clazz,String sql,Object... params)throws Exception{//獲取連接Connection connection = JDBCUtilV2.getConnection();//預編譯SQL語句PreparedStatement preparedStatement = connection.prepareStatement(sql);//設置占位符的值if(params!=null && params.length > 0){for (int i = 0; i < params.length; i++) {preparedStatement.setObject(i+1, params[i]);}}//執行SQL,并接受返回的結果集ResultSet resultSet = preparedStatement.executeQuery();//獲取結果集中的元數據對象//包含了:列的數量、每個列的名稱ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();List<T> list = new ArrayList<>();//處理結果while(resultSet.next()){//循環一次,代表有一行數據,通過反射創建一個對象T t = clazz.newInstance();//循環遍歷當前行的列,循環幾次,看有多少列for (int i = 1; i <=columnCount ;i++){//通過下表獲取列的值Object value = resultSet.getObject(i);//獲取到的列的value值,這個值就是t這個對象中的某一個屬性//獲取當前拿到的列的名字 = 對象的屬性名String fieldName = metaData.getColumnLabel(i);//通過類對象和fieldName獲取要封裝的對象的屬性Field field = clazz.getDeclaredField(fieldName);//突破封裝的privatefield.setAccessible(true);field.set(t,value);}list.add(t);}resultSet.close();preparedStatement.close();if(connection.getAutoCommit()){JDBCUtilV2.release();}return list;}/*** 通用查詢:在上面查詢的集合結果中獲取第一個結果。 簡化了獲取單行單列的獲取、單行多列的獲取*/public <T> T executeQueryBean(Class<T> clazz,String sql,Object... params)throws Exception{List<T> list = this.executeQuery(clazz, sql, params);if(list ==null || list.size() == 0){return null;}return list.get(0);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91364.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91364.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91364.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

USRP捕獲手機/路由器數據傳輸信號波形(中)

目錄&#xff1a; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;上&#xff09; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;中&#xff09; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;下&#xff09; 三、雙工通信信號捕獲 3.1 信號接收系統 5805e6Hz&a…

使用 Kiro AI IDE 3小時實現全棧應用Admin系統

Hello&#xff0c; 大家好&#xff0c;我是程序員海軍, 全棧開發 |AI愛好者 &#xff5c; 獨立開發。 之前我是采用Node生態開發的大模型以及MCP Server,大模型開發的生態主要是Python語言&#xff0c;為了更好的學習大模型開發&#xff0c;于是開了新坑。開始學習Python, 以及…

瀏覽器pdf、image顯示

瀏覽器地址欄 pdf data:application/pdf;base64, data:application/pdf;base64,JVBERi0xLjcKJeLjz9MKMjMgMCBvYmoKPDwv image data:image/jpeg;base64, data:image/jpeg;base64,/9j/4Q3fRXhpZgAATU0AKgAAAAgABwE

《Linux運維總結:銀河麒麟V10 SP3啟動docker容器報錯permission denied》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、環境信息 二、背景 1、使用docker啟動一個nginx容器&#xff0c;報錯信息如下&#xff1a; docker: Error response from…

PDF源碼解析

PDF源碼解析打開PDF解析PDF?0. 文件頭關鍵信息解析技術原理圖解文件頭的重要性實際文件結構示例開發者注意事項歷史背景1. 根目錄整體結構關鍵字段解析核心概念解釋實際應用場景完整對象關系圖技術總結2. 頁面樹對象結構關鍵字段解析頁面樹工作原理技術要點總結實際應用3. 圖像…

java開閉原則 open-closed principle

基本知識 1.核心思想&#xff1a;面向抽象編程 2.基本內涵&#xff1a;對修改關閉&#xff0c;對擴展開放 3.要求&#xff1a;盡可能不修改源碼而是增加新功能 例子 以spring5核心原理與30個類手寫實戰中的為例 package com.gupaoedu.vip.design.principle.openclose;/*** Crea…

擁抱智慧物流時代:數字孿生技術的應用與前景

概述 在數字經濟全面推進的當下&#xff0c;物流行業正經歷著前所未有的智能化升級。作為新一代信息技術的重要代表&#xff0c;數字孿生技術正悄然改變著物流的運作方式和決策模式。所謂數字孿生&#xff0c;是指在虛擬空間中創建與現實物流系統高度一致的數字模型&#xff0…

libnest2d-頭文件分析-libnest2d.hpp-幾何類型-策略類型-參數配置

libnest2d 庫的主頭文件&#xff0c;定義了一個用于 二維不規則形狀自動排樣&#xff08;Nesting&#xff09; 的C接口。以下是詳細解析&#xff1a;1. 頭文件結構 (1) 防止重復包含 #ifndef LIBNEST2D_HPP #define LIBNEST2D_HPP // ... #endif // LIBNEST2D_HPP確保頭文件只被…

【Docker】部署Docker可視化管理面板Dpanel

一、DPanel 介紹 1.1 DPanel 簡介 DPanel 是一款專為 Docker 設計的可視化管理面板&#xff0c;旨在降低容器、鏡像及相關資源的管理門檻。通過簡潔直觀的圖形化界面&#xff0c;即使是對 Docker 不熟悉的用戶&#xff0c;也能輕松上手&#xff0c;實現容器化應用的高效部署與管…

GCC/G++ + Makefile/make 使用

一、gcc\g編譯器 什么是gcc和g&#xff0c;它們的區別又是什么&#xff1f; gcc編譯器是專門用來編譯C語言的&#xff0c;而g編譯器既可以編譯C語言又可以用來編譯C&#xff0c;但是主要還是用來編譯C。 我們都知道代碼形成可執行程序都是需要經過預處理、編譯、匯編和鏈接這四…

重復文件查找工具:DataSecurity Plus 全面提升企業文件管理效率

企業日常運營經常會出現這樣的場景&#xff1a;員工在文件傳輸、共享與備份過程中&#xff0c;因操作不當或系統設置問題&#xff0c;出現文件重復存儲&#xff1b;跨部門協作時&#xff0c;相同的項目資料可能被多次保存&#xff1b;隨著數據遷移與系統升級&#xff0c;重復文…

【軟件架構】資源池架構設計中的三種主流模式

在資源池架構設計中&#xff0c;三種主流模式——集中式、分布式和混合式資源池——各有其獨特的優勢、劣勢和適用場景。理解它們的區別對于設計高效、可靠和可擴展的系統至關重要。 下面是對這三種模式的詳細分析和比較&#xff1a;集中式資源池 核心概念&#xff1a; 將所有計…

Java 類加載沖突

在某次線上部署過程中&#xff0c;我們遇到了一個十分詭異的問題&#xff1a;同樣的應用&#xff0c;在 ext3 文件系統下運行正常&#xff0c;但部署到 ext4 文件系統下卻出現了如下異常&#xff1a;The methods class, com.ctc.wstx.io.StreamBootstrapper, is available from…

VMware安裝 統信UOS桌面專業版

前言 近年來&#xff0c;隨著Linux發行版在開發者、企業環境中的應用逐漸增多&#xff0c;國產操作系統統信UOS&#xff08;基于Debian&#xff09;因其良好的圖形化界面和本地化支持&#xff0c;成為不少用戶體驗Linux生態的選擇之一。本文將以VMware Workstation Pro 17為例…

SAP Datasphere 02 - 建模

創建連接創建到 HANA Cloud 實例的連接查看 HANA Cloud實例連接 Endpoint創建連接選擇連接類型配置連接信息&#xff0c;授權方式&#xff0c;用戶名密碼等配置連接名稱驗證連接導入數據源表創建目錄 Hotel &#xff0c;放置建模對象點擊新建目錄&#xff0c;導入遠程表選擇數據…

isasssim robotiq夾爪踩坑

1. usd導出urdf失敗在isasssim的仿真中的 robotiq 2f夾爪&#xff0c;首先目前4.5asset里面的usd不能直接轉urdf&#xff0c;因為模型中存在 “閉環連接”&#xff0c;即某個部件&#xff08;或關節&#xff09;同時與兩個及以上的父部件相連&#xff0c;形成類似 “三角形” 的…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Pokedex(寶可夢圖鑒)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— Pokedex組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 結合 PokeAPI 來創建一個炫酷的寶可夢圖鑒應用。通過這個…

【Practical Business English Oral Scene Interpretation】在職主持會議-安排任務+結束會議

文章目錄Introduction1. 討論代辦事項2. 分配工作任務3. 說明截止日期4. 說明截止日期5. 感謝參會者Introduction Note that each row of the table represents the content of the conversation in order. 1. 討論代辦事項 AlexBarryNoteLet’s review the to-dos from the…

ansible簡單playbook劇本例子

1. 創建主機清單vim inventory.ini192.168.100.181[web:vars] ansible_userroot ansible_passwordAdmin123456[web] 192.168.100.1822. 創建一個簡單的劇本vim playbook.yaml- name: My first playhosts: webtasks:- name: Ping my hostsansible.builtin.ping:- name: Print me…

愛心煙花浪漫立方體輪播圖 - 用代碼表達愛意

項目介紹 這是一個專為表白和營造浪漫氛圍而設計的3D立方體輪播圖結合了現代Web技術與浪漫元素&#xff0c;通過立方體的旋轉展示珍貴的照片&#xff0c;同時配有愛心飄動、流星劃過、煙花綻放和雪花飛舞等浪漫特效&#xff0c;為你的表白增添獨特的科技浪漫。 效果展示截圖原…