`
xiasheng
  • 浏览: 70625 次
  • 性别: 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;
	   }		
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics