摘要:介绍功能是数据操作客户发送数据到显示层显示层发送数据到业务层业务发送数据到数据层数据层进行持久化即保存进入一些简称业务对象的简称一个数据访问对象增删查改数据库一条记录映射成对象拥有方法为什么使用把的操作进行分离即数据库的操作和业务进行分离是
介绍
DAO功能是数据操作.
客户发送数据到显示层,显示层发送数据到业务层,业务发送数据到数据层,数据层进行持久化.即.保存进入databases
一些简称 BO 业务对象的简称 DAO 一个数据访问对象,增删查改 PO数据库一条记录,映射成javaBean对象,拥有getter/setter方法为什么使用
把jdbc的操作进行分离,即数据库的操作和业务进行分离,javabean是把视图和业务进行分离,dao是把数据库的操作和业务逻辑进行分离.
DAO组成 VO属性,get set 方法组成.VO是数据库中记录的映射.
DAO定义操作的接口
用于定义数据库的原子化操作,增删查改
对接口的实现
Proxy代理实现类,通过代理类,用来调用真实的对象的操作
Factory工厂类,通过工厂,产生DAO实例化对象
DAO栗子一个雇员表如下
NO | 列名称 | 描述 |
---|---|---|
1 | empno | 雇员编号 数字表示 长度4位 |
2 | ename | 雇员姓名 字符串表示 长度10位字符串 |
3 | job | 雇员工作 |
4 | hiredate | 雇佣日期 |
5 | sal | 基本工资 小数表示 小数2位 整数 5位 |
数据库关系映射如下
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 List实现接口findAll(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 List定义代理类findAll(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 List编写测试类findAll(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 { List设置工厂result = 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(); } %>
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73751.html
摘要:此的功能是从应用程序中隐藏在底层存储机制中执行操作所涉及的所有复杂性。这正是模式试图解决的问题。将模式与一起使用开发人员普遍认为的发布将模式的功能降级为零,因为该模式只是实体经理提供的另一层抽象和复杂性。在这种情况下,模式有其自己的位置。 案例概述 数据访问对象(DAO)模式是一种结构模式,它允许我们使用抽象API将应用程序/业务层与持久层(通常是关系数据库,但它可以是任何其他持久性机...
摘要:依赖倒置在面向对象设计中有一个重要的原则是依赖倒置,主要作用是解耦,让对象与对象之间松耦合。现在根据依赖倒置原则对例子进行修改。 依赖倒置 在面向对象设计中有一个重要的原则是依赖倒置(Dependence Inversion Principle),主要作用是解耦,让对象与对象之间松耦合。定义如下:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。...
前言 在讲解Web开发模式的时候,曾经写过XML版的用户登陆注册案例!现在在原有的项目上,使用数据库版来完成用户的登陆注册!如果不了解的朋友,可以看看我Web开发模式的博文! 本来使用的是XML文件作为小型数据库,现在使用Mysql数据库,代码究竟要改多少呢?我们拭目以待! 使用C3P0数据库连接池 导入C3P0的开发包和导入配置文件 开发包导入的是这个:c3p0-0.9.2-pre1和mcha...
阅读 3616·2021-09-22 15:15
阅读 3497·2021-08-12 13:24
阅读 1290·2019-08-30 15:53
阅读 1794·2019-08-30 15:43
阅读 1121·2019-08-29 17:04
阅读 2774·2019-08-29 15:08
阅读 1546·2019-08-29 13:13
阅读 3055·2019-08-29 11:06