MySQL连接Java编写通用查询和通用增删改+log4j

本文介绍了如何使用Java编写数据库连接类DBHelp,实现通用的MySQL查询、增删改操作,并详细讲解了jdbc.properties配置文件和log4j.properties日志文件的设置,为数据库操作提供便利和详细的执行记录。
摘要由CSDN通过智能技术生成
数据库连接类DBHelp
package com.bbs.db;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
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;
import org.json.JSONObject;
import org.junit.Test;

import com.bbs.pojo.BBSUser;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
/**
 * @author yangxiaoqiang
 * */
public class DBHelper {
	private static String CLASSNAME;
	private static String URL;
	private static String USERNAME;
	private static String PASSWORD;
	private  Connection conn = null;
	private  PreparedStatement pstmt = null;
	private  ResultSet rs = null;
	private static Logger log=Logger.getLogger(DBHelper.class);
	static{
		log.info("静态块从配置properties中读取数据-加载数据库连接对象");
		InputStream is=DBHelper.class.getResourceAsStream("/jdbc.properties");
		Properties p=new Properties();
		 try {
			p.load(is);
			CLASSNAME=p.getProperty("CLASSNAME").toString();
			URL=p.getProperty("URL").toString();
			USERNAME=p.getProperty("USERNAME");
			PASSWORD=p.getProperty("PASSWORD");
			Class.forName(CLASSNAME);//加载数据库驱动类
		} catch (IOException e) {
			log.error("properties中读取数据-加载InputStream异常!");
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			log.error("数据库加载驱动类forNmae异常!");
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 获取数据库连接的方法
	 * @return Connectiond对象
	 * 
	 * */
	private static Connection getConnection(){
		Connection conn = null;
		try {
			conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (SQLException e) {
			log.error("connection对象->数据库连接异常!");
			e.printStackTrace();
		}
		return conn;
	}
	
	/**
	 * 设置SQL语句中的参数
	 * 
	 * @throws SQLException
	 */
	public void setParameter(Object[] params) throws SQLException {
		if (null != params) {
			for (int i = 0; i < params.length; i++) {
				pstmt.setObject((i + 1), params[i]);
			}
		}
	}
	
	/**
	 * 通用的INSERT,DELETE,UPDATE方法
	 * 
	 * @param sql语句
	 * @param paramsSQL语句中的参数
	 * @return 返回受影响的行数
	 */
	public int executeUpdate(String sql, Object[] params) {
		conn = getConnection();
		int count = 0; // 受影响的行数
		try {
			pstmt = (PreparedStatement) conn.prepareStatement(sql);
			// 设置参数
			setParameter(params);
			count = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(conn, pstmt, null);
		}
		return count;
	}
	
/**
 * 执行查询语句的方法
 * @return List集合
 * 
 * */
	public List executeQuery(String sql, Object[] params, Class clz) {
		List list = new ArrayList();//保存所有用户对象
		conn = getConnection();//获取connectoin对象
		Object obj = null;
		try {
			pstmt = (PreparedStatement)conn.prepareStatement(sql);
			setParameter(params); // 设置参数
			rs = (ResultSet) pstmt.executeQuery();
			// 返回结果集的列的信息
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount(); // 列的数量
			while (rs.next()) {
				obj = clz.newInstance(); // 实例化一个对象
				for (int i = 1; i <= columnCount; i++) {
					String columnName = rsmd.getColumnName(i); // 获取查询语句中的列名
					Object value = rs.getObject(columnName); // 根据列名获取值
					获得clz类中所有定义的属性
					Field field = clz.getDeclaredField(columnName);//获取对应的属性,注意名称要与该类的属性名称相同否则出错:
					field.setAccessible(true);//对所有属性设置访问权限  当类中的成员变量为private时 必须设置此项true
					field.set(obj, value);//给属性赋值
				}
				list.add(obj);//然后放入集合中
			}
		} catch (SQLException e) {
			log.error("PreparedStatement预执行sql语句异常!");
			e.printStackTrace();
		} catch (InstantiationException e) {
			log.error("newInstance实例化字节对象异常!");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			log.error("field.set设置字节对象成员异常!赋值的数据类型不对!!!");
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			log.error("getDeclaredField获取字节对象成员异常,获取的名称与该类的属性名称不符合!!!");
			e.printStackTrace();
		} catch (SecurityException e) {
			log.error("setAccessible设置修饰成员异常,成员属性有private修饰,你没有给他setAccessible(true)访问权限");
			e.printStackTrace();
		} finally {
			closeAll(conn, pstmt, rs);//关闭数据库
		}
		return list;
	}
	
	
	/**
	 * 关闭数据库连接
	 * */
	private static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
		try {
			if (null != rs) {
				rs.close();
				System.out.println("ResultSet-关闭成功!");
			}else System.out.println("ResultSet未开,不需要关闭");
			if (null != stmt) {
				stmt.close();
				System.out.println("PreparedStatement-关闭成功!");
			}else System.out.println("PreparedStatement未开,不需要关闭");
			if (null != conn) {
				conn.close();
				System.out.println("Connection-关闭成功!");
			}else System.out.println("Connection未开,不需要关闭");
		} catch (SQLException e) {
			log.error("数据库关闭异常");
			e.printStackTrace();
		}
	}
	/**
	 * 测试我的数据读取配置文件properties
	 * */
	/*@Test
	public void Testproperties(){
		DBHelper ss=new DBHelper();
		if(ss.CLASSNAME == null){
			log.warn("静态块properties映射数据失败-数据库加载驱动类");
			if(ss.USERNAME == null){
				log.warn("静态块properties映射数据失败-用户名");
				if(ss.URL == null){
					log.warn("静态块properties映射数据失败-地址");
					if(ss.PASSWORD == null){
						log.warn("静态块properties映射数据失败-密码");
					}
				}
			}
		}else
			log.info("静态块读取properties文件数据成功!!");
		if(getConnection() != null){
		System.out.println("数据库连接成功!");
		}
		closeAll(getConnection(),null,null);
	}
	
	
	//获取数据到JSONObject
		DBHelper db = new DBHelper();
		String sqlall = "select * from user";
		JSONObject obj = new JSONObject();//
		
		List list = db.executeQuery(sqlall, null, BBSUser.class);
		obj.put("aaa", list);
		System.out.println(obj.toString());
	for (int i = 0; i < list.size(); i++) {
			BBSUser user = (BBSUser)list.get(i);
			System.out.println(user.toString());
		}
	*/
	
	}


jdbc.properties配置文件
CLASSNAME=com.mysql.jdbc.Driver
URL=jdbc:mysql://localhost:3306/bbs?characterEncoding=utf-8&serverTimezone=GMT
USERNAME=root
PASSWORD=密码
log4j.properties日志文件配置
# Root logger option
log4j.rootLogger=INFO, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Redirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/first_bbs-api.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值