程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java經常使用對象類之數據庫銜接類(可以銜接多種數據庫)

java經常使用對象類之數據庫銜接類(可以銜接多種數據庫)

編輯:關於JAVA

java經常使用對象類之數據庫銜接類(可以銜接多種數據庫)。本站提示廣大學習愛好者:(java經常使用對象類之數據庫銜接類(可以銜接多種數據庫))文章只能為提供參考,不一定能成為您想要的結果。以下是java經常使用對象類之數據庫銜接類(可以銜接多種數據庫)正文


依附包下載:http://xiazai.jb51.net/201407/tools/java-db-dependency(jb51.net).rar

數據庫銜接類源碼:

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;

/**
 * 銜接數據庫的綜合類。</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; // 銜接池
	// 對應的准時查詢類
	private QueryThread queryThread = null;

	/**
	 * 功效:結構函數
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param dri
	 *      驅動全類名,例如:com.mysql.jdbc.Driver。
	 * @param url
	 *      數據庫url銜接,例如:
	 *      "jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
	 * @param userName
	 *      數據庫用戶名,例如:root
	 * @param password
	 *      數據庫暗碼,例如:abc
	 * @param poolName
	 *      創立的數據庫銜接池的稱號,例如mypool,留意一個web容器此稱號不克不及反復。
	 */
	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;
	}

	/**
	 * 履行sql。
	 * 
	 * @param conn
	 *      銜接
	 * @param pstm
	 *      PreparedStatement
	 * @return int 履行sql對應的影響行。
	 * @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>> 查詢的成果集
	 * @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 轉為List<Map<String,Object>>
	 * 
	 * 
	 * @param rs
	 *      ResultSet 原始數據集
	 * @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(); // 獲得成果集(rs)的構造信息,好比字段數、字段名等
		int columnCount = md.getColumnCount(); // 前往此 ResultSet 對象中的列數
		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
	 *      被履行的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;
	}

	/**
	 * 依據參數查詢sql語句
	 * 
	 * @param sql
	 *      sql語句
	 * @param param
	 *      參數
	 * @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;
	}

	/**
	 * 履行sql語句
	 * 
	 * @param sql
	 *      被履行的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;
	}

	/**
	 * 履行含參數的sql語句
	 * 
	 * @param sql
	 *      被履行的sql語句
	 * @param params
	 *      參數
	 * @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;
	}

	/**
	 * 封閉銜接
	 * 
	 * @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();
	}

	/**
	 * 封閉銜接池
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	private void ShutdownPool() {
		try {
			PoolingDriver driver = (PoolingDriver) DriverManager
					.getDriver("jdbc:apache:commons:dbcp:");
			driver.closePool(poolName);
			// 封閉准時查詢
			queryThread.setStartQuery(false);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 獲得一個銜接
	 * 
	 * @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;
	}
}

/**
 * 當銜接池啟動後會主動准時查詢數據庫,避免數據庫銜接超時。
 * 
 * @author 宋立君
 * @date 2014年07月03日
 */
class QueryThread extends Thread {

	private DBUtil dbUtil = null;
	// 能否開啟查詢
	private boolean startQuery = true;

	/**
	 * 功效:對應的數據庫銜接。
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param dbUtil
	 *      數據庫銜接
	 */
	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;
	}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved