package cn.lnu.utils;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.Connection;
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 javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
//ʹ��dbcp����Դ�������ݿ����ӳصķ�ʽΪ�û�ά��һ������
public class JdbcUtils {
private static DataSource ds=null;//������һ�����ݿ����ӳأ��û���ס�ӹ������д��������ӳ�
//��̬����飬ֻ����һ��mysql��������ȡһ�������ļ�
static{
try{
InputStream in=JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");//�������ļ�����һ������
Properties dbcpconfig=new Properties();
dbcpconfig.load(in);
BasicDataSourceFactory factory=new BasicDataSourceFactory();//newһ�����ӳع���
ds=factory.createDataSource(dbcpconfig);//����dbcp�����ļ�����һ�����ݿ����ӳ�
}catch(Exception e){
throw new ExceptionInInitializerError(e);
}
}
//�����ݿ����ӳ�ds�л��һ�����ݿ�����
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}
rs=null;
}
if(st!=null){
try{
st.close();
}catch(Exception e){
e.printStackTrace();
}
st=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
//�ڹ������г�ȡ��ɾ�IJ����Ĺ������룬���Ƕ���ֻ��sql���Ͳ�����ͬ,���ォ�乫�����ֳ�ȡ��һ��������
public static void update(String sql,Object params[]) throws SQLException{
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try{
conn=getConnection();
st=conn.prepareStatement(sql);
//ʹ�ô��ݹ����IJ���������䴫�ݹ�����sql��䣬ʹ���Ϊһ��������sql���
for(int i=0;i<params.length;i++){
st.setObject(i+1, params[i]);
}
st.executeUpdate();
}finally{
release(conn, st, rs);
}
}
//��������ʵ�ֶԲ�ѯ�������������ȡ�IJ�ѯ�Ż�
public static Object query(String sql,Object params[],ResultSetHandler handler) throws SQLException{
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try{
conn=getConnection();
st=conn.prepareStatement(sql);
//ʹ�ô��ݹ����IJ���������䴫�ݹ�����sql��䣬ʹ���Ϊһ��������sql���
for(int i=0;i<params.length;i++){
st.setObject(i+1, params[i]);
}
rs=st.executeQuery();
//��������
return handler.handler(rs);//ʹ���û����ݹ������Լ�ʵ�ֿ�ܱ�¶�ӿڵĽ����������������������������ǽ�������ϴ���һ��list���ϻ���һ��javabean��
}finally{
release(conn, st, rs);
}
}
}
//�������߲�֪����δ������������û�֪������������������߶��Ⱪ¶һ���ӿڣ����û�����ʵ�֣������û�����֮��Ľ����
interface ResultSetHandler{
public Object handler(ResultSet rs);
}
//�������߰������������ȼ���ʵ�ʿ����о���ʹ�õĴ����������ڿ������߲�֪�������������ʲô�����������������ʵ�ֽӿڵ�ʱ��һ�����캯�������û���Ҫ�����������ʲô�����������
class BeanHandler implements ResultSetHandler{//Ԥ��ʵ��һ�������������һ��bean�����е���
private Class clazz;
public BeanHandler(Class clazz){
this.clazz=clazz;//�����û����ݹ������࣬�����ס����������������߸�������࣬���������װ���������Ķ����з���
}
public Object handler(ResultSet rs) {
try {
if(!rs.next()){//����������û�����ݣ����账��ֱ�ӷ���null
return null;
}
//�����ݣ�������װ�������bean
Object bean=clazz.newInstance();
//���ڿ������߲�֪��������ж���ʲô���ݣ������Ҫ�õ������Ԫ������,
ResultSetMetaData meta=rs.getMetaData();//�õ��������Ԫ���ݣ��Ի�ý��������Ϣ
int count=meta.getColumnCount();//��ý�������ܵ�����
for(int i=0;i<count;i++){
String name=meta.getColumnName(i+1);//��ý����ÿ�е���������������±��1��ʼ��
Object value=rs.getObject(name);//���ÿ��������Ӧ��ֵ
//ͨ��ÿ��ȡ�õĽ�������������bean�����������Ӧ������
Field f=bean.getClass().getDeclaredField(name);
f.setAccessible(true);//����bean�����������ʱ������һ��Ϊ˽�У�����ǿ����Ϊ����ʹ�������Բ�������������
f.set(bean, value);//���������������Ϊf��ֵ���浽bean�����Ӧ������
}
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
//�������ÿһ����¼�����ȴ���һ��bean�У�Ȼ���ڽ����bean�ӵ�һ��List�����У���ʵ�ֿ������߱�¶��handler�ӿڴ�����
class BeanListHandler implements ResultSetHandler{
private Class clazz;
public BeanListHandler(Class clazz){//����Ҫ�������ÿһ�м�¼��װ���ĸ���Ķ����е�������������û�ʹ�������������ʱ�Ͳ���Ҫ����ǰ������new��һ�������ڴ��ݹ���������ֱ�Ӵ��ݹ���һ����
this.clazz=clazz;
}
public Object handler(ResultSet rs) {
List list=new ArrayList();
try {
while(rs.next()){
Object bean=clazz.newInstance();//ÿȡ��һ����¼��new��һ�������bean����
ResultSetMetaData meta=rs.getMetaData();
int count=meta.getColumnCount();
for(int i=0;i<count;i++){
String name=meta.getColumnName(i+1);//ÿ��ȡ�������ÿһ�е�����
Object value=rs.getObject(name);
//���䣬ͨ��ÿ��ȡ�������������bean�����϶�Ӧ������
Field f=bean.getClass().getDeclaredField(name);
f.setAccessible(true);//ǿ�����ø�����Ϊ���з������ԣ������Եķ���Ȩ�ޣ�����������Ͽ��Ա���ֵ
f.set(bean, value);//�������ÿ�е�ֵ��ֵ��bean�����Ӧ������
}
list.add(bean);//��ÿ�η������bean��ӵ�һ��list������
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}