⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbaccess.java

📁 oa办公系统
💻 JAVA
字号:
package com.wanczy.dbutil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

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

public class DBAccess {
	private static final Log log=LogFactory.getLog(DBAccess.class);
	private ConnectionManager connManager=ConnectionManager.getInstance();
	/**
	 * 执行更改操作,有JDBC级别的事务
	 * @param sql 执行更改的SQL语句
	 * @return
	 */
	public int executeUpdate(String sql){
		int ret=0;
		log.debug("begin executeUpdate");
		Connection conn=connManager.getConnection();
		try{
			conn.setAutoCommit(false);
			Statement stmt=conn.createStatement();
			try{
				ret=stmt.executeUpdate(sql);
				conn.commit();
				log.debug(sql+" committed");
			}finally{
				stmt.close();
			}
		}catch(SQLException e){
			log.error(sql+"\n",e);
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.fatal("回滚失败",e1);
				throw new RuntimeException("执行"+sql+"失败,而且回滚失败",e);
			}
			throw new RuntimeException("执行"+sql+"失败",e);
		}finally{
			try{
				if(conn != null) conn.setAutoCommit(true);
			}catch (Exception e) {
				// TODO: handle exception
			}
			connManager.closeConn(conn);
		}
		return ret;
	}
	/**
	 * 根据提供的sql和参数表,来执行修改数据库的操作,有JDBC级别的事务
	 * @param sql
	 * @param params
	 * @return
	 */
	public int executeUpdate(String sql,Object [] params){
		int ret=0;
		Connection conn=connManager.getConnection();
		try{
			conn.setAutoCommit(false);
			PreparedStatement pstmt=conn.prepareStatement(sql);
			try{
				for(int i=0;i<params.length;i++){
					pstmt.setObject(i+1, params[i]);
				}
				ret=pstmt.executeUpdate();
				conn.commit();
				log.debug(sql+" committed!");
			}finally{
				pstmt.close();
			}
		}catch(SQLException e){
			log.error(sql,e);
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.fatal("回滚失败",e1);
				throw new RuntimeException("执行"+sql+"失败,而且回滚失败",e);
			}
			throw new RuntimeException("执行"+sql+"失败",e);
		}finally{
			try{
				if(conn != null) conn.setAutoCommit(true);
			}catch (Exception e) {
				// TODO: handle exception
			}
			connManager.closeConn(conn);
		}
		return ret;
	}
	/**
	 * 执行查询的方法,需要提供SQL,和结果集的处理
	 * @param sql 查询的SQL语句
	 * @param handler 结果集的一行记录到POJO对象的一个转换代码
	 * @return
	 */
	public List executeQuery(String sql,IResultSetHandler handler){
		log.debug("查询:"+sql);
		List list=new ArrayList();
		Connection conn=connManager.getConnection();
		try{
			Statement stmt=conn.createStatement();
			try{
				ResultSet rs=stmt.executeQuery(sql);
				while(rs.next()){
					list.add(handler.handle(rs));
				}
				rs.close();
			}finally{
				stmt.close();
			}
		}catch(SQLException e){
			log.error("执行"+sql+"失败",e);
			throw new RuntimeException("执行"+sql+"失败",e);
		}finally{
			connManager.closeConn(conn);
		}
		return list;
	}
	/**
	 * 执行查询,要提供sql,参数表和结果集的对象映射方法.
	 * @param sql
	 * @param params
	 * @param handler
	 * @return
	 */
	public List executeQuery(String sql,Object[] params,IResultSetHandler handler){
		log.debug("查询:"+sql);
		List list=new ArrayList();
		Connection conn=connManager.getConnection();
		try{
			PreparedStatement pstmt=conn.prepareStatement(sql);
			try{
				for(int i=0;i<params.length;i++){
					pstmt.setObject(i+1, params[i]);
				}
				ResultSet rs=pstmt.executeQuery();
				while(rs.next()){
					list.add(handler.handle(rs));
				}
				rs.close();
			}finally{
				pstmt.close();
			}
		}catch(SQLException e){
			log.error("执行"+sql+"失败",e);
			throw new RuntimeException("执行"+sql+"失败",e);
		}finally{
			connManager.closeConn(conn);
		}
		return list;
	}
	/**
	 * 批量执行更新修改操作,
	 * @param sql 用于PreparedStatement的SQL语句
	 * @param params 二维对象数组,每行是一条SQL语句的参数。
	 * @return 执行完影响的记录数
	 */
	public int executeBatch(String sql,Object [][] params){
		int ret=0;
		Connection conn=connManager.getConnection();
		try{
			conn.setAutoCommit(false);
			PreparedStatement pstmt=conn.prepareStatement(sql);
			try{
				for(int j=0;j<params.length;j++){
					for(int i=0;i<params[j].length;i++){
						pstmt.setObject(i+1, params[j][i]);
					}
					pstmt.addBatch();
				}
				int[] rets=pstmt.executeBatch();
				conn.commit();
				for(int i:rets){
					ret+=i;
				}
				log.debug(sql+" 批量 committed!");
			}finally{
				pstmt.close();
			}
		}catch(SQLException e){
			log.error(sql,e);
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.fatal("回滚失败",e1);
				throw new RuntimeException("批量执行"+sql+"失败,而且回滚失败",e);
			}
			throw new RuntimeException("批量执行"+sql+"失败",e);
		}finally{
			try{
				if(conn != null) conn.setAutoCommit(true);
			}catch (Exception e) {
				// TODO: handle exception
			}
			connManager.closeConn(conn);
		}
		return ret;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -