baseDAO:
package guo_DAO_2;
import JDBC_Utils.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;
/**
* 封装了针对于数据表的通用操作
*/
public abstract class BaseDAO<T> {
private Class<T> clazz=null;
{
//获取当前对象的带泛型的父类,此处的this指的不是BaseDAO,而是CustomerDAO
Type superclass = this.getClass().getGenericSuperclass();
ParameterizedType paramType= (ParameterizedType) superclass;
Type[] arguments = paramType.getActualTypeArguments();//获取父类的泛型参数
clazz= (Class<T>) arguments[0];//获取了泛型的第一个参数
}
//通用的增删改操作(考虑事务)version2.0
public void update(Connection conn, String sql, Object ...args){//使用可变形参
PreparedStatement ps = null;
try {
//sql当中占位符的个数应该与可变形参的长度一致
//1.获取数据库的连接
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 {
//4.资源关闭
JDBCUtils.CloseResource(null,ps);
}
}
/*
针对不同的表格进行查询,返回表的一条记录
考虑了事务,version2.0
*/
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 rsmd = rs.getMetaData();
int columncount = rsmd.getColumnCount();
if(rs.next()){
T t = clazz.newInstance();
//要给customer赋值为取得的某个属性
//处理结果集一行数据中的每一个列
for(int i=0;i<columncount;i++){
Object value = rs.getObject(i + 1);
//获取列名
//String columnName = rsmd.getColumnName(i + 1);
//给customer列名为columnName的属性赋值为value:通过反射
String columnLabel=rsmd.getColumnLabel(i+1);
Field field = clazz.getDeclaredField(columnLabel);
//变为可以访问的属性
field.setAccessible(true);
field.set(t,value);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//返回表中多条记录构成的集合
//此时的T就是父类中的T,不是泛型方法
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 rsmd = rs.getMetaData();
int columncount = rsmd.getColumnCount();
ArrayList<T> ts = new ArrayList<T>();
while(rs.next()){
T t = clazz.newInstance();
//要给customer赋值为取得的某个属性
//处理结果集一行数据中的每一个列
for(int i=0;i<columncount;i++){
Object value = rs.getObject(i + 1);
//获取列名
String columnName = rsmd.getColumnName(i + 1);
//给customer列名为columnName的属性赋值为value:通过反射
Field field = clazz.getDeclaredField(columnName);
//变为可以访问的属性
field.setAccessible(true);
field.set(t,value);
}
ts.add(t);
}
return ts;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
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 e) {
e.printStackTrace();
} finally {
JDBCUtils.CloseResource(null,ps,rs);
}
return null;
}
}
CustomerDAO(Interface)
package guo_DAO_2;
import guo_Bean.Customer;
import java.sql.Connection;
import java.sql.Date;
import java.util.List;
/**
* 此接口用于规范针对于customer表的常用操作
*/
public interface CustomerDAO {
/**
* 将cust对象添加到数据库中
*/
void insert(Connection conn, Customer cust);
/**
* 根据指定的ID,删除表格中的一项记录
*/
void deleteByID(Connection conn,int id);
//针对内存中的cust对象去修改数据表中的记录
void updateByID(Connection conn,Customer cust);
Customer getCustomerByID(Connection conn,int id);
List<Customer> getAll(Connection conn);
Long getCount(Connection conn);
Date getMaxBirth(Connection conn);
}
package guo_DAO_2;
import guo_Bean.Customer;
import java.sql.Connection;
import java.sql.Date;
import java.util.List;
/**
* DAO:database access object
* 封装了针对于表的通用操作
*
*/
public class CustomerDAOImpl extends BaseDAO<Customer> implements CustomerDAO {
@Override
public void insert(Connection conn, Customer cust) {
String sql= "insert into customers(name,email,birth) values(?,?,?) ";
update(conn,sql,cust.getName(),cust.getEmail(),cust.getBirth());
}
@Override
public void deleteByID(Connection conn, int id) {
String sql="delete from customers where id =?";
update(conn,sql,id);
}
@Override
public void updateByID(Connection conn,Customer cust) {
String sql= "update customers set name =?,email=?,birth=? where id =?";
update(conn,sql,cust.getName(),cust.getEmail(),cust.getBirth(),cust.getId());
}
@Override
public Customer getCustomerByID(Connection conn, int id) {
String sql="select id,name,email,birth from customers where id =?";
Customer customer = getInstance(conn, sql, id);
return customer;
}
@Override
public List<Customer> getAll(Connection conn) {
String sql="select id,name,email,birth from customers";
List<Customer> list = getForList(conn, sql);
return list;
}
@Override
public Long getCount(Connection conn) {
String sql="select count(*) from customers";
return getValue(conn, sql);
}
@Override
public Date getMaxBirth(Connection conn) {
String sql="select max(birth)from customers";
return getValue(conn,sql);
}
}