import util.JDBCUtils;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @program: Connection
* @description:封装了针对数据表的通用的操作
* @author: Mr.Fan
* @create: 2021-05-30 13:17
**/
public abstract class BaseDAO<T> {
private Class<T> clazz = null;
{//获取当前BaseDAO的子类继承的父类的泛型
Type genericSuperclass = this.getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
Type[] typeArguments = paramType.getActualTypeArguments();//获取了父类的泛型参数
clazz = (Class<T>) typeArguments[0];//泛型的第一个参数
}
/**
* 考虑数据库事务的增删改操作
* @param sql
* @param args
*/
public void update(Connection conn, String sql, Object ...args) {
PreparedStatement ps = null;
try {
//1.预编译sql语句
ps = conn.prepareStatement(sql);
//2.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps);
}
}
/**
* 返回数据表中的一条记录(考虑事务)
* @param conn
* @param sql
* @param args
* @return
*/
public T getInstance(Connection conn, String sql, Object ...args){
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData metaData = rs.getMetaData();
//获取结果集中的列数
int columnCount = metaData.getColumnCount();
if(rs.next()){
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
String columnName = metaData.getColumnName(i+1);
//给t对象指定的columnName属性赋值为columnValue,通过反射
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnValue);
//给book对象的某个属性赋值为value
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
/**
* 获取多个对象的方法(考虑事务)
* @param sql
* @param args
* @return
*/
public List<T> getForList(Connection conn, String sql, Object...args){
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
//获取结果集的元数据:ResultSetMetaData
ResultSetMetaData metaData = rs.getMetaData();
//获取结果集中的列数
int columnCount = metaData.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<>();
while (rs.next()){
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columnValue = rs.getObject(i + 1);
//获取每个列的列名
String columnName = metaData.getColumnName(i+1);
//给t对象指定的columnName属性赋值为columnValue,通过反射
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnValue);
//给book对象的某个属性赋值为value
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
JDBCUtils.closeResource(null, ps, rs);
return null;
}
/**
* 用于查询特殊值的通用方法
* @param conn
* @param sql
* @param args
* @param <E>
* @return
*/
public <E> E getValue(Connection conn, String sql, Object...args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
if(rs.next()){
return (E)rs.getObject(1);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps, rs);
}
return null;
}
}