欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java常用工具类之数据库连接类(可以连接多种数据库)

程序员文章站 2024-02-29 13:54:10
依赖包下载: 数据库连接类源码: package com.itjh.javautil; import java.sql.connection; impo...

依赖包下载:

数据库连接类源码:

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;
	}
}