1. 程式人生 > >給你一個數據庫連接獲取工具類

給你一個數據庫連接獲取工具類

package com.softeem.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.Set;

import com.alibaba.druid.pool.DruidDataSource;
/**
 * 通用資料工具類,基於Druid連線池實現
 * 包含以下功能
 * 1.獲取連線
 * 2.關閉資源
 * 3.執行通用的更新操作
 * 4.
 * @author 七號
 *
 */
public class DBUtils {
    
    //宣告druid連線池物件
        private static DruidDataSource pool;
        /**資料庫連結URL地址**/
        private static String url;
        /**賬號**/
        private static String username;
        /**密碼**/
        private static String password;
        /**初始連結數**/
        private static int initialSize;
        /**最大活動連線數**/
        private static int maxActive;
        /**最小閒置連線數**/
        private static int minIdle;
        /**連線耗盡時最大等待獲取連線時間**/
        private static long maxWait;
        
        static{
            init();
        }
        
        /**
         * 載入屬性檔案並讀取屬性檔案中的內容將其設定給連線資訊
         * @param propName
         */
        private static void loadProp(){
            try {
                //屬性檔案位於src根目錄時,加“/”則不要使用ClassLoader;如果使用ClassLoader則無需“/”
                InputStream is = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
                Properties p = new Properties();
                p.load(is);
                
                url = p.getProperty("jdbc.url");
                username = p.getProperty("jdbc.username");
                password = p.getProperty("jdbc.password");
                
                initialSize = Integer.parseInt(p.getProperty("initialSize"));
                maxActive = Integer.parseInt(p.getProperty("maxActive"));
                minIdle = Integer.parseInt(p.getProperty("minIdle"));
                maxWait = Long.parseLong(p.getProperty("maxWait"));
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 初始化連線池
         */
        private static void init(){
            pool = new DruidDataSource();
            //載入屬性檔案初始化配置
            loadProp();
            
            pool.setUrl(url);
            pool.setUsername(username);
            pool.setPassword(password);
            //設定連線池中初始連線數
            pool.setInitialSize(initialSize);
            //設定最大連線數
            pool.setMaxActive(maxActive);
            //設定最小閒置連結數
            pool.setMinIdle(minIdle);
            //設定最大的等待時間(等待獲取連結的時間)
            pool.setMaxWait(maxWait);
        }
        
        /**
         * 連結獲取
         * @return
         */
        public static Connection getConn(){
            try {
                //如果連線池為空或者被異常關閉,則重新初始化一個
                if(pool == null || pool.isClosed()){
                    init();
                }
                return pool.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    public static void close(PreparedStatement ps,Connection conn) {
        try {
            if(ps != null) {
                ps.close();
            }
            if(conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 封裝通用的更新操作,對所有更新(insert,delete,update)有關的操作都能通過該方法實現
     * @param sql
     * @param obj
     * @return
     * insert into user(id,username,password) values(?,?,?)
     * delete from user where id = ?
     * update user set password = ? where id = ? 
     */
    public static boolean exeUpdate(String sql,Object... obj) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConn();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < obj.length; i++) {
                ps.setObject(i+1, obj[i]);
            }
            return ps.executeUpdate() > 0;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(ps, conn);
        }
        return false;
    }
    
    /**
     * 技術引數:泛型,集合框架,反射,JDBC
     * 封裝查詢多條及操作
     * @param t
     * @param sql
     * @param params
     * @return
     */
    public static <T> List<T> queryList(Class<T> t,String sql,Object... params){
        List<T> list = new ArrayList<>();
        T obj = null;
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConn();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i+1, params[i]);
            }
            ResultSet rs = ps.executeQuery();
            //獲取插敘結果集中的元資料(獲取列名稱,數量及長度資訊)
            ResultSetMetaData rsmd = rs.getMetaData();
            //宣告一個map集合用於臨時儲存一條資料(key:列明 values:列值)
            Map<String,Object> map = new HashMap<>();
            //遍歷結果集
            while(rs.next()) {
                //防止快取上一條資料
                map.clear();
                //遍歷所有列
                for (int i = 0; i < rsmd.getColumnCount(); i++) {
                    //獲取列名
                    String cname = rsmd.getColumnLabel(i+1);
                    //獲取列值
                    Object values = rs.getObject(cname);
                    //將列名與列值儲存在map中
                    map.put(cname, values);
                    //利用反射將map中的資料注入到Java物件中,並將物件存入集合
                    if(!map.isEmpty()){
                        //獲取map集合鍵集(列名集合)
                        Set<String> columnNames = map.keySet();
                        //建立物件
                        obj = t.newInstance();
                        for (String column : columnNames) {
                            //根據鍵獲取值
                            Object value = map.get(column);
                            //獲取屬性物件
                            Field f = t.getDeclaredField(column);
                            //設定屬性為可訪問狀態
                            f.setAccessible(true);
                            //為屬性設定
                            f.set(obj, value);
                        }
                        list.add(obj);
                    }
                }
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
    
    /**
     * 封裝查詢單個物件的方法
     * @param t
     * @param sql
     * @param obj
     * @return
     */
    public static <T> T queryOne(Class<T> t,String sql,Object... params) {
        
        T obj = null;
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConn();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i+1, params[1]);
            }
            ResultSet rs = ps.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            //ORM操作(物件關係對映)
            if (rs.next()) {
                // 建立一個指定型別的例項物件(必須包含預設構造器)
                obj = t.newInstance();
                for (int i = 0; i < rsmd.getColumnCount(); i++) {
                    //獲取指定列的列名稱
                    String cname = rsmd.getColumnLabel(i + 1);
                    //獲取列值
                    Object value = rs.getObject(cname);
                    if(Objects.nonNull(value)){                        
                        //根據列名稱獲取Java類的屬性名(要求表中的列名稱必須與類中的屬性名保持一致)
                        Field field = t.getDeclaredField(cname);
                        //將欄位設定為可訪問狀態
                        field.setAccessible(true);
                        //為欄位設定屬性值
                        field.set(obj, value);
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return obj;
    }

    
}
 

相關推薦

個數獲取工具

package com.softeem.jdbc.utils; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.sql.C

Confluence 6 Oracle 測試的數

Confluence在你的數據庫設置界面,有一個 測試連接(Test connection)按鈕可以檢查:Confluence 可以連接你的數據庫服務器數據庫的字符集編碼是否正確你的數據庫用戶是否具有需要的權限你的數據庫用戶沒有賦予 SELECT ANY TABLE 權限一旦上面的測試成功了,單擊 下一步(N

Confluence 6 SQL Server 測試的數

base strong play 級別 數據 isp con SQ tab 在你的數據庫設置界面,有一個 測試連接(Test connection)按鈕可以檢查: Confluence 可以連接你的數據庫服務器 數據庫字符集和隔離級別是正確的 你的數據庫用戶有正確

Confluence 6 MySQL 測試的數

Confluence在你的數據庫設置界面,有一個 測試連接(Test connection)按鈕可以檢查:Confluence 可以連接你的數據庫服務器數據庫字符集,隔離級別和存儲引擎是正確的你的數據庫用戶有正確的數據庫權限一旦上面的測試成功了,單擊 下一步(Next )來繼續進行 Confluence 的安

Confluence 6 PostgreSQL 測試的數

postgres 權限 conn nbsp sql per clas 編碼 .org 在你的數據庫設置界面,有一個 測試連接(Test connection)按鈕可以檢查: Confluence 可以連接你的數據庫服務器 數據庫字符集的編碼是否設置正確 你的數據庫

Confluence 6 已經存在的 Confluence 安裝配置個數

select panel IT aci conn mac clas 可能 com 如果你希望在使用 JDBC 直接方式的應用中切換到使用數據源: 停止 Confluence. 備份下面的文件,以防止你可能需要重新恢復你的配置: <installation

Confluence 6 配置個數

cat 服務器 簡單 ref aso spl 指南 postgres HR 這個指南指導你如何配置使用 JNDI 數據源來連接到你的數據庫。使用這個類型的連接,Confluence 將會詢問應用服務器(Tomcat)中你配置的連接信息。 如果你希望使用 JDBC 的數據庫

Confluence 6 新 Confluence 安裝配置個數

繼續 postgres 連接 server 數據源 wait microsoft double sna 如果在你的 Tomcat 中配置了數據源,並且Confluence 設置指南在安裝的時候檢測到這個配置的時候,配置數據源的選項將會提供給你進行配置。入股你希望使用數據源,

c3p0 個數的例子

pan cto on() span 方法參數 內存溢出 tar subst blank 首先需要準備三個依賴包 c3p0-0.9.5.2.jar、mchange-commons-java-0.2.11.jar、mysql-connector-java-5.1.47.jar

如何用delphi中Data Module 管理數 和Adoquery 及 datasourse 等

href src 數據庫連接 為什麽 com 根據 table log other 首先關於使用data module 的理論可以參看,裏面講的很詳細:https://wenku.baidu.com/view/073aa98aa0116c175f0e48e2.html 其次

java數池技術簡單使用

util mysql 一個 dsta getc lean 創建 gin eat JDBCDemo.java: package com.itheima.jdbc; import java.sql.Connection; import java.sql.PreparedS

Python3 MySQL 數 -PyMySQL

creat usr 操作mysql 截斷 exists setup python2 包括 warn Python 3 操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQ

Flask入門之SQLAlchemy配置與數

數據 rdo nsh imp log kref mod pre file 1. 安裝SQLAlchemy pip install flask-sqlalchemy 2. 導入和配置 from flask_sqlalchemy import SQLAlchemy bas

flask 數問題

create mysq import onf sql div blog base uri app.config[‘SQLALCHEMY_DATABASE_URI‘]=‘mysql://root:[email protected]/* *//flask‘ fro

SqlServer將數中的表復制到另個數

步驟 .cn 一個 使用 目標表 插入 ctrl eat 根據 在使用SqlServer的過程中,我們可能需要將表從一個數據庫復制到另一個數據庫中,今天,我為大家介紹這種操作的具體方法及步驟。可能對大部分人來說是很簡單的東西,但是還是要記錄下來,好記性不如爛筆頭嘛。希望可以

學習--簡單的通訊錄

數據庫連接 private 連接數據庫 package 通訊錄 為了做畢業設計,學習了Java,然後就要連接數據庫,為了連接數據庫就學習做了一個簡單的小項目,通訊錄(現在只有添加的功能),成功連接數據庫首先看看我的WEB首頁吧:比較簡單,然後是填加聯系人頁面我的數據庫連接的代碼先拋出來,畢

簡單的數池實例(java語言)

proxy read public ++ load empty 返回 not 超時 1.概述 頻繁的創建和銷毀數據庫連接消耗非常多的系統資源,創建一個池子, 管理一定數量的連接,用的時候去池中取,用完了放回池中,這時比較通用的做法。 2.關鍵字 LinkedList

Sql Server 導入還有個數中的表數

數據庫 tex .net mark manage alt img 資源管理 一個數據庫 在涉及到SQL Server編程或是管理時一定會用到數據的導入與導出, 導入導出的方法有多種,此處以SQL Server導入表數據為例。闡述一下:1、打開SQL Server Mana

初識數池開源框架Druid

數據庫連接Druid是阿裏巴巴的一個數據庫連接池開源框架,準確來說它不僅僅包括數據庫連接池這麽簡單,它還提供強大的監控和擴展功能。本文僅僅是在不采用Spring框架對Druid的窺探,采用目前最新版本druid1.0.26 github地址:https://github.com/alibaba/druid。在

實現數

tinc port 一次 通過 所有 name 不能 註冊 失敗   文件ConnectionParam.java package exam.Util.DButil; public class ConnectionParam { private String d