数据库连接JDBC工具类,Java连接数据库通用增删改查,小驼峰命名格式

Java连接数据库


import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.log4j.Logger;

/**
 * 数据库连接JDBC工具类
 * 
 * @author key
 *
 */
public class JDBCUtil {
	// 私有构造
	private JDBCUtil() {
	}

	private static String URL = null;//
	private static String USERNAME = null;
	private static String PASSWORD = null;

	private static Connection conn = null;// 连接对象
	private static PreparedStatement ps = null;// 执行对象
	private static ResultSet rs = null;// 数据库查询结果集
	private static ResultSetMetaData rsd = null;// 保存结果集中列的信息
	//log4j日志对象,使用此对象需要导入log4j的jar包,以及配置文件
	private static Logger log = Logger.getLogger(JDBCUtil.class);
	// 静态块,类加载是只执行一次
	static {
		try {
			// 创建输出流对象
			InputStream is = JDBCUtil.class
					.getResourceAsStream("/mysql.properties");
			// 获取properties对象
			Properties pts = new Properties();
			// 加载配置文件
			pts.load(is);
			Class.forName(pts.getProperty("forName"));
			URL = pts.getProperty("url");
			USERNAME = pts.getProperty("user");
			PASSWORD = pts.getProperty("password");
		} catch (Exception e) {
			System.out.println("数据库连接失败!");
			e.printStackTrace();
		}
	}

	// static 静态修饰可以不用new也可以获取方法
	/**
	 * @return 数据库连接对象
	 */
	public static Connection getConnection() {
		try {
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 数据库连接对象
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 关闭数据库
	 * 
	 * @param conn
	 *            连接数据库对象
	 * @param stat
	 *            执行对象
	 */
	public static void Close(Connection conn, Statement stat) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
			}
		}
		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException e) {
			}
		}
	}

	/**
	 * 关闭数据库
	 * 
	 * @param conn
	 *            数据库连接对象
	 * @param stat
	 *            执行者对象
	 * @param rst
	 *            查询结果集对象
	 */
	public static void Close(Connection conn, Statement stat, ResultSet rst) {

		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
			}
		}
		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException e) {
			}
		}
		if (rst != null) {
			try {
				rst.close();
			} catch (SQLException e) {
			}
		}
	}

	/**
	 * 通用增删改
	 * 
	 * @param sql
	 *            数据库预编译语句
	 * @param param
	 *            预编译语句参数
	 * @return 受影响行数
	 */
	public static int executeUpdate(String sql, Object[] param) {
		Connection conn = getConnection();
		ps = null;
		int count = 0;
		try {
			ps = conn.prepareStatement(sql);
			setParameter(param);
			count = ps.executeUpdate();
		} catch (SQLException e) {
			log.error(e);
		} finally {
			Close(conn, ps);
		}
		return count;
	}

	/**
	 * 将数据库中获取的列名格式,以下划线命名的格式转换为Java属性名格式的小驼峰命名的格式
	 * 
	 * @param str
	 *            以“_”分割出来的str字符串数组
	 * @return 小驼峰命名格式的字符串
	 */
	public static String columnFormat(String[] str) {
		// 定义一个字符串类型的fieldName用来保存转换过的字段名
		String fieldName = "";
		// 循环这个数组中的字符串(以“_”分割出来的单词),转成java中的属性名(小驼峰命名法),第一个单词不用首字母不用大写,之后的每个单词首字母大写
		for (int j = 0; j < str.length; j++) {
			// 判断,如果不是第一个那就字符串截取,截取首字母把他转成大写,再拼接起来
			if (j != 0) {
				str[j] = str[j].substring(0, 1).toUpperCase()
						+ str[j].substring(1);
			}
			// 拼接起来保存到这个变量中,就是类中的属性名(注意这里的必须要保证数据库和java属性名之间的转换规范,把mysql中的字段名转成属性名是见了“_”就去掉“_”然后首字母大写)
			fieldName += str[j];
		}
		return fieldName;
	}

	/**
	 * 调用Mysql存储过程
	 * @param sql
	 * @param param
	 * @return 受影响行数
	 */
	public static int executeProcedure(String sql, Object[] param) {
		// 数据库查询
		int i = 0;//受影响行数
		try {
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			setParameter(param);//预编译参数设置
			// 获取查询结果集
			rs = ps.executeQuery();
			while(rs.next()){
				i = rs.getInt(1);
			}
			
		} catch (Exception e) {
			System.out.println("数据库存储过程异常:"+e);
		}finally {
			Close(conn, ps, rs);
		}
		return i;
	}

	/**
	 * 数据库通用查询
	 * 
	 * @param sql
	 *            语句
	 * @param param
	 *            语句参数
	 * @param clz
	 *            类对象
	 * @return 对象数组
	 */
	public static List<Object> executeQuery(String sql, Object[] param,
			Class clz) {
		List<Object> list = new ArrayList<Object>();// 保存查询的数据库中的对象
		Object obj = null;// 声明Object类型的变量,用来引用class对象

		try {
			// 数据库查询
			conn = getConnection();
			ps = conn.prepareStatement(sql);
			setParameter(param);
			// 获取查询结果集
			rs = ps.executeQuery();
			// 获取结果集中的列信息
			rsd = rs.getMetaData();
			// 知道列的数量
			int columnCount = rsd.getColumnCount();

			// 查询行
			while (rs.next()) {
				obj = clz.newInstance();// 实例化传入的class对象
				// 获取列名和值
				for (int i = 1; i <= columnCount; i++) {
					// 把获取到的字段名全部先转成小写
					// 把以“_”分割出来的字符保存到str字符串数组中(因为mysql中的字段名每个单词之间用“_”分割),分割出每个单词
					String[] str = rsd.getColumnName(i).toLowerCase()
							.split("_");
					// 定义一个字符串类型的fieldName用来保存转换过的字段名
					String fieldName = columnFormat(str);//columnFormat:自定义方法

					// 获取clz类中的指定fieldName名称的成员变量,可以获得私有变量
					Field filed = clz.getDeclaredField(fieldName);

					// 如果类对象中的成员变量是用private修饰的,则必须将此改为true,否则报错,无法获取
					filed.setAccessible(true);

					String columnName = rsd.getColumnName(i); // 根据获取的列信息获取列名
					Object value = rs.getObject(columnName);// 根据列名获取值
					// 设置类中的成员变量的值
					filed.set(obj, value);

				}
				// 将对象添加至数组中
				list.add(obj);
			}

		} catch (SQLException e) {
			log.fatal("数据库异常:" + e);
		} catch (NoSuchFieldException e) {
			log.fatal(e);
		} catch (SecurityException e) {
			log.fatal(e);
		} catch (IllegalArgumentException e) {
			log.fatal(e);
		} catch (IllegalAccessException e) {
			log.fatal(e);
		} catch (InstantiationException e) {
			log.fatal(e);
		} finally {
			Close(conn, ps, rs);
		}
		return list;
	}

	/**
	 * 预编译语句参数设置
	 * 
	 * @param param
	 *            参数数组
	 * @throws SQLException
	 *             预编译语句参数设置异常
	 */
	private static void setParameter(Object[] param) throws SQLException {
		for (int i = 1; i <= param.length; i++) {
			ps.setObject(i, param[i - 1]);
		}
	}
	// public static void main(String[] args) {
	// String sql = "select * from `user`;";
	// Object[] param = {};
	// List list = executeQuery(sql, param, BBSUsers.class);
	// for (Object obj : list) {
	// BBSUsers user = (BBSUsers)obj;
	// System.out.println(user.getUname());
	// }
	// }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值