`

dbutil

 
阅读更多
import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
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.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;

/**
 * 
 * 简单数据库访问接口
 * 
 * @author 阮智勇
 * @version 3.0
 */
public class DBUtil {
	private static DBUtil dbUtil = null;
	private List<Connection> idle = new ArrayList<Connection>(0);
	private Map<Thread, Connection> busy = new HashMap<Thread, Connection>(0);
	private Map<String, Connection> cache = new HashMap<String, Connection>(0);
	private String dialect = "ORACLE";
	private int maxsize = 3;

	/**
	 * 私有构造不让直接创建一个DBUtil实例 读取配置文件加载数据库配置信息,创建一定数量的连接到连接池
	 */
	private DBUtil() {
		InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(
				"db.properties");
		Properties prop = new Properties();
		try {
			prop.load(in);
			String driver = (String) prop.get("db.driver");
			String url = (String) prop.get("db.url");
			String username = (String) prop.get("db.username");
			String password = (String) prop.get("db.password");
			if (prop.get("db.maxsize") != null) {
				maxsize = Integer.parseInt(prop.get("db.maxsize").toString());
			}
			if (prop.get("db.dialect") != null) {
				dialect = (String) prop.get("db.dialect");
			}
			Class.forName(driver);
			for (int k = 0; k < maxsize; k++) {
				Connection conn = DriverManager.getConnection(url, username,
						password);
				idle.add(conn);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 获得数据库访问接口
	 * 
	 * @return 数据库访问接口DBUtil单例
	 */
	public static DBUtil getInstance() {
		if (null == dbUtil) {
			dbUtil = new DBUtil();
		}
		return dbUtil;
	}

	/**
	 * 获得数据库连接
	 * 
	 * @return 数据库连接
	 */
	private synchronized Connection getConn() {
		Connection conn = null;
		try {
			if (idle.size() == 0) {
				wait();
			}
			conn = idle.get(0);
			busy.put(Thread.currentThread(), conn);
			idle.remove(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 关闭所有对对象,归还链接到连接池
	 * 
	 * @param rs
	 *            数据集对象
	 * @param ps
	 *            Ԥ命令对象
	 */
	private synchronized void closeAll(ResultSet rs, PreparedStatement ps) {
		if (null != rs) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (null != ps) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		Connection conn = busy.get(Thread.currentThread());
		if (null != conn) {
			idle.add(conn);
			busy.remove(Thread.currentThread());
			notify();
		}
	}

	/**
	 * 无事务更新(不带参数)
	 * 
	 * @param sql
	 *            SQL语句 :"update table set price=200.00"
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int update(String sql) throws SQLException {
		int result = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(null, ps);
		}
		return result;
	}

	/**
	 * 无事务更新(带参数)
	 * 
	 * @param sql
	 *            SQL语句 :"delete from table where id=?"
	 * @param params
	 *            参数对象数组 :new Object[]{参数1,参数2,...}
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int update(String sql, Object[] params) throws SQLException {
		int result = 0;
		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]);
			}
			result = ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(null, ps);
		}
		return result;
	}

	/**
	 * 在事务下更新(不带参数)
	 * 
	 * @param transId
	 *            事务ID
	 * @param sql
	 *            SQL语句 :"update table set price=200.00"
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int update(String transId, String sql) throws SQLException {
		int result = 0;
		Connection conn = cache.get(transId);
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			result = ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		}
		return result;
	}

	/**
	 * 在事务下更新(带参数)
	 * 
	 * @param transId
	 *            事务ID
	 * @param sql
	 *            SQL语句 :"delete from table where id=?"
	 * @param params
	 *            参数对象数组 :new Object[]{参数1,参数2,...}
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int update(String transId, String sql, Object[] params)
			throws SQLException {
		int result = 0;
		Connection conn = cache.get(transId);
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
			result = ps.executeUpdate();
		} catch (SQLException e) {
			throw e;
		}
		return result;
	}

	/**
	 * 非事务下批量更新
	 * 
	 * @param sql
	 *            SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)"
	 * @param params
	 *            参数集合List<Object[]> 其中new Object[]{参数1,参数2,...}
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int[] batchUpdate(String sql, List<Object[]> params)
			throws SQLException {
		int[] result = new int[params.size()];
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = getConn();
			conn.setAutoCommit(false);
			ps = conn.prepareStatement(sql);
			for (Object[] objects : params) {
				for (int i = 0; i < objects.length; i++) {
					ps.setObject(i + 1, objects[i]);
				}
				ps.addBatch();
			}
			result = ps.executeBatch();
			conn.commit();
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(null, ps);
		}
		return result;
	}

	/**
	 * 在事务下批量更新
	 * 
	 * @param transId
	 *            事务ID
	 * @param sql
	 *            SQL语句 :"insert into table(p1,p2,p3) values(?,?,?)"
	 * @param params
	 *            参数集合List<Object[]> 其中new Object[]{参数1,参数2,...}
	 * @return 受影响行数
	 * @throws SQLException
	 */
	public int[] batchUpdate(String transId, String sql, List<Object[]> params)
			throws SQLException {
		int[] result = new int[params.size()];

		Connection conn = cache.get(transId);
		PreparedStatement ps = conn.prepareStatement(sql);
		for (Object[] objects : params) {
			for (int i = 0; i < objects.length; i++) {
				ps.setObject(i + 1, objects[i]);
			}
			ps.addBatch();
		}
		result = ps.executeBatch();
		return result;
	}

	/**
	 * 查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值
	 * 
	 * @param sql
	 *            SQL语句 :"select * from table"
	 * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> query(String sql) throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCount = rsmd.getColumnCount();
			while (rs.next()) {
				Map<String, Object> map = new HashMap<String, Object>();
				for (int i = 0; i < colCount; i++) {
					String key = rsmd.getColumnLabel(i + 1).toLowerCase();
					Object val = rs.getObject(i + 1) != null ? rs
							.getObject(i + 1) : "";
					map.put(key, val);
				}
				list.add(map);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(rs, ps);
		}
		return list;
	}

	/**
	 * 分页查询(不带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值
	 * 
	 * @param sql
	 *            SQL语句 :"select * from table"
	 * @param currPage
	 *            第几页
	 * @param pageSize
	 *            每页记录数
	 * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> queryPager(String sql, int currPage,
			int pageSize) throws SQLException {
		String pageSql = getPageSql(sql, currPage, pageSize);
		return query(pageSql);
	}

	/**
	 * 查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值
	 * 
	 * @param sql
	 *            SQL语句 :"select * from table where id = ?"
	 * @param params
	 *            参数对象数组 :new Object[]{参数1,参数2,...}
	 * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> query(String sql, Object[] params)
			throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCount = rsmd.getColumnCount();
			while (rs.next()) {
				Map<String, Object> map = new HashMap<String, Object>();
				for (int i = 0; i < colCount; i++) {
					String key = rsmd.getColumnLabel(i + 1).toLowerCase();
					Object val = rs.getObject(i + 1) != null ? rs
							.getObject(i + 1) : "";
					map.put(key, val);
				}
				list.add(map);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(rs, ps);
		}
		return list;
	}

	/**
	 * 分页查询(带参数)返回List<Map<k,v>>其中k:字段名小写,v:字段值
	 * 
	 * @param sql
	 *            SQL语句 :"select * from table where id = ?"
	 * @param params
	 *            参数对象数组 :new Object[]{参数1,参数2,...}
	 * @param currPage
	 *            第几页
	 * @param pageSize
	 *            每页记录数
	 * @return 集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> queryPager(String sql, Object[] params,
			int currPage, int pageSize) throws SQLException {
		String pageSql = getPageSql(sql, currPage, pageSize);
		return query(pageSql);
	}

	/**
	 * 单值查询(不带参数)
	 * 
	 * @param sql
	 *            SQL语句 :"select name from table"
	 * @return 单值
	 * @throws SQLException
	 */
	public String scalar(String sql) throws SQLException {
		String res = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if (rs.next()) {
				res = String.valueOf(rs.getObject(1));
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(rs, ps);
		}
		return res;
	}

	/**
	 * 单值查询(带参)
	 * 
	 * @param sql
	 *            SQL语句 :"select name from table where id=?"
	 * @param params
	 *            参数对象数组 :new Object[]{参数1,参数2,...}
	 * @return 单值
	 * @throws SQLException
	 */
	public String scalar(String sql, Object[] params) throws SQLException {
		String res = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
			rs = ps.executeQuery();
			if (rs.next()) {
				res = String.valueOf(rs.getObject(1));
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(rs, ps);
		}
		return res;
	}

	/**
	 * 执行存储过程
	 * 
	 * @param procName
	 *            存储过程
	 * @param params
	 *            存储过程参数对象数组 :new Object[]{参数1,参数2,...}
	 * @param outParamNum
	 *            输出参数个数
	 * @return 输出参数
	 * @throws SQLException
	 */
	public String[] execProc(String procName, Object[] params, int outParamNum)
			throws SQLException {
		String[] ret = new String[outParamNum];
		Connection conn = null;
		CallableStatement cs = null;
		int inParamNum = (null != params) ? params.length : 0;
		String procSql = getProcSql(procName, inParamNum, outParamNum);
		try {
			conn = getConn();
			cs = conn.prepareCall(procSql);
			for (int i = 0; i < inParamNum; i++) {
				cs.setObject(i + 1, params[i]);
			}
			for (int k = 1; k <= outParamNum; k++) {
				cs.registerOutParameter(inParamNum + k, Types.VARCHAR);
			}
			cs.executeQuery();
			for (int k = 1; k <= outParamNum; k++) {
				ret[k - 1] = cs.getString(inParamNum + k);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			closeAll(null, cs);
		}
		return ret;
	}

	/**
	 * 开始事务
	 * 
	 * @return 事务ID
	 */
	public String beginTrans() {
		String transId = null;
		try {
			Connection conn = getConn();
			conn.setAutoCommit(false);
			transId = UUID.randomUUID().toString();
			cache.put(transId, conn);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return transId;
	}

	/**
	 * 事务提交
	 * 
	 * @param transId
	 *            事务ID
	 */
	public void commitTrans(String transId) {
		Connection conn = null;
		try {
			conn = cache.get(transId);
			conn.commit();
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(null, null);
			cache.remove(conn);
		}
	}

	/**
	 * 事务回滚
	 * 
	 * @param transId
	 *            事务ID
	 */
	public void rollbackTrans(String transId) {
		Connection conn = null;
		try {
			conn = cache.get(transId);
			conn.rollback();
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(null, null);
			cache.remove(conn);
		}
	}

	/**
	 * 得到分页SQL语句
	 * @param sql 基本SQL语句
	 * @param currPage 当前页
	 * @param pageSize 每页记录数
	 * @return 分页SQL语句
	 */
	private String getPageSql(String sql, int currPage, int pageSize) {
		StringBuffer pageSql = new StringBuffer(0);
		if ("oracle".equalsIgnoreCase(dialect)) {
			pageSql.append("SELECT * FROM(SELECT FA.*, ROWNUM RN FROM (");
			pageSql.append(sql).append(") FA WHERE ROWNUM <= ");
			pageSql.append(currPage * pageSize).append(")WHERE RN >= ").append(
					(currPage - 1) * pageSize + 1);
		}
		if ("mysql".equalsIgnoreCase(dialect)) {
			pageSql.append(sql).append(" limit ").append(
					(currPage - 1) * pageSize).append(",").append(pageSize);
		}
		return pageSql.toString();
	}

	/**
	 * 得到存储过程语句
	 * 
	 * @param procName
	 *            存储过程
	 * @param inParamNum
	 *            输入参数个数
	 * @param outParamNum
	 *            输出参数个数
	 * @return
	 * @throws SQLException
	 */
	private String getProcSql(String procName, int inParamNum, int outParamNum)
			throws SQLException {
		StringBuffer sb = new StringBuffer();
		sb.append("{call ").append(procName);
		int paramCount = inParamNum + outParamNum;
		if (paramCount > 0) {
			sb.append("(");
			for (int i = 0; i < paramCount; i++) {
				sb.append("?");
				if (i != paramCount - 1) {
					sb.append(",");
				}
			}
			sb.append(")");
		}
		sb.append("}");
		return sb.toString();
	}
	
	/**
	 * 测试DBUtil
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			DBUtil dao = DBUtil.getInstance();
			String sql0 = "select addd from operate";
			String sql = "select * from rolepower rp where rolecode = (select ur.rolecode from user u left join userrole ur on u.code = ur.usercode where u.code = 0001)";
			List<Map<String, Object>> list = dao.query(sql);
			sql = "select * from operate";
			String count = dao.scalar(sql0);
			// list = dao.queryPager(sql, 1, 10);
			System.out.println(count);
			System.out.println(list.size());
			// System.out.println(list.get(0).get("name"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Dbutil使用jar包

    Dbutil,全称为Apache Commons DbUtils,是一款由Apache软件基金会开发的开源Java工具包,它为JDBC(Java Database Connectivity)提供了一层简单的封装,旨在让数据库操作变得更加便捷且不易出错。DbUtil的设计目标...

    DBUtil工具类jar包

    DBUtil工具类是Java开发中常见的一种数据库操作辅助类,它的主要目的是为了简化数据库的CRUD(创建、读取、更新、删除)操作,提高开发效率。DBUtil通常集成了连接池技术,如Druid、C3P0或HikariCP等,以优化数据库...

    DBUtil(ASP。NET数据库连接工具类)

    DBUtil 是一个在ASP.NET开发环境中常用的数据库连接工具类,它的设计目的是为了简化数据库操作,减少程序员编写重复的连接和断开数据库的代码,从而提高开发效率和代码的可维护性。通过使用DBUtil,开发者可以快速地...

    DBUtil工具类

    DBUtil工具类是Java开发中常见的一种设计,用于简化数据库操作,提高开发效率。它通常包含了一系列静态方法,可以执行SQL语句,处理结果集,进行数据库连接的创建、管理和关闭等。这样的工具类在DAO(数据访问对象)...

    韩顺平SqlHelper,DBUtil工具类

    韩顺平SqlHelper和DBUtil工具类是为了解决这一问题而设计的,它们提供了一种方便的方式来处理SQL Server数据库。这两个工具类是非静态的,这意味着它们可以被实例化并复用,从而避免了静态类可能带来的线程安全问题...

    DButil 封装 包括模糊查询 分页Count 普通增删改查方法

    DButil 是一个数据库操作工具类,它封装了常见的SQL操作,如模糊查询、分页查询、数据的增删改查等。这样的工具类在实际开发中非常常见,它简化了数据库交互的代码,提高了开发效率。下面将详细介绍DButil封装中的...

    Laravel开发-dbutil

    在Laravel框架中,`dbutil`通常指的是数据库操作的实用工具或自定义库,它扩展了Laravel原生的数据库处理能力,提供了一系列便利的方法,以帮助开发者更高效地进行数据操作。本文将深入探讨Laravel开发中的`dbutil`...

    DBUtil使用于javaWeb连接池c3p0

    在这个场景下,`DBUtil` 类被用来简化与C3P0连接池的交互,以方便地进行数据库操作。下面我们将详细探讨`DBUtil` 的使用方法以及C3P0连接池的工作原理。 1. **C3P0简介** C3P0是由Miguel Grinberg创建的一个开源...

    DbUtil和tomcat数据源配置实例

    `DbUtil`是一个常见的数据库操作工具类,用于简化数据库连接的创建、关闭等操作,而Tomcat数据源(JNDI数据源)是应用服务器(如Tomcat)提供的一种管理数据库连接的机制。这两种方式都能有效地管理和优化数据库连接...

    dbutil-java于sql的连接

    在Java编程中,数据库操作是不可或缺的一部分,而`dbutil`通常是指用于简化数据库操作的工具包或类库。在本场景中,我们讨论的是如何使用Java与SQL Server进行连接,以及可能涉及到的XML配置文件的修改。下面将详细...

    dbutil+c3p0

    "dbutil+c3p0"这个组合涉及到两个关键组件:DBUtils和C3P0,它们都是Java数据库连接(JDBC)的辅助工具,使得数据库操作更加高效和便捷。下面将详细阐述这两个工具以及它们在实际应用中的作用。 首先,DBUtils是...

    通用数据库分页 扩展dbutil (附代码下载)

    本主题将深入探讨“通用数据库分页”以及如何通过扩展dbutil工具来实现这一功能。我们将从以下几个方面展开讨论: 1. **数据库分页原理**: 数据库分页的基本思想是将数据分成若干个页,每次只返回用户请求的一页...

    DBUtil包连接池

    DBUtil类内部包含有连接池创建和连接池的关闭,下载后记得修改URL

    数据库操作的DBUtil包,SQL2005驱动包,ASCII编码字符集

    在IT行业中,数据库操作是核心任务之一,而DBUtil包作为一种通用的数据库操作工具,能够极大地简化编程工作。本文将详细解析DBUtil包的使用、SQL Server 2005驱动包的功能,以及ASCII编码字符集的相关知识。 首先,...

    补丁MySQL+JDBC+DBUtil+c3p0史上最全数据库讲义.rar

    DBUtil和c3p0则是两个在Java开发中常用的数据库连接池工具,它们可以提高数据库操作的效率和性能。 **MySQL** MySQL是一个开源、免费的SQL数据库,提供了强大的数据存储和查询能力。它的优点包括高效、稳定、易于...

    Struts2+displaytag+dbutil

    Struts2、DisplayTag和DbUtil是Java Web开发中常用的三个框架或库,它们在构建高效、可维护的Web应用程序中发挥着重要作用。 Struts2是Apache软件基金会下的一个开源MVC(Model-View-Controller)框架,它提供了一...

    .NET连接Mysql - MYSQL4dotNet-DBUtil

    `.NET连接Mysql - MYSQL4dotNet-DBUtil`这个项目是专为使用C#语言在Windows CE(Wince)环境下连接MySQL数据库而设计的一个实用工具类库。`DBUtil.cs`文件很可能是这个库的核心组件,它提供了方便的方法来执行SQL...

    DBUtil——连接SQL (JDBC使用)

    本教程将围绕"DBUtil",一个简单的JDBC工具类,来介绍如何使用配置文件进行SQL连接和数据库的基本操作。这个工具类适用于初学者学习数据库连接管理。 首先,我们来看"db.properties"文件,这是用来存储数据库连接...

    DBUtil.java类

    DBUtil的类,在WEB开发当中有许多项目都需要用它,可以不用重复写,这样很方便

    Oracle JDBC DbUtil jdbc数据库连接

    Oracle JDBC DbUtil 是一个用于简化Java应用程序与Oracle数据库交互的工具包。这个工具包通过提供便利的类和方法,使得开发者能够更高效地执行SQL语句、管理数据库连接以及处理结果集。在给定的文件中,我们可以看到...

Global site tag (gtag.js) - Google Analytics