java常用工具類之?dāng)?shù)據(jù)庫連接類(可以連接多種數(shù)據(jù)庫)
更新時(shí)間:2014年07月05日 12:52:17 投稿:junjie
這篇文章主要介紹了java常用工具類之?dāng)?shù)據(jù)庫連接類,可以連接多種數(shù)據(jù)庫,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
依賴包下載:http://xiazai.jb51.net/201407/tools/java-db-dependency(jb51.net).rar
數(shù)據(jù)庫連接類源碼:
package com.itjh.javaUtil;
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.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
/**
* 連接數(shù)據(jù)庫的綜合類。</br>
* 依賴jar包:commons.dbcp-1.4,commons.dbutils-1.3,commons.pool-1.5.4包。
*
* @author 宋立君
* @date 2014年07月03日
*/
public class DBUtil {
private String dri = null;
private String url = null;
private String username = null;
private String password = null;
private String poolName = null; // 連接池名稱
private ObjectPool connectionPool = null; // 連接池
// 對應(yīng)的定時(shí)查詢類
private QueryThread queryThread = null;
/**
* 功能:構(gòu)造函數(shù)
*
* @author 宋立君
* @date 2014年07月03日
* @param dri
* 驅(qū)動全類名,例如:com.mysql.jdbc.Driver。
* @param url
* 數(shù)據(jù)庫url連接,例如:
* "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
* @param userName
* 數(shù)據(jù)庫用戶名,例如:root
* @param password
* 數(shù)據(jù)庫密碼,例如:abc
* @param poolName
* 創(chuàng)建的數(shù)據(jù)庫連接池的名稱,例如mypool,注意一個(gè)web容器此名稱不能重復(fù)。
*/
public DBUtil(String dri, String url, String userName, String password,
String poolName) {
this.dri = dri;
this.url = url;
this.username = userName;
this.password = password;
this.poolName = poolName;
}
/**
* 執(zhí)行sql。
*
* @param conn
* 連接
* @param pstm
* PreparedStatement
* @return int 執(zhí)行sql對應(yīng)的影響行。
* @throws SQLException
* @author 宋立君
* @date 2014年07月03日
*/
public int execute(Connection conn, PreparedStatement pstm)
throws SQLException {
try {
return pstm.executeUpdate();
} finally {
Close(conn);
}
}
/**
* 查詢sql。
*
* @param conn
* 連接
* @param pstm
* PreparedStatement
* @return List<Map<String,Object>> 查詢的結(jié)果集
* @throws SQLException
* @author 宋立君
* @date 2014年07月03日
*/
public List<Map<String, Object>> query(Connection conn,
PreparedStatement pstm) throws SQLException {
try {
return resultSetToList(pstm.executeQuery());
} finally {
Close(conn);
}
}
/**
* 功能:ResultSet 轉(zhuǎn)為List<Map<String,Object>>
*
*
* @param rs
* ResultSet 原始數(shù)據(jù)集
* @return List<Map<String,Object>>
* @throws java.sql.SQLException
* @author 宋立君
* @date 2014年07月03日
*/
private List<Map<String, Object>> resultSetToList(ResultSet rs)
throws java.sql.SQLException {
if (rs == null)
return Collections.EMPTY_LIST;
ResultSetMetaData md = rs.getMetaData(); // 得到結(jié)果集(rs)的結(jié)構(gòu)信息,比如字段數(shù)、字段名等
int columnCount = md.getColumnCount(); // 返回此 ResultSet 對象中的列數(shù)
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> rowData = new HashMap<String, Object>();
while (rs.next()) {
rowData = new HashMap<String, Object>(columnCount);
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}
/**
* 查詢sql語句。
*
* @param sql
* 被執(zhí)行的sql語句
* @return List<Map<String,Object>>
* @throws SQLException
* @author 宋立君
* @date 2014年07月03日
*/
public List<Map<String, Object>> query(String sql) throws SQLException {
List<Map<String, Object>> results = null;
Connection conn = null;
try {
conn = getConnection();
QueryRunner qr = new QueryRunner();
results = qr.query(conn, sql, new MapListHandler());
} finally {
Close(conn);
}
return results;
}
/**
* 根據(jù)參數(shù)查詢sql語句
*
* @param sql
* sql語句
* @param param
* 參數(shù)
* @return List<Map<String,Object>>
* @throws SQLException
* @author 宋立君
* @date 2014年07月03日
*/
public List<Map<String, Object>> query(String sql, Object param)
throws SQLException {
List<Map<String, Object>> results = null;
Connection conn = null;
try {
conn = getConnection();
QueryRunner qr = new QueryRunner();
results = (List<Map<String, Object>>) qr.query(conn, sql, param,
new MapListHandler());
} catch (SQLException e) {
e.printStackTrace();
} finally {
Close(conn);
}
return results;
}
/**
* 執(zhí)行sql語句
*
* @param sql
* 被執(zhí)行的sql語句
* @return 受影響的行
* @throws Exception
* @author 宋立君
* @date 2014年07月03日
*/
public int execute(String sql) throws Exception {
Connection conn = getConnection();
int rows = 0;
try {
QueryRunner qr = new QueryRunner();
rows = qr.update(conn, sql);
} finally {
Close(conn);
}
return rows;
}
/**
* 執(zhí)行含參數(shù)的sql語句
*
* @param sql
* 被執(zhí)行的sql語句
* @param params
* 參數(shù)
* @return 返回受影響的行
* @throws Exception
* @author 宋立君
* @date 2014年07月03日
*/
public int execute(String sql, Object[] params) throws Exception {
Connection conn = getConnection();
int rows = 0;
try {
QueryRunner qr = new QueryRunner();
rows = qr.update(conn, sql, params);
} finally {
Close(conn);
}
return rows;
}
/**
* 關(guān)閉連接
*
* @param conn
* @throws SQLException
* @author 宋立君
* @date 2014年07月03日
*/
public void Close(Connection conn) throws SQLException {
if (conn != null) {
conn.close();
}
DbUtils.closeQuietly(conn);
}
/**
* 啟動連接池
*
* @author 宋立君
* @date 2014年07月03日
*/
private void StartPool() {
try {
Class.forName(dri);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
if (connectionPool != null) {
ShutdownPool();
}
try {
connectionPool = new GenericObjectPool(null);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
url, username, password);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, connectionPool, null, "SELECT 1", false,
true);
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.registerPool(poolName, poolableConnectionFactory.getPool());
} catch (Exception e) {
e.printStackTrace();
}
// 開啟查詢程序
queryThread = new QueryThread(this);
queryThread.start();
}
/**
* 關(guān)閉連接池
*
* @author 宋立君
* @date 2014年07月03日
*/
private void ShutdownPool() {
try {
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.closePool(poolName);
// 關(guān)閉定時(shí)查詢
queryThread.setStartQuery(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 得到一個(gè)連接
*
* @return
* @author 宋立君
* @date 2014年07月03日
*/
public synchronized Connection getConnection() {
Connection conn = null;
try {
if (connectionPool == null)
StartPool();
conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:"
+ poolName);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
/**
* 當(dāng)連接池啟動后會自動定時(shí)查詢數(shù)據(jù)庫,防止數(shù)據(jù)庫連接超時(shí)。
*
* @author 宋立君
* @date 2014年07月03日
*/
class QueryThread extends Thread {
private DBUtil dbUtil = null;
// 是否開啟查詢
private boolean startQuery = true;
/**
* 功能:對應(yīng)的數(shù)據(jù)庫連接。
*
* @author 宋立君
* @date 2014年07月03日
* @param dbUtil
* 數(shù)據(jù)庫連接
*/
public QueryThread(DBUtil dbUtil) {
this.dbUtil = dbUtil;
}
public void run() {
while (true) {
try {
if (startQuery) {
this.dbUtil.query("select 1");
}
// System.out.println(startQuery+" 123");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void setStartQuery(boolean startQuery) {
// System.out.println("startQuery shut:"+startQuery);
this.startQuery = startQuery;
}
}
您可能感興趣的文章:
- java配置dbcp連接池(數(shù)據(jù)庫連接池)示例分享
- Java開發(fā)Oracle數(shù)據(jù)庫連接JDBC Thin Driver 的三種方法
- Java數(shù)據(jù)庫連接池的幾種配置方法(以MySQL數(shù)據(jù)庫為例)
- java實(shí)現(xiàn)mongodb的數(shù)據(jù)庫連接池
- Java 數(shù)據(jù)庫連接池詳解及簡單實(shí)例
- Java實(shí)現(xiàn)數(shù)據(jù)庫連接池簡易教程
- Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)
- javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實(shí)例
- java jdbc連接mysql數(shù)據(jù)庫實(shí)現(xiàn)增刪改查操作
- Java語言實(shí)現(xiàn)對MySql數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作的代碼
- Java連接MySQL數(shù)據(jù)庫增刪改查的通用方法(推薦)
- java 數(shù)據(jù)庫連接與增刪改查操作實(shí)例詳解
相關(guān)文章
IDEA2019.2.2配置Maven3.6.2打開出現(xiàn)Unable to import Maven project
這篇文章主要介紹了IDEA2019.2.2配置Maven3.6.2打開出現(xiàn)Unable to import Maven project,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot應(yīng)用快速部署到K8S的詳細(xì)教程
這篇文章主要介紹了SpringBoot應(yīng)用快速部署到K8S的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
JUC系列學(xué)習(xí)工具類CountDownLatch詳解
這篇文章主要介紹了JUC系列學(xué)習(xí)工具類CountDownLatch詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可任意參考一下2022-08-08
SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證
在springboot的登陸頁面中為了防止機(jī)器大規(guī)模注冊,機(jī)器暴力破解數(shù)據(jù)密碼等危害,需要驗(yàn)證隨機(jī)生成的驗(yàn)證碼,本文主要介紹了SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證,感興趣的可以了解一下2023-12-12
通過RedisTemplate連接多個(gè)Redis過程解析
這篇文章主要介紹了通過RedisTemplate連接多個(gè)Redis過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

