首页>代码>jsp开发简单的新闻门户系统,包括前台展现和后台管理>/门户系统/项目/recruitPortal/src/com/cqut/recruitPortal/dao/CommonDAO.java
package com.cqut.recruitPortal.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
* 项目名称:recruitPortal
* 类名称:CommonDAO
* 类描述:封装 JDBC 的常用操作   
* @version 1.0
* Copyright (c) 2014 ChongQing University Of Technology
 */
public class CommonDAO {
	
	//数据URL
	private static final String url = "jdbc:mysql://localhost:3306/recruitPortal?Unicode=true&characterEncoding=UTF-8";
	
	//用户名
	private static final String username = "root";
	
	//密码
	private static final String password = "root";
	
	//数据库驱动
	private static final String jdbcDriver = "com.mysql.jdbc.Driver";
	
	
	//调用 ParameterMetaData.getParameterType(i + 1) 是否会抛出异常
	protected boolean pmdKnownBroken = false;
	
	public CommonDAO() {
		
	}
	
	public CommonDAO(boolean pmdKnownBroken) {
		this.pmdKnownBroken = pmdKnownBroken;
	}
	
	
	public Connection getConnetion(){
		
		Connection conn = null;
		try {
			Class.forName(jdbcDriver);
			conn = DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	* @Title: executeQuery 
	* @Description: 
	* 	执行Sql 查询语句,把结果集合放在一个 List<Map<String,Object>> 里面
	* @param sql
	* @param parmas
	* @return 
	* @return List<Map<String,Object>>
	 */
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> executeQuery(String sql,Object[] params){
		return (List<Map<String, Object>>) this.excuteQuery(sql, params, new ListMapHander());
	}
	
	/**
	* @Title: excuteQuery 
	* @Description: 查询给定的SQL语句,并且自定义的处理结果集。
	* 调用者需要自己手动实现 接口<code>ResultSetHander.doHander(ResultSet rs)</code> 方法以得结果集里面的数据
	* @param sql
	* @param params
	* @param rsh
	* @return 
	* @return Object
	*/
	public Object excuteQuery(String sql,Object[] params,ResultSetHander rsh){
		PreparedStatement stmt = null;
        ResultSet rs = null;
        Connection con = this.getConnetion(); 
        List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>(); 
        try {
			stmt = con.prepareStatement(sql);
			
			System.out.println("SQL:"+sql+"; Parameters:"+Arrays.deepToString(params));
			
			//填充Statement的参数
			fillStatement(stmt,params);
			//执行查询
			rs = stmt.executeQuery();
			
			Object obj = rsh.doHander(rs);
			return obj;
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//关闭数据库连接
			close(con,stmt,rs);
		}
		return resultList;
	}
	
	
	public int executeUpdate(String sql,Object[] params){
		PreparedStatement stmt = null;
        Connection con = this.getConnetion(); 
        
        int rs = 0;
        try {
        	con.setAutoCommit(false);
        	//创建PreparedStatement对象
			stmt = con.prepareStatement(sql);
			//填充Statement的参数
			fillStatement(stmt,params);
			System.out.println("SQL:"+sql+"; Parameters:"+Arrays.deepToString(params));
			//执行查询
			rs = stmt.executeUpdate();
			
			//提交事务
			con.commit();
			//把事务设置为原来的状态
			con.setAutoCommit(true);
		} catch (SQLException e) {
			//在捕获到异常的时候事务回滚
			try {
				con.rollback();
				if(!con.getAutoCommit()){
					con.setAutoCommit(true);
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally{
			//关闭数据库连接
			close(con,stmt,null);
		}
		return rs;
	}
	
	/**
	* @Title: fillStatement 
	* @Description: 填充SQL参数
	* @param stmt
	* @param params
	* @throws SQLException 
	* @return void
	 */
	private void fillStatement(PreparedStatement stmt, Object[] params)
			throws SQLException {

		//检测参数的个数是否合法,但是有的数据库驱动不支持 stmt.getParameterMetaData()这个方法。
		//因此我们有一个一个pmdKnownBroken 变量来标识当前数据驱动是否支持该方法的调用。
		ParameterMetaData pmd = null;
		if (!pmdKnownBroken) {
			pmd = stmt.getParameterMetaData();
			int stmtCount = pmd.getParameterCount();
			int paramsCount = params == null ? 0 : params.length;
			
			if (stmtCount != paramsCount) {
				System.out.println("stmtCount:"+stmtCount+",paramsCount:"+paramsCount);
				throw new SQLException("Wrong number of parameters: expected "
						+ stmtCount + ", was given " + paramsCount);
			}
		}

		// 如果 params 为 null 直接返回
		if (params == null) {
			return;
		}

		for (int i = 0; i < params.length; i++) {
			if (params[i] != null) {
				stmt.setObject(i + 1, params[i]);
			} else {
				int sqlType = Types.VARCHAR;
				if (!pmdKnownBroken) {
					try {
						sqlType = pmd.getParameterType(i + 1);
					} catch (SQLException e) {
						pmdKnownBroken = true;
					}
				}
				stmt.setNull(i + 1, sqlType);
			}
		}
	}
	
	
		
	
	/**
	* @Title: close 
	* @Description: 关闭数据库连接 
	* @param con
	* @param stmt
	* @param rs 
	* @return void
	 */
	private void close(Connection con,Statement stmt,ResultSet rs){
		
		if(rs!=null){
			try {
				rs.close();
			} catch (Exception e) {
			}finally{
				if(stmt!=null){
					try {
						stmt.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}finally{
						if(con!=null){
							try {
								con.close();
							} catch (SQLException e) {
								e.printStackTrace();
							}
						}
					}
				}
			}
		}
		
		
	}
	
	
}
最近下载更多
ma406805131  LV19 2024年12月18日
PISCESPLUS  LV4 2024年9月3日
sadselect  LV8 2024年6月28日
bankroll  LV5 2024年6月13日
云着殇  LV9 2024年6月5日
lmj12345  LV2 2024年5月19日
GerryGim  LV4 2024年1月15日
pangzhihui  LV14 2023年12月27日
768881787  LV7 2023年6月25日
hongdongdong  LV14 2023年6月17日
最近浏览更多
luhong  LV1 4月1日
ma406805131  LV19 2024年12月18日
qwqwx585160  LV2 2024年12月15日
traume 2024年12月11日
暂无贡献等级
微信网友_7005760998215680  LV6 2024年10月2日
PISCESPLUS  LV4 2024年9月3日
hello_jugg  LV7 2024年8月7日
asdfgh112 2024年7月4日
暂无贡献等级
sadselect  LV8 2024年6月28日
bankroll  LV5 2024年6月13日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友