`
xiasheng
  • 浏览: 69826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

类 Hibernate Session DBUtil

    博客分类:
  • DB
阅读更多
package com.core.util;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.core.exception.ServiceException;


public final class DBUtil {
	
	private static final Log log = LogFactory.getLog(DBUtil.class); 
	
	// 定义一个数据库连接对象		
	private DBUtil() {}
	
	private static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>();   	
	
	public static Connection getConnection() {
		Connection conn =  connection.get();
		if(conn == null){
			try {
				Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
				conn = DriverManager.getConnection("proxool.DB");				
				connection.set(conn);
			} catch (ClassNotFoundException e) {
				 log.error("#ERROR# :创建数据库连接发生异常,请检查!", e); 
			}catch (SQLException e) {
				 log.error("#ERROR# :创建数据库连接发生异常,请检查!", e); 
			}
		}			
		return conn;
	}

	/**
	 * 执行数据库增、删、改操作.
	 * 
	 * @param sql
	 *            待操作的sql字符串
	 * @return 执行结果所影响的行数,异常则返回-1
	 * @throws SQLException 
	 * @throws Exception
	 */
	public static int  executeUpdate(String sql){		
		int exeOk = -1;	
		Statement stmt = null;
		try {	
			stmt = getConnection().createStatement();
			exeOk = stmt.executeUpdate(sql);
		} catch (SQLException e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e); 
		}finally{
			close(stmt);
		}
		return exeOk;
	}

	/**
	 * 执行批处理操作一般用于事务
	 * 
	 * @param vSqlStr 传入的被操作sql字符串数组
	 * @return 执行批处理后所影响的行数
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static int[] executeUpdate(List sqlList){
		int updateCounts[] = null;
		Statement stmt = null;
		Connection conn = getConnection();
		try {		
			stmt = conn.createStatement();
			conn.setAutoCommit(false);			
			for (int i = 0; i < sqlList.size(); i++) {
				String sql = sqlList.get(i) + "";
				stmt.addBatch(sql);
			}
			updateCounts = stmt.executeBatch();
			conn.commit();
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.error("#ERROR# :执行数据回滚出错,请检查!", e); 
			}
			log.error("#ERROR# :执行批量SQL语句出错,请检查!", e); 
		}finally{
			close(stmt);
		}
		return updateCounts;
	}
	

	@SuppressWarnings("unchecked")
	public static RsList executeQuery(String query){		
		ResultSet resultSet = null;
		ResultSetMetaData metaData = null;
		RsList rs = null;
		Statement stmt = null;
		try {
			stmt = getConnection().createStatement();
			resultSet = stmt.executeQuery(query);
			int colNumber = 0;					
			LinkedHashMap<String, String> recoMap;
			String colName = "";
			String colValue = "";
			rs = new RsList();
			while(resultSet != null && resultSet.next()){					
				recoMap = new LinkedHashMap<String, String>();
				metaData = resultSet.getMetaData();
				colNumber = metaData.getColumnCount();
				for (int i = 1; i <colNumber+1;i++) {
					colName = metaData.getColumnLabel(i)
							.toLowerCase();
					colValue = resultSet.getString(i);
					if(!StringUtil.isBlank(colValue)){
						recoMap.put(colName, colValue);
					}else{
						recoMap.put(colName, "");
					}
				}
				rs.add(recoMap);
			}			
		} catch (SQLException e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + query, e); 
		} finally {
			close(stmt,resultSet);
		}
		return rs;
	}
	

	/**
	 * 取得数据库服务器的当前日期(年-月-日 时:分:秒)。	 
	 * @return 数据库服务器的当前日期,java.sql.Timestamp对象。
	 */
	public static Timestamp getCurrentTime(){
		String sql = "select sysdate as datevalue from dual";		
		ResultSet rs = null;
		Timestamp dtRtn = null;
		Statement stmt = null;
		try {		
			stmt = getConnection().createStatement();
			rs = stmt.executeQuery(sql);
			while (rs != null && rs.next()) {
				dtRtn = rs.getTimestamp(1);
			}
		} catch (SQLException e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e); 
		} finally {
			close(stmt,rs);
		}
		return dtRtn;
	}

	/**
	 * 取得数据库服务器的当前日期(年-月-日)。
	 * 
	 * @return 数据库服务器的当前日期,java.sql.Date对象。
	 */
	public static Date getCurrentDate(){
		String sql = "select sysdate as datevalue from dual";		
		ResultSet rs = null;
		Date dtRtn = null;
		Statement stmt = null;
		try {	
			stmt = getConnection().createStatement();
			rs = stmt.executeQuery(sql);
			while (rs != null && rs.next()){
				dtRtn = rs.getDate(1);
			}
		} catch (SQLException e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e); 
		} finally {
			close(stmt,rs);
		}
		return dtRtn;
	}

	/**
	 * 取得某个序列对象的下一个ID。
	 * 
	 * @param sequence
	 *            该对象对应数据库中的SEQUENCE的名字。
	 * @return 该对象的下一个ID,如果失败返回-1。
	 */
	public static long getNextId(String sql){
		ResultSet rs = null;
		long nextId = 1;
		Statement stmt = null;
		try {
			stmt = getConnection().createStatement();
			rs = stmt.executeQuery("select " + sql
					+ ".nextval as id from dual");
			while(rs != null && rs.next()) {
				nextId = rs.getLong(1);
			}
		} catch (SQLException e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e); 
		} finally {
			close(stmt,rs);
		}
		return nextId;
	}
	
	/**
	 * 获取结果集的记录段(用于分页)
	 * @param query 查询字符串
	 * @param rowCount  总记录数
	 * @param currPage  当前页码
	 * @param pageSize  每页记录数
	 * @return  RsList  记录内容列表
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	protected static RsList executeQuery(String query, int rowCount, int currPage,
			int pageSize){

		ResultSet resultSet = null;
		ResultSetMetaData metaData = null;
		Statement stmt = null;
		int startPostion =0;
		int endPostion =0;
		
		RsList rs = new RsList();

		int pageCount = -1;
		try {
     
			if (rowCount <= 0)
				throw new ServiceException("记录总数小于0");

			// 计算总页数
			if (pageSize <= 0)
				pageSize = 10;
			
			pageCount = (rowCount + pageSize - 1) / pageSize;

			// 计算要显示的页码
			if (currPage <= 0)
				currPage = 1;
			if (currPage > pageCount)
				currPage = pageCount;

			// 定位记录开始索引
			if (pageCount > 0){
				startPostion = (currPage - 1) * pageSize + 1;
				endPostion = (currPage - 1) * pageSize + pageSize;
			}else if(pageCount == 0){
				startPostion = 1;
				endPostion = pageSize;
			}
			
			//新加代码
			StringBuffer sql = new StringBuffer();
			sql.append("select * from ( select row_.*, rownum rownum_ from ( ");
			sql.append(query.trim());
			sql.append(") row_ where rownum <= ").append(endPostion).append(" ) where rownum_  >= ").append(startPostion);
		
			stmt = getConnection().createStatement();
			resultSet = stmt.executeQuery(sql.toString());		
			
			int colNumber = 0;					
			LinkedHashMap<String, String> recoMap;
			String colName = "";
			String colValue = "";
			while(resultSet != null && resultSet.next()){				
				recoMap = new LinkedHashMap<String, String>();
				metaData = resultSet.getMetaData();
				colNumber = metaData.getColumnCount();
				for (int i = 1; i < colNumber + 1; i++) {
					colName = metaData.getColumnLabel(i)
							.toLowerCase();
					colValue = resultSet.getString(i);
					if(!StringUtil.isBlank(colValue)){
						recoMap.put(colName, colValue);
					}else{
						recoMap.put(colName, "");
					}
				}
				rs.add(recoMap);
			}
		} catch (SQLException e) {			
			log.error("#ERROR# :执行分页查询出错,请检查!\n", e); 
		} finally {
			close(stmt,resultSet);
		}
		return rs;
	}
	
	
	/**
	 * 获得查询总记录数(用于分页)
	 * @param query 查询字符串
	 * @return  rowCount  -1: 无记录 
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	protected static int getRowCount(String query){
		ResultSet resultSet = null;
		Statement stmt = null;
		int rowCount = -1;		
		try {			
			//新加代码
			StringBuffer sql = new StringBuffer();
			sql.append("select count(*) from ( ").append(query.trim()).append(" )");			
			stmt = getConnection().createStatement();
			resultSet = stmt.executeQuery(sql.toString());
			while(resultSet != null && resultSet.next())
				rowCount = resultSet.getInt(1);			
		} catch (SQLException e) {
			log.error("#ERROR# :执行查询记录总数SQL语句出错,请检查!\n" + query, e); 
		} finally {
			close(stmt,resultSet);
		}
		return rowCount;
	}
	
    /**
     * 获取结果集的记录段(用于分页)
     * @param query 查询语句
     * @param currPage 查询页码
     * @return
     * @throws Exception
     */
	@SuppressWarnings("unchecked")
	public static List executeQuery(String query,String currPage){        
		int pageNum = 1;
		int rowCount = 0;
		List result = new ArrayList();
		RsList rs = new RsList();
		try {		
			if(!StringUtil.isBlank(currPage))
				pageNum = Integer.valueOf(currPage.trim()).intValue();
			rowCount = getRowCount(query);
			if(rowCount > 0 ){
				rs = executeQuery(query,rowCount,pageNum,GolbalParameter.PAGE_SIZE);
			}
		}catch (Exception e) {
			log.error("#ERROR# :执行SQL语句出错,请检查!\n" + query, e); 
		}finally{
			result.add(rowCount);
			result.add(rs);
		}
		return result;
	}
	
	
	public static void beginTransaction(){	
		Connection conn = getConnection();
		try {		
			if(conn != null)
				conn.setAutoCommit(false);
		} catch (SQLException e) {
			log.error("#ERROR# :执行开启事务出错,请检查!\n", e); 
		}
	}
	
	public static void commitTransaction(){		
		Connection conn = connection.get();
		try {			
			if(conn != null){
				conn.commit();
				conn.setAutoCommit(true);
			}
		} catch (SQLException e) {
			log.error("#ERROR# :执行提交事务出错,请检查!\n", e); 
		}
	}
	
	public static void rollbackTransaction(){
		Connection conn = connection.get();
		try {			
			if(conn != null)
				conn.rollback();
		} catch (SQLException e) {
			log.error("#ERROR# :执行回滚事务出错,请检查!\n", e); 
		}
	}
	
	
	/**
	 * 关闭数据操作对象ResultSet
	 * 	 
	 * @param rs 数据结果集对象
	 */
	public static void close(ResultSet rs){
		if (rs != null){
			try {
				rs.close();
			} catch (SQLException e) {			
				log.error("#ERROR# :关闭ResultSet发生异常,请检查!\n", e); 
			}	
			rs = null;
		}
	}
	
	protected static void close(Statement stmt){
		if (stmt != null){
			try {
				stmt.close();
			} catch (SQLException e) {			
				log.error("#ERROR# :关闭Statement发生异常,请检查!\n", e); 
			}	
			stmt = null;
		}
	}
	
	/**
	 * 关闭数据操作对象Statement、ResultSet
	 * 
	 * @param stmt
	 * @param rs   数据结果集对象
	 */
	protected static void close(Statement stmt, ResultSet rs) {

		if (rs != null){
			try {
				rs.close();
			} catch (SQLException e) {			
				log.error("#ERROR# :关闭ResultSet发生异常,请检查!\n", e); 
			}	
			rs = null;
		}		
		
		if (stmt != null){
			try {
				stmt.close();
			} catch (SQLException e) {			
				log.error("#ERROR# :关闭Statement发生异常,请检查!\n", e); 
			}	
			stmt = null;
		}
	}

	/**
	 * 关闭数据库连接对象Connection释放资源
	 */
	public static void close(){				
		Connection conn = connection.get();
		connection.set(null);
		if (conn != null){
			try {
				conn.close();				
			} catch (SQLException e){
				log.error("#ERROR# :关闭数据库连接发生异常,请检查!\n", e); 
			}
			conn = null;
	   }		
	}
}

 

分享到:
评论

相关推荐

    dbutils dbutils dbutils dbutils

    dbutils dbutils dbutils dbutils

    DBUtils(通用的数据库工具类)

    DBUtils(通用的数据库工具类)DBUtils(通用的数据库工具类)

    python-dbutils 简单封装

    python dbutils 简单封装

    python类DBUtils安装包

    DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 Webware for Python 一部分用来结合 PyGreSQL 访问 PostgreSQL 数据库,当然他也可以用在其他Python应用程序中来访问 DB-...

    dbutils工具类

    dbutils工具类的使用

    DBUtils工具类

    JDBC的工具类,就是java操作的数据库的小工具,配合c3p0连接池.让你操作数据库简单明了.复制进项目就能使用.欢迎下载

    DBUtils 工具类

    DBUtils 工具类

    C3P0和DButils

    c3p0-0.9.1.2.jar、commons-dbutils-1.4.jar、mysql-connector-java-5.1.39-bin.jar

    Commons-dbutils1.7 jar包.rar

    commons-dbutils包是Apache开源组织提供的用于操作数据库的工具包。简单来讲,这个工具包就是用来更加方便我们操作数据库的,最近工作中使用了一下,感觉确实方便很多,基本告别自己封装JDBC代码对数据库进行增删改...

    dbutils

    dbutils 它不是一个DAO,也不是类似Hibernate的工具, 仅是对已有的JDBC技术进行了一个简单封装。

    模仿DBUtils(自己模仿DBUtils写的简易DBUtils)

    模仿DBUtils(自己模仿Commons DBUtils写的简易DBUtils),欢迎大家下载学习,这不是Apache旗下的DBUtils哦~

    commons-dbutils-1.6.jar包

    包org.apache.commons.dbutils DbUtils是一个为简化JDBC操作的小类库. 接口摘要 ResultSetHandler 将ResultSet转换为别的对象的工具. RowProcessor 将ResultSet行转换为别的对象的工具. 类摘要 BasicRowProcessor ...

    commons-dbutils-1.7-API文档-中文版.zip

    赠送jar包:commons-dbutils-1.7.jar; 赠送原API文档:commons-dbutils-1.7-javadoc.jar; 赠送源代码:commons-dbutils-1.7-sources.jar; 赠送Maven依赖信息文件:commons-dbutils-1.7.pom; 包含翻译后的API文档...

    commons-dbutils-1.7.zip

    dbutils

    DBUtils操作数据库以及事物的管理

    DBUtils操作数据库以及事物的管理

    commons-dbutils.jar.rar

    commons-dbutils.jar jdbc工具类jar包 1.3、1.6、1.7三个版本

    dbutils api

    dbutils api

    Dbutils项目实例

    DBUtils包括3个包: org apache commons dbutils org apache commons dbutils handlers org apache commons dbutils wrappers DBUtils封装了对JDBC的操作 简化了JDBC操作 可以少写代码 org apache commons dbutils ...

    dbutils工具类的使用

    dbutils

    DbUtils应用开发例子--DbUtilsExample.zip

    Apache Common DbUtils是操作数据库的组件,对传统操作数据库的类(JDBC)进行二次封装,可以把结果集转化成List。 DbUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 应用实践小结: 一、...

Global site tag (gtag.js) - Google Analytics