import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.mysql.jdbc.ResultSetMetaData;
import com.petshop.entity.Pet;
/**
* 链接数据库的父类
* 工具类:主要包含连接对象。释放资源等方法
* @author 苏烁坚
*
*/
public class BaseDao {
Connection con=null;//获取连接对象
PreparedStatement ps=null;
ResultSet rs=null;
private static String url="jdbc:mysql://localhost:3306/petshop";
private static String user="root";
private static String password="root";
/**
*
* 释放工具类的参数资源
*/
public void closeBaseDao(){
if(this.rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(this.ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(this.con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 获取连接对象
* @return
*/
public Connection getConnection(){
try {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、通过驱动管理类获取一个连接对象
con=DriverManager.getConnection(url, user, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;//得到连接对象
}
/**
* 释放资源方法
* @param rs
* @param ps
* @param con
*/
public void close(ResultSet rs,PreparedStatement ps,Connection con){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 公共的增删改方法
* @param sql 执行SQL语句
* @param param 参数,SQL中需要赋值的参数(不定参)
* @return 返回受影响的行数
*/
public int executeUpdate(String sql,Object...params){
//定义一个发送SQL语句对象
con=this.getConnection();
try {
ps=con.prepareStatement(sql);
//执行SQL语句之前先判断是否需要给SQL语句赋值
if(params!=null){
//for循环赋值
for (int i = 0; i < params.length; i++) {
//给当前第i+1个?赋值。职位params[下标]类似数组
ps.setObject(i+1, params[i]);
}
}
return ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0; //失败返回0
}
/**
* 公共的查询方法
* @param <T>
* @param sql 要发送的sql语句
* @return ResultSet
*/
public <T> List<T> getResultSet(Class<T> Class,String sql,Object...params){
con=this.getConnection();
BaseDao bd=new BaseDao();
try{
ps=con.prepareStatement(sql);
List<T> myList=new ArrayList<>();
if(params!=null){
//for循环赋值
for (int i = 0; i < params.length; i++) {
//给当前第i+1个?赋值。职位params[下标]类似数组
ps.setObject(i+1, params[i]);
}
}
rs=ps.executeQuery();
while(rs.next()){
//ResultSetMetaData可以获取关于 ResultSet 对象中列的类型和属性信息的对象
java.sql.ResultSetMetaData metaData=rs.getMetaData();//检索此ResultSet对象的列的数量、类型和属性
int count=metaData.getColumnCount();//获取结果集总列数
T obj=Class.newInstance();//获取类对象的实例
for (int i = 0; i <count; i++) {
Object value=rs.getObject(i+1);//获取对应列的值
String columnName= metaData.getColumnName(i+1);//获取对应的列名
Field field=Class.getDeclaredField(columnName);//通过列名获取字段对象,也就是属性;
field.setAccessible(true);//取消访问权限的限制
field.set(obj, value);//将获取到的值,存到对应的类对象实例里面
}
myList.add(obj);//然后返回该结果集对象
}
return myList;
}catch(Exception e){
e.printStackTrace();
}finally{
bd.close(rs, ps, con);
}
return null;
}
}