介绍
DAO功能是数据操作.
客户发送数据到显示层,显示层发送数据到业务层,业务发送数据到数据层,数据层进行持久化.即.保存进入databases一些简称 BO 业务对象的简称 DAO 一个数据访问对象,增删查改 PO数据库一条记录,映射成javaBean对象,拥有getter/setter方法
为什么使用
把jdbc的操作进行分离,即数据库的操作和业务进行分离,javabean是把视图和业务进行分离,dao是把数据库的操作和业务逻辑进行分离.
DAO组成
VO
属性,get set 方法组成.VO是数据库中记录的映射.
DAO
定义操作的接口
用于定义数据库的原子化操作,增删查改Impl
对接口的实现
Proxy
代理实现类,通过代理类,用来调用真实的对象的操作
Factory
工厂类,通过工厂,产生DAO实例化对象
DAO栗子
一个雇员表如下
NO | 列名称 | 描述 ----|-------|----- 1 | empno | 雇员编号 数字表示 长度4位 2 | ename | 雇员姓名 字符串表示 长度10位字符串 3 | job | 雇员工作 4 | hiredate | 雇佣日期 5 | sal | 基本工资 小数表示 小数2位 整数 5位VO
数据库关系映射如下
package com.ming.vo;import java.util.Date;// 对数据库记录的映射public class Emp { // 雇员编号 private int empno; // 姓名 private String ename; // 职位 private String job; // 日期 private Date hiredate; // 基本工资 private float sal; public int getEmpno() { return empno; } public String getEname() { return ename; } public String getJob() { return job; } public Date getHiredate() { return hiredate; } public float getSal() { return sal; } public void setEmpno(int empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public void setSal(float sal) { this.sal = sal; }}
数据库连接
定义接口
package com.ming.dbc;import java.sql.Connection;// 数据库连接public interface DataBaseConnection { public Connection getConnection(); public void close() throws Exception;}
实现该接口
package com.ming.dbc;import java.sql.*;// mysql数据库连接实栗public class MysqlDatabaseConnection implements DataBaseConnection{ private static final String DBDRIVER = "com.mysql.cj.jdbc.Driver"; private static final String DBURL = "jdbc:mysql://47.94.95.84:32786/test"; private static final String DBUSER = "test"; private static final String DBPASSWORD = "ABCcba20170607"; private Connection connection = null; public MysqlDatabaseConnection() throws Exception { try{ Class.forName(DBDRIVER); this.connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); }catch (Exception e){ throw e; } } // 获得连接 @Override public Connection getConnection(){ return this.connection; } // 关闭连接 @Override public void close() throws Exception{ if(this.connection != null){ try{ this.connection.close(); }catch (Exception e){ throw e; } } }}
设置工厂
package com.ming.dbc;// 数据库连接工厂public class DatabaseConnectionFactory { // 获得实栗 public static DataBaseConnection getDataBaseConnection() throws Exception{ return new MysqlDatabaseConnection(); }}
dao
定义dao接口
package com.ming.dao;import com.ming.vo.Emp;import java.util.List;// 定义dao接口public interface IEmpDAO { /** * 数据库增加操作 以doXXX方式命名 * @param emp 增加数据的对象 * @return 成功标记 * @throws Exception 异常继续向上抛出 **/ public boolean doCreate(Emp emp) throws Exception; /** * * 查询全部数据 一般以findXXXX命名 * @param keyWord 查询关键字 * @return 返回查询结果 一个Emp对象表示一行记录 * @throws Exception 异常继续抛出 */ public ListfindAll(String keyWorld) throws Exception; /** * 根据雇员编号查询雇员信息 * @param empno 雇员编号 * @return 雇员vo对象 * @throws Exception 异常向上抛出 */ public Emp findByid(int empno) throws Exception;}
实现接口
package com.ming.dao;import com.ming.vo.Emp;import com.mysql.cj.protocol.Resultset;import javax.xml.transform.Result;import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;// DAO实栗public class EmpDAOImpl implements IEmpDAO { // 数据库连接对象 private Connection connection = null; // 数据库操作方法 private PreparedStatement preparedStatement = null; // 构造方法注入数据库连接 public EmpDAOImpl(Connection _connection){ this.connection = _connection; } /** * 数据库增加操作 以doXXX方式命名 * 实现数据库增加操作 * @param emp 增加数据的对象 * @return 成功标记 * @throws Exception 异常继续向上抛出 **/ @Override public boolean doCreate(Emp emp) throws Exception { // 定义标志位 boolean flag = false; // sql String sql = "INSERT INTO emp(empno, ename, job, hiredate, sal) VALUES (?, ?, ?, ?, ?);"; // 实例化操作对象 this.preparedStatement = this.connection.prepareStatement(sql); // 赋值操作 this.preparedStatement.setInt(1, emp.getEmpno()); this.preparedStatement.setString(2, emp.getEname()); this.preparedStatement.setString(3, emp.getJob()); this.preparedStatement.setDate(4, new Date(emp.getHiredate().getTime())); this.preparedStatement.setFloat(5, emp.getSal()); // 更新行数大于0 if(this.preparedStatement.executeUpdate() > 0){ flag = true; } this.preparedStatement.close(); return flag; } /** * 查询全部数据 一般以findXXXX命名 * * @param keyWorld@return 返回查询结果 一个Emp对象表示一行记录 * @throws Exception 异常继续抛出 */ @Override public ListfindAll(String keyWorld) throws Exception { List all = new ArrayList (); String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE ename like ? OR job like ?"; this.preparedStatement = this.connection.prepareStatement(sql); this.preparedStatement.setString(1, "%" + keyWorld + "%"); this.preparedStatement.setString(2, "%" + keyWorld + "%"); ResultSet resultSet = this.preparedStatement.executeQuery(); Emp emp = null; while(resultSet.next()){ emp = new Emp(); emp.setEmpno(resultSet.getInt(1)); emp.setEname(resultSet.getString(2)); emp.setJob(resultSet.getString(3)); emp.setHiredate(resultSet.getDate(4)); emp.setSal(resultSet.getFloat(5)); all.add(emp); } this.preparedStatement.close(); return all; } /** * 根据雇员编号查询雇员信息 * * @param empno 雇员编号 * @return 雇员vo对象 * @throws Exception 异常向上抛出 */ @Override public Emp findByid(int empno) throws Exception { // 声明Emp对象 Emp emp = null; String sql = "SELECT empno, ename, job, hiredate, sal FROM emp WHERE empno = ?"; this.preparedStatement = this.connection.prepareStatement(sql); this.preparedStatement.setInt(1, empno); ResultSet resultset = this.preparedStatement.executeQuery(); if(resultset.next()){ emp = new Emp(); emp.setEmpno(resultset.getInt(1)); emp.setEname(resultset.getString(2)); emp.setJob(resultset.getString(3)); emp.setHiredate(resultset.getDate(4)); emp.setSal(resultset.getFloat(5)); } this.preparedStatement.close(); return emp; }}
定义代理类
package com.ming.dao;import com.ming.dbc.DataBaseConnection;import com.ming.dbc.DatabaseConnectionFactory;import com.ming.vo.Emp;import java.util.List;// 数据库连接代理类public class EmpDAOProxy implements IEmpDAO{ private DataBaseConnection dataBaseConnection = null; private IEmpDAO dao = null; // 实例化连接 public EmpDAOProxy() throws Exception{ // 获得连接对象 dataBaseConnection = DatabaseConnectionFactory.getDataBaseConnection(); // 实例化主题类 this.dao = new EmpDAOImpl(dataBaseConnection.getConnection()); } /** * 数据库增加操作 以doXXX方式命名 * * @param emp 增加数据的对象 * @return 成功标记 * @throws Exception 异常继续向上抛出 **/ @Override public boolean doCreate(Emp emp) throws Exception { boolean flag = false; try{ // 插入雇员编号不存在 if(this.dao.findByid(emp.getEmpno()) == null){ // 调用主题直接创建 flag = this.dao.doCreate(emp); } }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return flag; } /** * 查询全部数据 一般以findXXXX命名 * * @param keyWorld@return 返回查询结果 一个Emp对象表示一行记录 * @throws Exception 异常继续抛出 */ @Override public ListfindAll(String keyWorld) throws Exception { List all = null; try{ all = this.dao.findAll(keyWorld); }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return all; } /** * 根据雇员编号查询雇员信息 * * @param empno 雇员编号 * @return 雇员vo对象 * @throws Exception 异常向上抛出 */ @Override public Emp findByid(int empno) throws Exception { Emp emp = null; try{ emp = this.dao.findByid(empno); }catch (Exception e){ throw e; }finally { this.dataBaseConnection.close(); } return emp; }}
编写测试类
package com.ming.dao;import com.ming.vo.Emp;import org.junit.After;import org.junit.Before;import org.junit.Test;import javax.swing.text.html.HTMLDocument;import javax.xml.crypto.Data;import java.util.Date;import java.util.Iterator;import java.util.List;import static org.junit.Assert.*;public class EmpDAOProxyTest { EmpDAOProxy empDAOProxy = null; Emp emp = null; String keyWords = null; @Before public void setUp() throws Exception { empDAOProxy = new EmpDAOProxy(); emp = new Emp(); emp.setEname("ae3365eaa"); emp.setEmpno(2223453); emp.setSal(23.2325624f); emp.setHiredate(new Date()); emp.setJob("ming4654"); keyWords = new String("ming4654"); } @After public void tearDown() throws Exception { } @Test public void doCreate() throws Exception { if(empDAOProxy.doCreate(emp)){ System.out.println("增加一条记录成功"); }else{ System.out.println("增加一条记录失败"); } } @Test public void findAll() throws Exception { Listresult = empDAOProxy.findAll(this.keyWords); // 迭代器遍历对象 Iterator iterator = result.iterator(); // 循环迭代 while(iterator.hasNext()){ Emp tmp = (Emp)iterator.next(); System.out.println(emp.getEname() + emp.getJob() + emp.getEmpno() + emp.getHiredate() + emp.getSal()); } } @Test public void findByid() throws Exception{ int emp = 2223453; Emp tmp = empDAOProxy.findByid(emp); System.out.println(tmp.getEname()); }}
设置工厂
package com.ming.dao;public class DAOFactory { public static IEmpDAO getIEmpDAOInstance() throws Exception{ return new EmpDAOProxy(); }}
设置插入界面jsp
<%-- Created by IntelliJ IDEA. User: ming Date: 19-3-16 Time: 上午3:10 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %>增加雇员
设置插入成功jsp
<%@ page import="com.ming.vo.Emp" %><%@ page import="com.ming.dao.DAOFactory" %><%@ page import="java.util.Date" %><%-- Created by IntelliJ IDEA. User: ming Date: 19-3-16 Time: 上午3:12 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %>Title <% Emp emp = new Emp(); emp.setJob(request.getParameter("job")); emp.setEmpno(Integer.parseInt(request.getParameter("empno"))); emp.setHiredate(new Date()); emp.setEname("eee"); emp.setSal(34.45f); try{ if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){%>添加成功
<%%><% } }catch (Exception e){ e.printStackTrace(); }%>