package com.myit.util;
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.util.ArrayList;
import java.util.List;
public class DBHelper {
private static final String DRIVER="com.mysql.jdbc";
private static final String URL="jdbc:mysql://localhost:3306/dvd";
private static final String USER="root";
private static final String PASSWORD="root";
/**
* 連接數據庫
* @return 鏈接數據庫對象
*/
public Connection getConnection(){
Connection conn=null;
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 釋放相應的資源
* @param rs
* @param pstmt
* @param conn
*/
public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection conn){
try {
if(rs!=null){
rs.close();
}
if(pstmt!=null){
pstmt.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 此方法可以完成增刪改所有的操作
* @param sql
* @param params
* @return true or false
*/
public boolean excuteUpdate(String sql,List<Object> params){
int res=0;//受影響的行數
Connection conn=null;
PreparedStatement pstmt = null;
ResultSet rs=null;
try {
conn=getConnection();
pstmt=conn.prepareStatement(sql);//裝載sql語句
if(params!=null){
//加入有?占位符,在執行之前把?占位符替換掉
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));
}
}
res=pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
closeAll(rs, pstmt, conn);
}
return res>0?true:false;
}
/**
* 使用泛型方法和反射機制進行封裝
* @param sql
* @param params
* @param cls
* @return
*/
public <T> List<T> executeQuery(String sql,List<Object> params,Class<T> cls) throws Exception{
Connection conn=null;
PreparedStatement pstmt = null;
ResultSet rs=null;
List<T> data=new ArrayList<T>();
try {
conn=getConnection();
pstmt=conn.prepareStatement(sql);//裝載sql語句
if(params!=null){
//加入有?占位符,在執行之前把?占位符替換掉
for(int i=0;i<params.size();i++){
pstmt.setObject(i+1, params.get(i));
}
}
rs=pstmt.executeQuery();
//把查詢出來的記錄封裝成對應的實體類對象
ResultSetMetaData rsd=rs.getMetaData();//獲得列對象,通過此對象可以得到表的結構,包括,列名,列的個數,列的數據類型
while(rs.next()){
T m=cls.newInstance();
for(int i=0;i<rsd.getColumnCount();i++){
String col_name=rsd.getColumnName(i+1);//獲得列名
Object value=rs.getObject(col_name);//獲得列所對應的值
Field field=cls.getDeclaredField(col_name);
field.setAccessible(true);//給私有屬性設置可訪問權
field.set(m, value);//給對象的私有屬性賦值
}
data.add(m);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
closeAll(rs, pstmt, conn);
}
return data;
}
}