JAVA全棧開發 day21_JDBC與反射結合、設計模式

一、總結

一階段

day01 java 發展,java 環境( path, java_home, class_path),java 原理, java 執行 , jvm , jre , jdk

day02 變量 標識符命名規則 數據類型 數據類型的轉換 運算符

day03 選擇結構 if , switch

day04 循環結構 for , while , do-while

day05 雙重循環(打印星星)

day06 數組(一維數組):排序(冒泡,選擇),數據的擴容與縮容

day07 ATM機

二階段

面向對象

day08?            面向過程,**面向對象的思想**(基于對象 -》類), 類與對象的關系, 類是模板。?           類和對象的概念?           方法?             重載?           類的包括(成員變量,成員方法)day09 ?        封裝?              this?              private ?              構造函數day10?     繼承( 多個類重復的信息,提供一個公共類,使用繼承去實現)?             extends ?             特點:只能單繼承不能多繼承?            子類可以繼承父里哪些(私有的繼承不了)?           重寫day11?     多態?            要有繼承 ?            要有重寫?           要有父指子類的引用?           (編譯看左邊,除了方法運行看右邊外,其它的運行也是看左邊; 為什么方法運行看右邊,因為它實現重寫)day12?    抽象類與接口?     抽象類: 包括抽象方法類,一定要抽象 類,抽象類可以有構造方法,抽象 方法,還可以有普通方法; 只是不能實例化?    接口: 一定要抽象方法, jdk 1.8  default , static jdk 1.9 private 方法(主要指default使用)?       多態的分類?          具體類多態?          抽象 類多態?          接口多態 (用的最多)?       抽象類與接口區別?          關系 ?              類與類,接與接口,類與接口?          成員?              成員屬性?              構造方法?              成員方法?           設計  is a  ,  like a day13 - day14 Math, String , Object ,  Date , Calendar , 包裝類 , 正則表達式 , Scanner , Random 等day16代碼塊內部類成員內部類,局部內容部, 匿名內類部(本質是一個對象)lamda表達式day17 異常day 18 IOday 19 網絡編程day20 多線程**day21-day22 集合** ?           				    單列 (Connection)                        雙列(Map)?             list                                set                   HashMap    HashTable ... ?    ArrayList,  LinkedList, Vecktor       HashSet, TreeSet           put() :存值 ,如果 鍵名相同,就是修改值 .  鍵不能重復?           考原理:數組與鏈表               (底層HashMap, Jdk1.9 結合紅黑樹去實現)?                                                                        哈希表(數組+鏈表的結合)day 23-24 Mysql ?  關系型數據 ?  增刪改查(mysql )約束(外鍵約束)查詢 (表連接, join, left join ,right join )索引 ?    事務(ACID): 隔離性(臟讀,不可重復讀,幻讀  =》  sql 隔離級別)mysql 存儲引擎(不同引擎它的支持不一樣)day 25 JDBCjava 去連接數據的一種技術 (JDBC api )不同數據庫去實現JDBC 接口下載jar使用jarjdbc連接數據的步驟:1. 注冊驅動
2. 創建連接對象
3. 創建sql執行對象  statement
4. 寫sql 語句,且調用對象的方法執行。 excuteQuery()  , excuteUpdate();
5. 如果是查詢,處理結果集
6. 釋放資源 封裝 1. 把重復,提成一個方法(創建連接的方法, 釋放資源的方法)
2. 把提取方法專門一個獨立的類里(JdbcUtils)
3. jdbc連接時,url , 驅動, 用戶名,密碼; 因為它們可能進行修改,所有獨立配置文件,提高了代碼的維護性day 26 反射使用Class 對象,獲取成員屬性,構造方法,成員方法(動態代理)1. 獲取 Class 對象類名.class;對象名.getClass();Class.forName(類名-包括包名);2. 構造方法      3. 成員屬性(在使用時,必須要有對象)4. 成員方法(在使用時,必須要有對象)(加s 的表示獲取所有, 不加s表示獲取單個) -- 默認這些方法都調用的public修飾如果要獲取所有修飾的類型。 給方法一個Declared 注: 如果是私有的,即便獲取 了,也不能使用,如果要使用,把java安全語法檢查跳過.    xxx.setAccessable(true);

作業

  1. 寫一個setProperty(Object obj, String propertyName, object value){}

  2. 給ArrayList的一個對象,添加一個字符串

  3. curd(增刪改查)商品

    商品表(goods)

    ? g_id,g_name,g_price,g_num

? 思路:

        1.  創建表2.  接口(定義方法)3.  寫一個Jdbc工具類4.  接口的實現5.  測試類,調用實現類的方法

二、JDBC 與反射結合

封裝了兩個方法: 增刪改 excuteUpdate, 查詢 excuteQuery

public class JdbcUntils {static {//1.注冊驅動  告訴jdbc我們使用哪一個數據庫廠商的驅動try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}//寫一個jdbc 工具類Connection connection = null;PreparedStatement st = null;ResultSet rs = null;//分析:// 當前方法寫完了,發現sql 語句是不是直接傳過來,可以如果 有參數,直接進行sql拼接會產生sql注入風險// 所以,就考慮使用參數化// 將數據,傳過來,傳來后,使用PreparedStatement添加參數public int excuteUpdate(String sql,Object... params)   {int result = -1;try {//2. 創建連接connection = getConnection();//3. 創建statement對象//這個里包括了? ,所以需要參數指定st = connection.prepareStatement(sql);//要把參數加到PreparedStatement對象中//pst.setString(1,username);// pst.setString(2,pwd);for (int i = 0; i < params.length; i++) {st.setObject((i + 1), params[i]);}result = st.executeUpdate();//4. release 釋放資源release();}catch (SQLException e){e.printStackTrace();result = -1;}finally {return result;}}public <T>  List<T> excuteQuery(String sql,Class<T> c,Object... prarms){//創建一個集合,存放所有的結果對象List<T> list  = new ArrayList<>();try {connection = getConnection();//	3. 獲得執行對象  Statement// 查詢 里的sql語句也可以能有參數st = connection.prepareStatement(sql);//添加參數for (int i = 0; i < prarms.length; i++) {st.setObject((i + 1), prarms[i]);}//	4. 執行sql并獲得結果集(ResultSet)rs = st.executeQuery();// 4.1 得到結果集的元數據ResultSetMetaData ms = rs.getMetaData();//列的數量int colCount = ms.getColumnCount(); // 處理結果while (rs.next()){
//                int i = 1;//添加一個 T類的實例T t = c.getDeclaredConstructor().newInstance();// 1. 得到結果集,列名數組//2. 循環列名//   循環體里,根據列名,去找對象的對應的字段 ,然后在進行賦值for(int i=1;i<=colCount;i++){Object value = rs.getObject(i);if(value!=null){//將這對應的值,放到對象對應的字段中String colName = ms.getColumnName(i);//通過反射,設置字段的值//要求結果的列名,與實體對象的屬性(字段名)相同Field field = c.getDeclaredField(colName);// 跳出java的語法檢查 field.setAccessible(true);// 給字段設置對應的值 field.set(t,value);}}list.add(t);//給實例對象的每個屬性,賦值// 方法一: 獲取所有字段進行賦值,這個要求字段與數據的列的順序要求一致
//                Field[] Fields = c.getDeclaredFields(); //獲取所有的字段
//                for(Field field : Fields){
//                    //缺點: 實體的字段 與數據查詢 出來的字段要一一對應
//                    //思路: 如果不對應怎么?
//                    // 最好,可以得到結果集的列名,根據列名,給對應的字段賦值
//
//                    // 這里值 ,應該從結果集
//                    field.set(t,rs.getObject(i++));
//                }//T對象加入到list中}// 	5. 處理結果集release();}catch (Exception e){e.printStackTrace();list = null;} finally {return list;}}//創建連接public Connection getConnection() throws SQLException {//2.通過驅動管理器獲取一個鏈接Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/j352", "root", "");return  connection;}//釋放資源public  void release(){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}rs =null; //讓jvm來回收它}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}st =null; //讓jvm來回收它}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}connection =null; //讓jvm來回收它}}}

三、設計原則

1)創建軟件應用程序是為了滿足不斷變化和發展的需求。一個成功的應用程序還應該提供一種簡單的方法來擴展它以滿足不斷變化的期望。如果在設計和開發軟件時應用一組面向對象的設計原則和模式,則可以避免或解決這些常見問題。

2)面向對象的設計原則也被稱為 SOLID 。在設計和開發軟件時可以應用這些原則,以便創建易于維護和開發的程序。

SOLID 原則包括,單一職責原則、開閉原則、里氏替換原則、接口隔離原則和依賴倒置原則。

單一職責原則:每個類只負責做一件事

專業的人做專業的事。每個類只負責做一件事

單一職責原則,其它就是“高內聚”的體現。

每個類只負責做一件事, 對外只提供一個功能,而引起類的變化 的原因應該只有一個。

開閉原則 : 對擴展開放,對修改關閉

核心思想:一個對象 對擴展開放,對修改關閉

對類的改動是通過增加代碼進行,而不是修改代碼

如何實現?這就需要借助于抽象 和多態。即把可能變化 的內容抽象 出來.

因為抽象的部分是相對穩定

里氏替換原則

子類可以擴展父類的功能,但不能改變父類原有的功能

子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。

接口隔離原則

別人不需要的東西不要強加給人家。

接口隔離原則是為了約束接口,降低類對接口的依賴。

接口隔離原則是為了約束接口,降低類對接口的依賴。
接口隔離原則的優點:
1)靈活性,可維護性增強
2)高內聚,低耦合
3)減少代碼冗余(減少了方法的實現)
4)體現對象層次

依賴倒置原則

依賴于抽象,而不是依賴于具體,依賴注入模式

依賴倒置原則(Dependency Inversion Principle,DIP)是面向對象設計中的一個原則,它是SOLID原則中的一部分。依賴倒置原則的核心思想是:

高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象; 抽象不應該依賴于具體細節,而具體細節應該依賴于抽象。

(依賴于抽象)

簡而言之,依賴倒置原則要求我們通過抽象來解耦高層模塊和低層模塊之間的依賴關系,從而使系統更加靈活、可擴展和易于維護。

核心思路: 要依賴于抽象 ,不要依賴于具體

為了實現這一原則 ,在編程時針對抽象類或者接口編程,而不是具體要求實現

四、設計模式

設計模式是一套反復被使用,經過驗證的,代碼的總結 ;

設計模式不是具體的方法,而一種思想.

學習設計模式就是要建立面向對象的思想,盡可能的面向接口編程,低耦合,高內聚,使程序實現復用

設計模式的幾個要素

  1. 名字, 必須有一個簡單,有意義的名稱
  2. 問題 描述在何使用
  3. 解決方案 如何去解決問題
  4. 效果 模式優點缺點

設計模式分類:

創建型模式 對象的創建

結構型模式 對象的組成(結構)

行為型模式 對象的行為

創建型模式: 簡單工廠模式, 工廠模式,單例模式等。。。

**結構型模式:**外觀模式,適配器模式,裝飾模式 。。。

**行為型模式:**模板方法模式,觀察者模式,狀態模式。。。

1.常見設計模式

簡單工廠模式

靜態工廠方法模式,它定義一個具體的工廠類負責創建一些類的實例

優點:客戶端不需要負責創建對象,明確了各位類的職責

缺點:靜態工廠負責創建對象,如果有新的對象增加,或者創建方式不同,需要不斷的修改工廠類,不利于后期維護

public class AnimalFoctory {private AnimalFoctory(){}public static Animal createAnimal(String type){if("dog".equals(type)){return new Dog();}else if("cat".equals(type)){return new Cat();}else{return null;}}public static Dog createDog(){return  new Dog();}public static Cat createCat(){return  new Cat();}
}
工廠模式

工廠模式: 抽象工廠類負責定義創建對象的接口,具體對象的創建由繼承抽象工廠的具體類實現

優點:客戶端不需要負責創建對象,明確了各位類的職責 ; 如果 新的對象增加,不修改已有的代碼,增加了維護性和擴展性

缺點:需要額外編寫代碼,增加了工作量

單例模式

單例模式: 確保類在內存中只有一個對象,此實例必須自動創建,并且對外提供

優點:

缺點:

(餓漢式): 類加載的就創建對象

public class Student {// 為了讓靜態方法可以訪問此對象,所以把它變成靜態的// 為了讓外界不能直接訪問,加privateprivate static Student s = new Student();private Student(){}public static Student getStudent(){return s;}
}

(懶漢式):用的時候,才去創建

public class Student2 {private static Student2 s = null;private Student2(){}public static Student2 getStudent(){if(s==null){s = new Student2();}return s;}
}

面試題:單例模式的思想是什么?請寫一代碼體現。

? 開發:餓漢式(是不會出現問題的)

? 面試:懶漢式(可能會出現問題的)

? A: 懶加載(延遲加載)

? B: 線程安全問題

public class Student2 {private static Student2 s = null;private Student2(){}public static synchronized Student2 getStudent(){if(s==null){s = new Student2();}return s;}
}
Runtime類
public class Runtime {private static Runtime currentRuntime = new Runtime();public static Runtime getRuntime() {return currentRuntime;}/** Don't let anyone else instantiate this class */private Runtime() {}}
模式設計模式

需求: 計算出一段代碼的運行時間

優點: 滿足用戶需求,靈活多變

缺點:如果算法需要改變,需要修改抽象 類

裝飾設計模式(擴展對象)

優點:

可以提供比繼承更靈活的擴展對象的功能

缺點:可以任意組合

已經學過的裝飾:

Scanner scanner = new Scanner(System.in);

2.枚舉

枚舉是指變量的一一列出來,只能在指范圍內取值;

如: 一周只有7天,一年12個月

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

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

相關文章

分割回文串

分割回文串 描述 : 給你一個字符串 s&#xff0c;請你將 s 分割成一些子串&#xff0c;使每個子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正著讀和反著讀都一樣的字符串。 題目 : LeetCode 131.分割回文串 : 131. 分割回文串 分析 : 字符串如何判斷回文本…

20 Redis進階 - 運維監控

1、理解Redis監控 Redis運維和監控的意義不言而喻&#xff0c;可以以下三個方面入手 1.首先是Redis自身提供了哪些狀態信息&#xff0c;以及有哪些常見的命令可以獲取Redis的監控信息; 2.一些常見的UI工具可以可視化的監控Redis; 3.理解Redis的監控體系;2、Redis自身狀態及命…

Vue3-02-ref() 響應式詳解

ref() 是什么 ref() 是一個函數&#xff1b; ref() 函數用來聲明響應式的狀態&#xff08;就是來聲明變量的&#xff09; ref() 函數聲明的變量&#xff0c;是響應式的&#xff0c;變量的值改變之后&#xff0c;頁面中會自動重新渲染。ref() 有什么特點 1.ref() 可以聲明基礎…

VUE語法--toRefs與toRef用法

1、功能概述 ref和reactive能夠定義響應式的數據&#xff0c;當我們通過reactive定義了一個對象或者數組數據的時候&#xff0c;如果我們只希望這個對象或者數組中指定的數據響應&#xff0c;其他的不響應。這個時候我們就可以使用toRefs和toRef實現局部數據的響應。 toRefs是…

算一算并輸出2到正整數n中每個數的質因子(for循環)

計算并輸出2到正整數n之間每個數的質因子&#xff0c;并以乘法形式輸出。 輸入格式: 輸入只有1個正整數即n。 輸出格式: 把2到正整數n間的每一個數分解成它的質因子&#xff0c;并以乘法的形式輸出。例如&#xff0c;輸入的正整數n值為10&#xff0c;則應輸出如下&#xff…

MIT線性代數筆記-第28講-正定矩陣,最小值

目錄 28.正定矩陣&#xff0c;最小值打賞 28.正定矩陣&#xff0c;最小值 首先正定矩陣是一個實對稱矩陣 由第 26 26 26講的末尾可知正定矩陣有以下四種判定條件&#xff1a; 所有特征值都為正左上角所有 k k k階子矩陣行列式都為正&#xff08; 1 ≤ k ≤ n 1 \le k \le n …

DDD系列 - 第6講 倉庫Repository及Mybatis、JPA的取舍(一)

目錄 一、領域層定義倉庫接口1.1 設計聚合1.2 定義倉庫Repository接口二 、基礎設施層實現倉庫接口2.1 設計數據庫2.2 集成Mybatis2.3 引入Convetor2.4 實現倉庫三、回顧一、領域層定義倉庫接口 書接上回,之前通過一個關于拆解、微服務、面向對象的故事,向大家介紹了如何從微…

簡單的WEB服務器

優質博文&#xff1a;IT-BLOG-CN 目的&#xff1a; 了解Java Web服務器是如何運行的。Web服務器使用HTTP與其客戶端&#xff0c;也就是Web瀏覽器進行通信。基于Java的Web服務器會使用兩個重要類&#xff1a;java.net.Socket類和java.net.ServerSocket類&#xff0c;并通過發送…

詳解Keras3.0 Models API: Model class

1、語法 keras.Model() 將不同層組為具有訓練/推理特征的對象的模型 2、示例一 inputs keras.Input(shape(37,)) x keras.layers.Dense(32, activation"relu")(inputs) outputs keras.layers.Dense(5, activation"softmax")(x) model keras.Model…

58.Nacos源碼分析2

三、服務心跳。 3.服務心跳 Nacos的實例分為臨時實例和永久實例兩種&#xff0c;可以通過在yaml 文件配置&#xff1a; spring:application:name: order-servicecloud:nacos:discovery:ephemeral: false # 設置實例為永久實例。true&#xff1a;臨時; false&#xff1a;永久ser…

MySQL-備份+日志:介質故障與數據庫恢復

目錄 第1關&#xff1a;備份與恢復 第2關&#xff1a;備份日志&#xff1a;介質故障的發生與數據庫的恢復 第1關&#xff1a;備份與恢復 任務描述 本關任務: 備份數據庫&#xff0c;然后再恢復它。 test1_1.sh # 你寫的命令將在linux的命令行運行 # 對數據庫residents作海…

【C/C++筆試練習】多態的概念、虛函數的概念、虛表地址、派生類的虛函數、虛函數的訪問、指針引用、動態多態、完全數計算、撲克牌大小

文章目錄 C/C筆試練習選擇部分&#xff08;1&#xff09;多態的概念&#xff08;2&#xff09;虛函數的概念&#xff08;3&#xff09;虛表地址&#xff08;4&#xff09;派生類的虛函數&#xff08;5&#xff09;虛函數的訪問&#xff08;6&#xff09;分析程序&#xff08;7&…

C# WPF上位機開發(會員管理軟件)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 好多同學都認為上位機只是純軟件開發&#xff0c;不涉及到硬件設備&#xff0c;比如聽聽音樂、看看電影、寫寫小的應用等等。如果是消費電子&#…

HibernateJPA快速搭建

1. 先創建一個普通Maven工程&#xff0c;導入依賴 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depe…

Java 匿名內部類使用的外部變量,為什么一定要加 final?

問題描述 Effectively final Java 1.8 新特性&#xff0c;對于一個局部變量或方法參數&#xff0c;如果他的值在初始化后就從未更改&#xff0c;那么該變量就是 effectively final&#xff08;事實 final&#xff09;。 這種情況下&#xff0c;可以不用加 final 關鍵字修飾。 …

報錯:Parsed mapper file: ‘file mapper.xml 導致無法啟動

報錯 &#xff1a; Logging initialized using class org.apache.ibatis.logging.stdout.StdOutImpl adapter. Registered plugin: com.github.yulichang.interceptor.MPJInterceptor3b2c8bda Parsed mapper file: file [/Mapper.xml] application無法啟動 我這邊產生原因是項…

K8S學習指南(4)-minikube的使用

文章目錄 簡介安裝 Minikube啟動 Minikube 集群基本概念創建和管理資源1. 創建 Pod2. 創建 Deployment3. 創建 Service 監視和調試1. 查看集群狀態2. 查看集群信息3. 訪問 Kubernetes Dashboard4. 使用 kubectl 命令 清理資源1. 刪除 Pod2. 刪除 Deployment3. 刪除 Service4. 停…

! [remote rejected] master -> master (pre-receive hook declined)

! [remote rejected] master -> master (pre-receive hook declined) 如圖&#xff1a; 出錯解決方法 首先輸入命令 git branch xindefenzhi然后&#xff0c;進入這個新創建的分支 git checkout branch然后重新git push就可以了

爬蟲學習-基礎庫的使用(urllib庫)

目錄 一、urllib庫介紹 二、request模塊使用 &#xff08;1&#xff09;urlopen ①data參數 ②timeout參數 &#xff08;2&#xff09;request &#xff08;3&#xff09;高級用法 ①驗證 ②代理 ③Cookie 三、處理異常 ①URLError ②HTTPError 四、解析鏈接 ①urlparse ②…

LeetCode-10. 正則表達式匹配

LeetCode-10. 正則表達式匹配 問題分析算法描述程序代碼CGo 問題分析 這道題的難點主要在于*號的匹配&#xff0c;這里記dp[i][j]表示s[1...i]和p[1...j]能否完成匹配&#xff0c;先根據特殊情況歸納總結&#xff1a; *號匹配 0 次&#xff0c;則dp[i][j] dp[i][j-2]*號匹配…