封裝JDBC—非框架開發必備的封裝類
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @author */ public final class MyJDBC { private static String connect; private static String driverClassName; private static String URL; private static String username; private static String password; private static boolean autoCommit; /** 宣告一個 Connection型別的靜態屬性,用來快取一個已經存在的連線物件 */ private static Connection conn; static { config(); } /** * 開頭配置自己的資料庫資訊 */ private static void config() { /* * 獲取驅動 */ driverClassName = "com.mysql.jdbc.Driver"; /* * 獲取URL */ URL = "jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf8"; /* * 獲取使用者名稱 */ username = "root"; /* * 獲取密碼 */ password = "1234"; /* * 設定是否自動提交,一般為false不用改 */ autoCommit = false; } /** * 載入資料庫驅動類 */ private static boolean load() { try { Class.forName(driverClassName); return true; } catch (ClassNotFoundException e) { System.out.println("驅動類 " + driverClassName + " 載入失敗"); } return false; } /** * 專門檢查快取的連線是否不可以被使用 ,不可以被使用的話,就返回 true */ private static boolean invalid() { if (conn != null) { try { if (conn.isClosed() || !conn.isValid(3)) { return true; /* * isValid方法是判斷Connection是否有效,如果連線尚未關閉並且仍然有效,則返回 true */ } } catch (SQLException e) { e.printStackTrace(); } /* * conn 既不是 null 且也沒有關閉 ,且 isValid 返回 true,說明是可以使用的 ( 返回 false ) */ return false; } else { return true; } } /** * 建立資料庫連線 */ public static Connection connect() { if (invalid()) { /* invalid為true時,說明連線是失敗的 */ /* 載入驅動 */ load(); try { /* 建立連線 */ conn = DriverManager.getConnection(URL, username, password); } catch (SQLException e) { System.out.println("建立 " + connect + " 資料庫連線失敗 , " + e.getMessage()); } } return conn; } /** * 設定是否自動提交事務 **/ public static void transaction() { try { conn.setAutoCommit(autoCommit); } catch (SQLException e) { System.out.println("設定事務的提交方式為 : " + (autoCommit ? "自動提交" : "手動提交") + " 時失敗: " + e.getMessage()); } } /** * 建立 Statement 物件 */ public static Statement statement() { Statement st = null; connect(); /* 如果連線是無效的就重新連線 */ transaction(); /* 設定事務的提交方式 */ try { st = conn.createStatement(); } catch (SQLException e) { System.out.println("建立 Statement 物件失敗: " + e.getMessage()); } return st; } /** * 根據給定的帶引數佔位符的SQL語句,建立 PreparedStatement 物件 * * @param SQL * 帶引數佔位符的SQL語句 * @return 返回相應的 PreparedStatement 物件 */ private static PreparedStatement prepare(String SQL, boolean autoGeneratedKeys) { PreparedStatement ps = null; connect(); /* 如果連線是無效的就重新連線 */ transaction(); /* 設定事務的提交方式 */ try { if (autoGeneratedKeys) { ps = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); } else { ps = conn.prepareStatement(SQL); } } catch (SQLException e) { System.out.println("建立 PreparedStatement 物件失敗: " + e.getMessage()); } return ps; } public static ResultSet query(String SQL, Object... params) { if (SQL == null || SQL.trim().isEmpty() || !SQL.trim().toLowerCase().startsWith("select")) { throw new RuntimeException("你的SQL語句為空或不是查詢語句"); } ResultSet rs = null; if (params.length > 0) { /* 說明 有引數 傳入,就需要處理引數 */ PreparedStatement ps = prepare(SQL, false); try { for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } rs = ps.executeQuery(); } catch (SQLException e) { System.out.println("執行SQL失敗: " + e.getMessage()); } } else { /* 說明沒有傳入任何引數 */ Statement st = statement(); try { rs = st.executeQuery(SQL); // 直接執行不帶引數的 SQL 語句 } catch (SQLException e) { System.out.println("執行SQL失敗: " + e.getMessage()); } } return rs; } private static Object typeof(Object o) { Object r = o; if (o instanceof java.sql.Timestamp) { return r; } // 將 java.util.Date 轉成 java.sql.Date if (o instanceof java.util.Date) { java.util.Date d = (java.util.Date) o; r = new java.sql.Date(d.getTime()); return r; } // 將 Character 或 char 變成 String if (o instanceof Character || o.getClass() == char.class) { r = String.valueOf(o); return r; } return r; } public static boolean execute(String SQL, Object... params) { if (SQL == null || SQL.trim().isEmpty() || SQL.trim().toLowerCase().startsWith("select")) { throw new RuntimeException("你的SQL語句為空或有錯"); } boolean r = false; /* 表示 執行 DDL 或 DML 操作是否成功的一個標識變數 */ /* 獲得 被執行的 SQL 語句的 字首 */ SQL = SQL.trim(); SQL = SQL.toLowerCase(); String prefix = SQL.substring(0, SQL.indexOf(" ")); String operation = ""; // 用來儲存操作型別的 變數 // 根據字首 確定操作 switch (prefix) { case "create": operation = "create table"; break; case "alter": operation = "update table"; break; case "drop": operation = "drop table"; break; case "truncate": operation = "truncate table"; break; case "insert": operation = "insert :"; break; case "update": operation = "update :"; break; case "delete": operation = "delete :"; break; } if (params.length > 0) { // 說明有引數 PreparedStatement ps = prepare(SQL, false); Connection c = null; try { c = ps.getConnection(); } catch (SQLException e) { e.printStackTrace(); } try { for (int i = 0; i < params.length; i++) { Object p = params[i]; p = typeof(p); ps.setObject(i + 1, p); } ps.executeUpdate(); commit(c); r = true; } catch (SQLException e) { System.out.println(operation + " 失敗: " + e.getMessage()); rollback(c); } } else { // 說明沒有引數 Statement st = statement(); Connection c = null; try { c = st.getConnection(); } catch (SQLException e) { e.printStackTrace(); } // 執行 DDL 或 DML 語句,並返回執行結果 try { st.executeUpdate(SQL); commit(c); // 提交事務 r = true; } catch (SQLException e) { System.out.println(operation + " 失敗: " + e.getMessage()); rollback(c); // 回滾事務 } } return r; } /* * * @param SQL * 需要執行的 INSERT 語句 * @param autoGeneratedKeys * 指示是否需要返回由資料庫產生的鍵 * @param params * 將要執行的SQL語句中包含的引數佔位符的 引數值 * @return 如果指定 autoGeneratedKeys 為 true 則返回由資料庫產生的鍵; 如果指定 autoGeneratedKeys * 為 false 則返回受當前SQL影響的記錄數目 */ public static int insert(String SQL, boolean autoGeneratedKeys, Object... params) { int var = -1; if (SQL == null || SQL.trim().isEmpty()) { throw new RuntimeException("你沒有指定SQL語句,請檢查是否指定了需要執行的SQL語句"); } // 如果不是 insert 開頭開頭的語句 if (!SQL.trim().toLowerCase().startsWith("insert")) { System.out.println(SQL.toLowerCase()); throw new RuntimeException("你指定的SQL語句不是插入語句,請檢查你的SQL語句"); } // 獲得 被執行的 SQL 語句的 字首 ( 第一個單詞 ) SQL = SQL.trim(); SQL = SQL.toLowerCase(); if (params.length > 0) { // 說明有引數 PreparedStatement ps = prepare(SQL, autoGeneratedKeys); Connection c = null; try { c = ps.getConnection(); // 從 PreparedStatement 物件中獲得 它對應的連線物件 } catch (SQLException e) { e.printStackTrace(); } try { for (int i = 0; i < params.length; i++) { Object p = params[i]; p = typeof(p); ps.setObject(i + 1, p); } int count = ps.executeUpdate(); if (autoGeneratedKeys) { // 如果希望獲得資料庫產生的鍵 ResultSet rs = ps.getGeneratedKeys(); // 獲得資料庫產生的鍵集 if (rs.next()) { // 因為是儲存的是單條記錄,因此至多返回一個鍵 var = rs.getInt(1); // 獲得值並賦值給 var 變數 } } else { var = count; // 如果不需要獲得,則將受SQL影像的記錄數賦值給 var 變數 } commit(c); } catch (SQLException e) { System.out.println("資料儲存失敗: " + e.getMessage()); rollback(c); } } else { // 說明沒有引數 Statement st = statement(); Connection c = null; try { c = st.getConnection(); // 從 Statement 物件中獲得 它對應的連線物件 } catch (SQLException e) { e.printStackTrace(); } // 執行 DDL 或 DML 語句,並返回執行結果 try { int count = st.executeUpdate(SQL); if (autoGeneratedKeys) { // 如果企望獲得資料庫產生的鍵 ResultSet rs = st.getGeneratedKeys(); // 獲得資料庫產生的鍵集 if (rs.next()) { // 因為是儲存的是單條記錄,因此至多返回一個鍵 var = rs.getInt(1); // 獲得值並賦值給 var 變數 } } else { var = count; // 如果不需要獲得,則將受SQL影像的記錄數賦值給 var 變數 } commit(c); // 提交事務 } catch (SQLException e) { System.out.println("資料儲存失敗: " + e.getMessage()); rollback(c); // 回滾事務 } } return var; } /** 提交事務 */ private static void commit(Connection c) { if (c != null && !autoCommit) { try { c.commit(); } catch (SQLException e) { e.printStackTrace(); } } } /** 回滾事務 */ private static void rollback(Connection c) { if (c != null && !autoCommit) { try { c.rollback(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 釋放資源 * **/ public static void release(Object cloaseable) { if (cloaseable != null) { if (cloaseable instanceof ResultSet) { ResultSet rs = (ResultSet) cloaseable; try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (cloaseable instanceof Statement) { Statement st = (Statement) cloaseable; try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (cloaseable instanceof Connection) { Connection c = (Connection) cloaseable; try { c.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
相關推薦
封裝JDBC—非框架開發必備的封裝類
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; impo
開發框架搭建——常用基類的封裝
我們想要開發一款APP,首要工作肯定是先把包結構建好,框架搭建起來,然後把基類封裝,需要用到的第三方庫匯入專案等等一系列工作。今天我們就來說下如何完成這一套流程。 (注:每個人都有自己的程式碼風格,所以不存在哪種好,哪種不好,適合自己就可以了。) 通過本篇文
利用jdbc簡單封裝一個小框架(類似DBUtils)
add string url lar conn () 列名 lang con 利用jdbc寫的一個類似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.
用友NC開發 相關封裝類解釋
nc.vo.pub.AggregatedValueObject 針對具有一對多關係的母子表設計的聚合VO物件的抽象基類。 它的內部包括一個針對母表的母VO物件和針對單個子表的若干個子VO物件。 只適合一母一子關係。一母多子請使用ExtendedAggregatedValueObj
iOS開發之資訊類App常用分類控制元件的封裝與實現(CollectionView+Swift3.0+)
今天部落格中,我們就來實現一下一些常用資訊類App中常用的分類選擇的控制元件的封裝。本篇部落格中沒有使用到什麼新的技術點,如果非得說用到了什麼新的技術點的話,那麼勉強的說,用到了一些iOS9以後UICollectionView新增的一些新的特性。本篇部落格所涉及的技術點主要有UICollectionView的
MySQL資料庫學習筆記(十一)----DAO設計模式實現資料庫的增刪改查(進一步封裝JDBC工具類)
系列文章並非本人原創。 在這裡我想討論的一個問題是:在PersonDaoImpl這個實現類中,我們可以看到 public void add(Person p) throws SQLException { 26 Connection conn
python3+selenium框架設計04-封裝測試基類
在完成了日誌類封裝之後,那我們就要對測試基類進行實現,在其中對一些請求再次封裝,在專案下新建一個framework資料夾,在資料夾下新建Base_Page.py檔案,這是用來寫測試基類的檔案。在專案下新建screenshots檔案件,用來存放截圖。專案結構如下。 具
Java 反射封裝JDBC查詢,條件查詢、全部查詢封裝到一個類結果為物件;
//封裝方法package com.huanyuguoji.Test;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.refl
DAO設計模式實現資料庫的增刪改查(進一步封裝JDBC工具類)
一、DAO模式簡介 DAO即Data Access Object,資料訪問介面。資料訪問:故名思義就是與資料庫打交道。夾在業務邏輯與資料庫資源中間。 DAO模式實際上是兩個模式的組合,即Data Accessor (資料訪問者)模式和 Active Domain Ob
封裝的一套簡單輕量級JS 類庫(RapidDevelopmentFramework.JS)
需要 and arr ucc rda 找到 目的 tco 類庫 1.最近好久沒有更新自己的博客了,一直在考慮自己應該寫一些什麽。4.2日從蘇州回到南京的路上感覺自己的內心些崩潰和失落,我就不多說了? 猛然之間我認為自己需要找一下內心的平衡。決定開發屬於自己一套快速開發的JS
自動化框架--log日誌封裝
封裝 .config import format) eve cal aps spl txt文件 一: 封裝log模塊, 在自動化測試中日誌輸出,在配置文件中配置需輸出的位置 , 1為輸出, 0不輸出。 1,console_output_on = 1 輸出到控制臺 2,
iOS開發-AFNetworking封裝Get(自定義HTTP Header)和Post請求及文件下載
謝謝 filepath pos cat style -type poe repo eth 前面提到AFNetworking是一個很強大的網絡三方庫,首先你需要引入AFNetworking三方庫;如封裝的有誤還請指出,謝謝! 1.Get請求 /**Get請求 url 服務器
原生JS封裝animate運動框架
gets 中一 etc fun lag set 屬性 target position <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <
Java封裝JDBC數據庫增、刪、改、查操作成JAR文件,以供Web工程調用,適用於多種數據庫
通過 ive trac end 使用方法 數據 div bstr 工程 廢話不多說,直接上源代碼,最後有使用方法,當然,也可以作為普通公用類使用,只是封裝成JAR更方便使用。 [java] view plain copy package db.util;
類,對象 ,封裝,實例變量,類變量,繼承,多態
方式 clas 繼承 bsp pos 自動 通過 特性 pri 類:對一類事物的抽象。例如:人 ,狗,貓,鳥。。。這樣是一大類的概括。講人,可以指很多人,狗也可以分很多種狗 對象:具體的某個類的實例。就想 張三--》指的就是人這個類下面的具體的某一個實例。泰迪 就是狗這個類
封裝selenium自動化框架中的截圖功能
odi cas cli 異常 函數 截圖 none __init__ 註意 對selenium自帶的截圖功能進行封裝: 以下為封裝的代碼,自定義一個.py文件即可,圖片路徑自己設置一個。 1 #coding:utf-8 2 3 class S
(7)學習筆記 ) ASP.NET CORE微服務 Micro-Service ---- 利用Polly+AOP+依賴註入封裝的降級框架
tostring methods summary bstr 判斷 KS foreach public tde 創建簡單的熔斷降級框架 要達到的目標是: 參與降級的方法參數要一樣,當HelloAsync執行出錯的時候執行HelloFallBackAsync方法。 pu
面向對象之組合、封裝、多態性、鴨子類型
冗余 self. hello 復雜度 obj 語法 帶來 anim 安全 一、組合 1. 什麽是組合 一個對象的屬性是來自於另外一個類的對象,稱之為組合 2. 為何用組合 組合也是用來解決類與類代碼冗余的問題 3. 如何用組合 # class Foo: # aaa
jdbc篇第8課:進一步封裝jdbc
這節課我們來進一步封裝jdbc 首先來分析下,jdbc的使用: jdbc使用: 1. 建立好表對應的類(我們稱為bean),要求每一列對應一個屬性,且資料型別對應上 &nb
【轉】Python基礎-封裝與擴充套件、靜態方法和類方法
【轉】Python基礎-封裝與擴充套件、靜態方法和類方法 一、封裝與擴充套件 封裝在於明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部呼叫者的程式碼;而外部使用者只知道一個介面(函式),只要介面(函式)名、引數不變,使用者的程式碼永遠無需改變。這就提供一個良好的合作基礎——或者說,只要介面這個基