- DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO
- 作用:为了实现功能的模块化,更有利于代码的维护和升级。
层次结构:
父类(抽象类)由具体类继承
接口 对应某一具体表的操作规范
某一具体实现 继承抽象类同时实现对应接口
【BaseDAO.java】
public abstract class BaseDAO{ private Class clazz = null; public BaseDAO() { // 获取子类的类型 this.clazz = (Class ) this.getClass(); // 获取父类的类型 // getGenericSuperclass()用来获取当前类的父类的类型 // ParameterizedType表示的是带泛型的类型 ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass(); // 获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型 // 这个方法会返回一个Type的数组 Type[] types = parameterizedType.getActualTypeArguments(); // 获取具体的泛型的类型· this.clazz = (Class ) types[0]; } // 通用的增删改操作(考虑上事物) public void update(Connection conn, String sql, Object... args) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 1; i <= args.length; i++) { ps.setObject(i, args[i - 1]); // 注意下标 } ps.execute(); } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(null, ps); } } // 通用的查询返回一条记录 public T select(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 = (T) clazz.newInstance(); for (int i = 0; i < columnCount; i++) { Object columnValue = rs.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t,columnValue); } return t; } } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.closeResource(null,ps,rs); } return null; } // 查询返回多条记录 public List selectMulti(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 ts = new ArrayList<>(); while (rs.next()){ T t = clazz.newInstance(); for (int i = 0; i < columnCount; i++) { Object columnValue = rs.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t,columnValue); } ts.add(t); } return ts; } catch (Exception e) { e.printStackTrace(); }finally { JDBCUtils.closeResource(null,ps,rs); } return null; } // 用于查询特殊值的通用方法 public 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; } }
【CustomerDAO.java】
public interface CustomerDAO {
void insert(Connection conn, Customer customer);
void deleteById(Connection conn,int id);
void update(Connection conn,Customer customer);
Customer getById(Connection conn,int id);
List getAll(Connection conn);
Long getCount(Connection conn);
}
【CustomerDaoImpl.java】
public class CustomerDAOImpl extends BaseDAOimplements CustomerDAO { @Override public void insert(Connection conn, Customer customer) { String sql = "insert into customers(name,email,birth)values(?,?,?)"; update(conn,sql,customer.getName(),customer.getEmail(),customer.getBirth()); } @Override public void deleteById(Connection conn, int id) { String sql = "delete from customers where id = ?"; update(conn,sql,id); } @Override public void update(Connection conn, Customer customer) { String sql = "update customers set name = ?,email = ?,birth = ? where id =?"; update(conn,sql,customer.getName(),customer.getEmail(),customer.getBirth(),customer.getId()); } @Override public Customer getById(Connection conn, int id) { String sql = "select id,name,email,birth from customers where id = ?"; Customer customer = select(conn, sql, id); return customer; } @Override public List getAll(Connection conn) { String sql = "select id,name,email,birth from customers"; List customers = selectMulti(conn, sql); return customers; } @Override public Long getCount(Connection conn) { String sql = "select count(*) from customers"; return getValue(conn,sql); } }



