java db


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import org.apache.commons.beanutils.BeanUtils;

/**
 * 通用数据库连接工具
 * 
 * 
 */
public class DbTools {
	static ResourceBundle messages = ResourceBundle.getBundle("jdbc",
			Locale.CHINESE);

	/**
	 * 获得数据库连接,连接参考来自配置文件 dbconfig.properties
	 * 
	 * @return
	 * @throws Exception
	 */
	public static Connection fetchConnection() throws Exception {
		String _DRIVER = messages.getString("driver");
		String _URL = messages.getString("url");
		String _USERNAME = messages.getString("username");
		String _PASSWORD = messages.getString("password");

		Class.forName(_DRIVER).newInstance();
		return DriverManager.getConnection(_URL, _USERNAME, _PASSWORD);
	}

	/**
	 * 执行SQL语句,返回SQl的生效结果,如果值为-1表示该SQL是查询语句,如果是insert,update,delete的sql
	 * 那么将返回被影响数据库的记录个数,如果返回值为0,可能存在两种情况:<br>
	 * 1: SQl是DDL语句 <br>
	 * 2: SQL是insert,update,delete语句,但是执行结果没有修改数据库的记录信息
	 * 
	 * @param sql
	 * 
	 * 
	 */
	public static int execute(String sql) {

		Connection con = null;
		try {
			// 获得数据库连接
			con = fetchConnection();
			// 获得Statment句柄
			Statement st = con.createStatement();
			// 在连接的目标数据库上执行SQL
			st.execute(sql);
			// 返回SQL的执行结果
			return st.getUpdateCount();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("SQL执行失败:" + e.getMessage());
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 带事务模式<br>
	 * 执行SQL语句,返回SQl的生效结果,如果值为-1表示该SQL是查询语句,如果是insert,update,delete的sql
	 * 那么将返回被影响数据库的记录个数,如果返回值为0,可能存在两种情况:<br>
	 * 1: SQl是DDL语句 <br>
	 * 2: SQL是insert,update,delete语句,但是执行结果没有修改数据库的记录信息 <br>
	 * <br>
	 * 需要注意的是如果需要使用事务,那么请先将con的autocommit设置为false
	 * 
	 * @param sql
	 * 
	 * 
	 */
	public static int executeTransaction(String sql, Connection con) {

		try {
			// 获得Statment句柄
			Statement st = con.createStatement();
			// 在连接的目标数据库上执行SQL
			st.execute(sql);
			// 返回SQL的执行结果
			return st.getUpdateCount();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("SQL执行失败:" + e.getMessage());
		}
	}

	/**
	 * 启动事务
	 * 
	 * @return
	 */
	public static Connection beginTransaction() {
		Connection con;
		try {
			con = DbTools.fetchConnection();
			con.setAutoCommit(false);
			return con;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;

	}

	/**
	 * 结束事务
	 * 
	 * @param con
	 */
	public static void endTransaction(Connection con) {
		if (con != null) {
			try {
				con.commit();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * 执行查询操作
	 * 
	 * @param sql
	 *            查询语句
	 * @return sql的执行结果集,存储模式List<Map> 其中map中以column-value的模式保存数据库的数据<br>
	 *         如果参数中的sql不是查询语句那么返回结果为null
	 */
	public static List queryData(String sql) {
		// 保存查询的结果信息
		List list = new ArrayList();
		Connection con = null;
		try {
			// 获得数据库连接
			con = fetchConnection();
			// 获得Statment句柄
			Statement st = con.createStatement();
			// 在连接的目标数据库上执行SQL
			boolean sqltype = st.execute(sql);
			if (!sqltype) {// 如果不是查询语句那么返回空
				return null;
			}
			// 获得查询结果集
			ResultSet rs = st.getResultSet();
			// 获得查询结果集中的表字段信息
			ResultSetMetaData metaData = rs.getMetaData();

			while (rs.next()) {
				// 创建一个map对象,来存储一条记录信息
				Map preRecord = new HashMap();
				// 遍历结果集中的字段,将当前行的数据库记录数据,写入map对象中
				for (int i = 1; i <= metaData.getColumnCount(); i++) {
					// 获得字段名
					String columnname = metaData.getColumnName(i);
					// 获得字段的值
					Object value = rs.getObject(columnname);
					// 写入一个字段的值
					preRecord.put(columnname, value);
				}
				// 将一条记录存入动态数组
				list.add(preRecord);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return list;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param sql
	 *            查询语句
	 * @return sql的执行结果集,存储模式List<Map> 其中map中以column-value的模式保存数据库的数据<br>
	 *         如果参数中的sql不是查询语句那么返回结果为null
	 */
	public static List queryData(String sql, Class classobj) {
		// 保存查询的结果信息
		List list = new ArrayList();
		Connection con = null;
		try {
			// 获得数据库连接
			con = fetchConnection();
			// 获得Statment句柄
			Statement st = con.createStatement();
			// 在连接的目标数据库上执行SQL
			boolean sqltype = st.execute(sql);
			if (!sqltype) {// 如果不是查询语句那么返回空
				return null;
			}
			// 获得查询结果集
			ResultSet rs = st.getResultSet();
			// 获得查询结果集中的表字段信息
			ResultSetMetaData metaData = rs.getMetaData();

			while (rs.next()) {
				// 创建一个map对象,来存储一条记录信息
				Object obj = classobj.newInstance();
				// 遍历结果集中的字段,将当前行的数据库记录数据,写入map对象中
				for (int i = 1; i <= metaData.getColumnCount(); i++) {
					// 获得字段名
					String columnname = metaData.getColumnName(i);
					// 获得字段的值
					Object value = rs.getObject(columnname);
					// 写入一个字段的值
					BeanUtils.setProperty(obj, columnname, value);

				}
				// 将一条记录存入动态数组
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (con != null) {
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return list;
	}
}


jdbc.properties 文件

driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/db
username=root
password=123456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值