日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JDBC 防御性编程

發(fā)布時(shí)間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC 防御性编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

防御性編程(Defensive Programming)

什么是Defensive Programming[1]

原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circumstances.
_
翻譯:防御性編程是防御性設(shè)計(jì)的一種形式,它能夠保證軟件產(chǎn)品在不可預(yù)測(cè)的環(huán)境中持續(xù)運(yùn)行。

我們可以看到,防御性編程只是防御性設(shè)計(jì)的分支,對(duì)于防御性設(shè)計(jì),可以布滿我們生活的任何角落,尤其是設(shè)計(jì)行業(yè)和制造業(yè),因此,理解和應(yīng)用防御性編程,讓我們更好地懂得“防御”,也能將其應(yīng)用于自己的生活。

防御性編程的重要思想[2]

所有的外部因素(輸入?yún)?shù)、環(huán)境變量、上下文)都是“邪惡”的,都存在著企圖摧毀程序的罪惡本源,為了抵制它,我們要在程序中處處檢驗(yàn),滿地設(shè)卡,不滿足條件就不再執(zhí)行后續(xù)程序,以保護(hù)主程序的正確性

簡(jiǎn)單來(lái)說(shuō)就是,不管別人如何使用程序,它都能做出相應(yīng)的處理,因此我們需要預(yù)測(cè)可能出現(xiàn)的錯(cuò)誤并阻止它。

注意,不要濫用Defensive Programming,這可能讓你的程序消耗過多資源,犧牲本不必犧牲的性能(可以在文章最底部的參考資料中進(jìn)一步學(xué)習(xí))。

JDBC代碼示例

防御性編程在Java異常中的應(yīng)用情況

  • 當(dāng)程序產(chǎn)生異常,對(duì)后面的影響不大(視情況,看模塊獨(dú)立性),則只需拋出異常并繼續(xù)執(zhí)行
  • 若程序產(chǎn)生異常,導(dǎo)致后面都不能執(zhí)行,那就只能回滾重新執(zhí)行,或者退出程序了
  • 例如使用JDBC連接云端Mysql的時(shí)候,可能會(huì)斷網(wǎng)導(dǎo)致無(wú)法連接,這個(gè)時(shí)候,連登錄賬戶都不行,就需要用戶

  • 要么嘗試重新連接
  • 要么退出程序
  • 給出示例代碼,注釋已經(jīng)足夠清楚,不再過多解釋(代碼是基于簡(jiǎn)單的控制臺(tái)程序)

    package FinancialSystem.UsualFunction;import com.mysql.cj.jdbc.exceptions.CommunicationsException;import javax.xml.crypto.Data; import java.net.UnknownHostException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Time; import java.util.Scanner;/*** 執(zhí)行連接數(shù)據(jù)庫(kù)操作的類** <p>* 創(chuàng)建日期:2020-08-04 20:44** @author 作者* @version 1.0.0* @since 1.0.0*/public class DatabaseOperating {/*** 供其他程序連接數(shù)據(jù)庫(kù)使用** <p>* 方法保證了返回值一定是非空的 Connection對(duì)象* </p>** @return Connection Object* @throws InterruptedException*/public static Connection createDatabaseLink() throws InterruptedException {Connection connection;int i = 0;for (; i < 5; i++) {connection = DatabaseOperating.createDatabase();if (connection != null) {if(i != 0){System.out.println("恭喜您,網(wǎng)絡(luò)連接成功!");}return connection;}System.out.println("是否嘗試重新連接?");System.out.println("1. 是 2. 否");Scanner scanner = new Scanner(System.in);System.out.print("請(qǐng)輸入序號(hào):");int choose = scanner.nextInt();if(choose != 1){break;}}if (i == 5) {System.err.println("超過重連次數(shù),請(qǐng)聯(lián)系相關(guān)運(yùn)營(yíng)商檢查您的網(wǎng)絡(luò)!");}for (int j = 5; j > 0; j--) {System.err.print("\r" + j + "秒后將自動(dòng)退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);return null;}/*** 連接本地(或云端)的Mysql數(shù)據(jù)庫(kù)** @return Connection實(shí)例*/private static Connection createDatabase() throws InterruptedException {try {String url = "jdbc:mysql://主機(jī):端口/數(shù)據(jù)庫(kù)";String user = "用戶名";String password = "密碼";return DriverManager.getConnection(url, user, password);} catch (CommunicationsException communicationsException) {System.err.println("網(wǎng)絡(luò)連接錯(cuò)誤!");return null;} catch (SQLException throwable) {// throwable.printStackTrace();System.err.println("遠(yuǎn)程服務(wù)器連接失敗");for (int i = 5; i > 0; i--) {System.err.print("\r" + i + "秒后將自動(dòng)退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);}return null;} }

    方法的調(diào)用,能夠保證,connection一定不是null,也就能夠保證后面的一些步驟避免一些問題,例如NullPointerException。

    舉例如下(部分代碼):

    String sql = "sql語(yǔ)句";try (Connection connection = DatabaseOperating.createDatabaseLink();PreparedStatement preparedStatement = connection.prepareStatement(sql) ) {// <代碼部分> } catch (SQLException | InterruptedException throwable) {throwable.printStackTrace(); }

    思考點(diǎn)

    以下是我的思考,對(duì)于初學(xué)者,我想暫時(shí)我暫時(shí)沒有必要花精力于此處,目前這些也沒有搜集專業(yè)資料,僅供思考,這一小節(jié)可以忽略掉

  • JDBC不應(yīng)該使用一個(gè)具備大量的MySQL賬戶,這是危險(xiǎn)的,我們應(yīng)該分配多個(gè)具備專門權(quán)限的賬戶,去處理不同的信息。
  • 不應(yīng)該使用明碼表示MySQL賬戶,如果那樣的話,使用逆向工程,很容易被找到和破解,這樣不太安全,例如,可以將賬戶存在隱秘的地方以密碼傳輸,在程序中解碼;又或者使用低等權(quán)限賬戶登錄數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)獲取具備操作權(quán)限的賬戶信息,再用該賬戶登錄數(shù)據(jù)庫(kù)。
  • 參考資料

    [1] Wikipedia: Defensive Programming

    [2] 防御性編程的核心思想

    總結(jié)

    以上是生活随笔為你收集整理的JDBC 防御性编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。