什么是DAO,有什么用?
封装了针对于数据表的通用的操作
DAO:data(base) access object比如说你要你要插入一个新的用户..那么.在DAO中我们只需要提供一个insertUser(User user)这一个方法就可以了..具体的操作是在DAO中实现的...
那么对于要调用DAO的时候.我们只要知道insertUser(User)是用来插入一个新的用户...而不需要知道是如何实现的..怎么使用???
第一步:数据库中有一张表
第二步:源代码中有一个实体类
第三步:源代码中有一个dao接口
第四步:源代码中有一个dao接口的实现类
第五步:实体类中实现具体的关于数据的增删改查。
package DAO;
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.util.ArrayList;
import java.util.List;
import org.junit.Test;
import Bean.Customer;
import JDBCutil.JDBCconn;
/*
* 封装了针对于数据表的通用的操作
*DAO:data(base) access object
*
* */
//因为不会造他的对象,而是用他里面声明的方法,虽然没有抽象方法
public abstract class BaseDao {
// 通用增删改---version 2.0(考虑上事务)
public int updateInfo(Connection conn, String sql, Object... args) {
PreparedStatement p1 = null;
try {
// 1.预编译sql语句,返回PreparedStatement的实例
p1 = conn.prepareStatement(sql);
// 2.填充占位符接下来具体的增删改操作循环,此时你有多少个参数就执行多少次,所以是args.length
for (int i = 0; i < args.length; i++) {
// 注意前面的参数是对应数据库中的哪个字段,而索引是从1开始的,所以是i+1,而后面的是java中的数组所以是i
p1.setObject(i + 1, args[i]);
}
// 3.执行
return p1.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 4.关闭资源
} finally {
try {
if (p1 != null)
p1.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
// conn.close();
}
return 0;
}
//通用查询2.0版本 考虑上事务 查询单条
public <E> E querySimple(Connection conn, Class<E> clazz, 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 data = rs.getMetaData();
int columnCount = data.getColumnCount();
if (rs.next()) {
E e = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
Object columnValue = rs.getObject(i + 1);
String columnLabel = data.getColumnLabel(i + 1);
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(e, columnValue);
}
return e;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
// conn.close();
JDBCconn.closeResource(null, ps, rs);
}
return null;
}
// 查询多条考虑上事务的版本
public <E> List<E> queryMultiple(Connection conn, Class<E> clazz, String sql, Object... args) {
// 1.获取4个基本信息并获取链接
ResultSet rs = null;
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 执行并返回结果集
rs = ps.executeQuery();
// 通过结果集的元数据,获取列数
ResultSetMetaData data = rs.getMetaData();
// 获取数据库的总共的字段名字的个数
int count = data.getColumnCount();
// 创建存放数据的对应<E>类型的集合
List<E> list = new ArrayList<>();
// 由于是多条 故不用if 而用while
while (rs.next()) {
// 通过运行时类的实例创建<E>的对象
E e = clazz.newInstance();
for (int i = 0; i < count; i++) {
// 获取对应 比如id,name等在数据库的值
Object columnValue = rs.getObject(i + 1);
// 获取数据库中的字段起了别名的名字
String columnName = data.getColumnLabel(i + 1);
// 通过反射将结果集中的数据赋值给对应的属性
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(e, columnValue);
}
// 当for结束时 将一个对象塞进去集合
list.add(e);
}
// 当循环结束时,返回整个集合
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 不能在此关闭链接,因为链接一关闭,就会自动提交数据,所以要再具体操作完成之后统一关闭链接
// conn.close();
JDBCconn.closeResource(null, ps, rs);
}
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()) {
Object object = rs.getObject(1);
return (E) object;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCconn.closeResource(null, ps, rs);
}
return null;
}
}
package DAO;
import java.sql.Connection;
import java.sql.Date;
import java.util.List;
import java.sql.Date;
import Bean.Customer;
/*
* 此接口用于规范针对customer表的常用擦欧总
*
*
* */
public interface CustomerDAO {
/**
* 将cust对象添加到数据库中
* @param coll
* @param cust
*/
void insert(Connection conn,Customer cust);
/**
* 根据id删除表中记录
* @param coll
* @param id
*/
void deleteById(Connection conn,int id);
/**
* 针对于内存中的id将要修改的对象的值去修改数据库中指定的记录
* @param coll
* @param cust
*/
void update(Connection conn,Customer cust,int id);
/**
* 根据id返回数据库中的一条记录
* @param coll
* @param id
* @return
*/
Customer getCustomerById(Connection conn,int id);
/**
* 获取cust表中所有的记录
* @param conn
* @return
*/
List <Customer> getAllData(Connection conn);
/**
* 返回数据表中数据的条目数;
* @param conn
* @return
*/
Long getCount(Connection conn);
/**
* 返回表中最大的生日
* @param conn
* @return
*/
Date getMaxBirth(Connection conn);
}
package DAO;
import java.sql.Connection;
import java.sql.Date;
import java.util.List;
import JDBCutil.JDBCconn;
import Bean.Customer;
public class CustmerImpl extends BaseDao implements CustomerDAO {
@Override
public void insert(Connection conn, Customer cust) {
String sql = "insert into customers (id,name,email,birth) values(?,?,?,?)";
updateInfo(conn, sql, cust.getId(),cust.getName(),cust.getEmail(),cust.getBirth());
}
@Override
public void deleteById(Connection conn, int id) {
String sql = "delete from customers where id = ?";
updateInfo(conn,sql,id);
}
@Override
public void update(Connection conn, Customer cust,int id) {
String sql = "update customers set id=?,name=?,email=?,birth=? where id=?";
updateInfo(conn, sql, cust.getId(),cust.getName(),cust.getEmail(),cust.getBirth(),id);
}
@Override
public Customer getCustomerById(Connection conn, int id) {
String sql = "select id,name,email,birth from customers where id = ?";
Customer customer = querySimple(conn,Customer.class, sql, id);
return customer;
}
@Override
public List<Customer> getAllData(Connection conn) {
String sql = "select id,name,email,birth from customers";
List<Customer> list = queryMultiple(conn, Customer.class, 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 ";
Date value = getValue(conn, sql);
return value;
}
}