• DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO
  • 作用:为了实现功能的模块化,更有利于代码的维护和升级。
  • 下面是JavaWeb阶段书城项目中DAO使用的体现:

    BaseDao

    //用于封装对数据库表进行增删改查的方法
    public class BaseDao {

    /*
    通用的增、删、改操作(体现一:增、删、改 ; 体现二:针对于不同的表)
    @param sql 传入一个sql语句
    @param args 是sql语句中需要的参数
    */
    _public void update(Connection connection,String sql,Object… args){
    PreparedStatement preparedStatement = null ;
    try {
    //通过connection对象创建出preparedStatement对象
    preparedStatement = connection.prepareStatement(sql);
    for (int i = 0; i < args.length; i++) {
    preparedStatement.setObject(i+1 , args[i]);
    }
    //executeUpdate() 是针对DML操作使用的
    int i = preparedStatement.executeUpdate();//执行sql语句并且返回影响行
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    //关闭资源对象
    JDBCUtils._closeResource(connection,preparedStatement);
    }
    }
    //没有事务需求
    _public void update(String sql,Object… args){
    Connection connection = JDBCUtils._getConnection
    ();//获取Connection对象
    _PreparedStatement preparedStatement = null ;
    try {
    //通过connection对象创建出preparedStatement对象
    preparedStatement = connection.prepareStatement(sql);
    for (int i = 0; i < args.length; i++) {
    preparedStatement.setObject(i+1 , args[i]);
    }
    //executeUpdate() 是针对DML操作使用的
    int i = preparedStatement.executeUpdate();//执行sql语句并且返回影响行
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    //关闭资源对象
    JDBCUtils._closeResource(connection,preparedStatement);
    }
    }

    /*
    查询方法,将查询出来的结果返回给调用者[只方法只能返回一个对象,理解只能查询一条数据]
    @param clazz
    @param sql 传一个sql语句(DQL)
    @param args sql语句中的参数
    @return
    @param
    /
    // 通用的针对于不同表的查询:返回一个对象 (version 1.0)
    _public List getInstanceList(Class clazz, String sql, Object… args) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
    // 1.获取数据库连接
    conn = JDBCUtils._getConnection();
    // 2.预编译sql语句,得到PreparedStatement对象
    _ps = conn.prepareStatement(sql);
    // 3.填充占位符
    for (int i = 0; i < args.length; i++) {
    ps.setObject(i + 1, args[i]);
    }
    // 4.执行executeQuery(),得到结果集:ResultSet
    _rs = ps.executeQuery();

    1. _// 5.得到结果集的元数据:ResultSetMetaData<br /> _ResultSetMetaData rsmd = rs.getMetaData();<br /> _// 6.1通过ResultSetMetaData得到columnCount,columnLabel;通过ResultSet得到列值<br /> _int columnCount = rsmd.getColumnCount();_//获取结果集中的字段数量<br /> _ArrayList<T> list=new ArrayList<>();<br /> while (rs.next()) {<br /> T t = clazz.newInstance();_//通过反射创建一个对象<br /> _for (int i = 0; i < columnCount; i++) {_// 遍历每一个列<br /> // 获取列值<br /> _Object columnVal = rs.getObject(i + 1);<br /> _// 获取列的别名:列的别名,使用类的属性名充当<br /> _String columnLabel = rsmd.getColumnLabel(i + 1);<br /> _// 6.2使用反射,给对象的相应属性赋值<br /> _Field field = clazz.getDeclaredField(columnLabel);<br /> field.setAccessible(true);_//取消java的访问检查<br /> _field.set(t, columnVal);_//给字段赋值<br /> _}<br /> list.add(t);<br /> }<br /> return list;<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> } finally {<br /> _// 7.关闭资源<br /> _JDBCUtils._closeResource_(conn, ps, rs);<br /> }<br /> return null;<br /> }<br /> public <T> T getInstance(Class<T> clazz, String sql, Object... args) {<br /> Connection conn = null;<br /> PreparedStatement ps = null;<br /> ResultSet rs = null;<br /> try {<br /> _// 1.获取数据库连接<br /> _conn = JDBCUtils._getConnection_();<br /> _// 2.预编译sql语句,得到PreparedStatement对象<br /> _ps = conn.prepareStatement(sql);<br /> _// 3.填充占位符<br /> _for (int i = 0; i < args.length; i++) {<br /> ps.setObject(i + 1, args[i]);<br /> }<br /> _// 4.执行executeQuery(),得到结果集:ResultSet<br /> _rs = ps.executeQuery();
    2. _// 5.得到结果集的元数据:ResultSetMetaData<br /> _ResultSetMetaData rsmd = rs.getMetaData();<br /> _// 6.1通过ResultSetMetaData得到columnCount,columnLabel;通过ResultSet得到列值<br /> _int columnCount = rsmd.getColumnCount();_//获取结果集中的字段数量<br /> _if (rs.next()) {<br /> T t = clazz.newInstance();_//通过反射创建一个对象<br /> _for (int i = 0; i < columnCount; i++) {_// 遍历每一个列<br /> // 获取列值<br /> _Object columnVal = rs.getObject(i + 1);<br /> _// 获取列的别名:列的别名,使用类的属性名充当<br /> _String columnLabel = rsmd.getColumnLabel(i + 1);<br /> _// 6.2使用反射,给对象的相应属性赋值<br /> _Field field = clazz.getDeclaredField(columnLabel);<br /> field.setAccessible(true);_//取消java的访问检查<br /> _field.set(t, columnVal);_//给字段赋值<br /> _}<br /> return t;<br /> }<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> } finally {<br /> _// 7.关闭资源<br /> _JDBCUtils._closeResource_(conn, ps, rs);<br /> }<br /> return null;<br /> }<br />}

    Emp类

    该类的成员属性要与emp表的字段保持一致,以供反射使用
    代码如下:
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;

import java.awt.*;
import java.sql.Date;

@Data//生成get,set,toString方法
@NoArgsConstructor//空参构造器
@AllArgsConstructor_//满参构造器
_public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Integer sal;
private Integer comm;
private Integer deptno;
}

Page类

该类为将查询结果分页展示所用,代码如下
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
/*
页码类
@author

*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Page {

  1. private List<T> list; _// 每页查到的记录存放的集合<br /> _public static final int _PAGE_SIZE _= 4; _// 每页显示的记录数<br /> _private int pageNo; _// 当前页<br /> // private int totalPageNo; // 总页数,通过计算得到<br /> _private int totalRecord; _// 总记录数,通过查询数据库得到<br />_}

EmpDao

接口,含对emp表进行增删改查等操作方法.

图片代码(体现出该类在idea中的位置)

image.png

文字代码(可直接复制代码进行演示,分析)

import com.softeem.bean.Emp;
import com.softeem.bean.Page;

import java.sql.Connection;
import java.sql.Date;
import java.util.List;

public interface EmpDao {
//无条件查询所有员工
_List findAll(Connection conn);
//添加员工
void save(Connection conn,Emp emp);
//根据员工编号删除员工
void deleteById(Connection conn,Integer empno);
//根据员工编号查找员工
Emp findById(Connection conn,Integer empno);
//根据员工编号修改员工信息
void updateById(Connection conn,Integer empno,Emp emp);
//无条件分页查询所有员工信息
Page getPageList(Connection conn, Page page);
//通过时间区间查询员工信息并且分页
_Page getPageByHiredate(Connection conn, Page page, Date minHiredate,Date maxHirdate);
}

EmpDaoImpl

EmpDao接口的实现类,用于实现接口中的抽象方法.

图片代码

image.png

文字代码

import com.softeem.Dao.EmpDao;
import com.softeem.bean.Emp;
import com.softeem.bean.Page;
import com.softeem.uitl.BaseDao;

import java.sql.Connection;
import java.sql.Date;
import java.util.List;

public class EmpDaoImpl extends BaseDao implements EmpDao{
@Override
public List findAll(Connection conn) {
String sql=”select from emp”;
return getInstanceList(Emp.class,sql);
}
@Override
public void save(Connection conn, Emp emp) {
String sql=”insert into emp values(?,?,?,?,?,?,?,?)”;
update(conn,sql,emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno());
}
@Override
public void deleteById(Connection conn, Integer empno) {
String sql=”delete from emp where empno=?”;
update(conn,sql,empno);
}
@Override
public Emp findById(Connection conn, Integer empno) {
String sql=”select
from emp where empno=?”;
return getInstance(Emp.class,sql,empno);
}
@Override
public void updateById(Connection conn, Integer empno,Emp emp) {
String sql=”update emp set empno=?,ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno=?”;
update(sql,emp.getEmpno(),emp.getEname(),emp.getJob(),emp.getMgr(),
emp.getHiredate(),emp.getSal(),emp.getComm(),emp.getDeptno(),empno);
}
@Override
public Page getPageList(Connection conn, Page page) {
String sql=”select from emp limit ?,?”;
List emps= getInstanceList(Emp.class, sql, (page.getPageNo() - 1)
Page.PAGE_SIZE, Page.PAGE_SIZE);
page.setList(emps);
return page;
}
@Override
public Page getPageByHiredate(Connection conn, Page page, Date minHiredate, Date maxHirdate) {
String sql=”select from emp where hiredate>=? and hiredate<=? limit ?,?”;
List emps= getInstanceList(Emp.class, sql, minHiredate, maxHirdate,
(page.getPageNo() - 1)
Page.PAGE_SIZE, Page.PAGE_SIZE);
page.setList(emps);
return page;
}
}