- DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO
- 作用:为了实现功能的模块化,更有利于代码的维护和升级。
-
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)
_publicList // 1.获取数据库连接getInstanceList(Class clazz, String sql, Object… args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
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();_// 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();
_// 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
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
图片代码(体现出该类在idea中的位置)
文字代码(可直接复制代码进行演示,分析)
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
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
_Page
}
EmpDaoImpl
图片代码
文字代码
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
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
String sql=”select from emp limit ?,?”;
List
page.setList(emps);
return page;
}
@Override
public Page
String sql=”select from emp where hiredate>=? and hiredate<=? limit ?,?”;
List
(page.getPageNo() - 1)
page.setList(emps);
return page;
}
}