1. 程式人生 > >封裝JDBC—非框架開發必備的封裝類

封裝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基礎-封裝與擴充套件、靜態方法和類方法 一、封裝與擴充套件 封裝在於明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部呼叫者的程式碼;而外部使用者只知道一個介面(函式),只要介面(函式)名、引數不變,使用者的程式碼永遠無需改變。這就提供一個良好的合作基礎——或者說,只要介面這個基