DAO详解及小实例

阅读: 评论:0

DAO详解及小实例

DAO详解及小实例

DAO程序开发架构:

客户层(client)=》显示层(Jsp/Servlet)=》业务层(BO)=》数据层(DAO)=》资源层(DataBase)

1.在Java EE中实现DAO模式,主要分为6个模块,具体如下:

(1) 数据库连接类:专门负责数据库的打开与关闭操作

(2) VO类(value object值对象):主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条数据。实际上VO类就是一个JavaBean。

(3) DAO接口:主要定义操作的接口,定义一系列数据库的原子性操作标准,如增删改查(只不过是接口,定义的都是抽象方法。建议看看Java继承与接口,涉及到编写接口)

(4) Impl:DAO接口真实实现类:完成数据库的各项操作,但是不负责数据库的打开和关闭

(5) Proxy:DAO 代理实现类:主要完成数据库的打开和关闭,并且调用真实对象的操作

(6)Factory:DAO工厂类:通过工厂类取得一个DAO的实例化对象

  1. 对于包的命名:
    在使用DAO时对包有严格的命名
  • 数据库连接: xxx.dbc.DatabaseConnection
  • DAO接口: xxx.dao.IXxxDAO
  • DAO接口真实实现类:xxx.dao.impl.XxxDAOImpl
  • DAO接口代理实现类:xxx.dao.proxy.XxxDAOProxy
  • VO类: xxx.vo.Xxx, VO命名要与表的命名一致
  • 工厂类:xxx.factory.DAOFactory.

    3.一个小实例
    步骤一:创建数据库,此处用的mysql数据库
/*======================= 删除数据库 =======================*/
DROP DATABASE IF EXISTS smile ;
/*======================= 创建数据库 =======================*/
CREATE DATABASE smile ;
/*======================= 使用数据库 =======================*/
USE smile ;
/*======================= 删除数据表 =======================*/
DROP TABLE IF EXISTS worker ;
/*======================= 创建数据表 =======================*/
CREATE TABLE worker(empno			INT(4)			PRIMARY KEY,ename			VARCHAR(10),job				VARCHAR(9),hiredate			DATE,sal				FLOAT(7,2)
) ;
/*======================= 插入测试数据 =======================*/
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7369,'董鸣楠','销售','2003-10-09',1500.90) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (8964,'李祺','分析员','2003-10-01',3000) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7698,'张惠','销售','2005-03-12',800) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7782,'杨军','分析员','2005-01-12',2500) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7762,'刘明','销售','2005-03-09',1000) ;
INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (7839,'王月','经理','2006-09-01',2500) ;

创建成功后会有一个含有worker表的smile数据库

步骤二:定义VO类

package com.lqc.vo;import java.util.Date;public class Worker {private int empno;private String ename;private String job;private Date hiredate;private float sal;public int getEmpno() {return empno;}public void setEmpno(int empno) {pno = empno;}public String getEname() {return ename;}public void setEname(String ename) {ame = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public float getSal() {return sal;}public void setSal(float sal) {this.sal = sal;}
}

步骤三:定义一个数据库连接类

package com.lqc.db;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DatabaseConnection {private static final String DBDRIVER=&#sql.cj.jdbc.Driver";private static final String DBURL="jdbc:mysql://localhost:3306/smile?characterEncoding=utf8&serverTimezone=UTC";private static final String DBUSER="root";private static final String DBPASSWORD="123456";private Connection conn;public DatabaseConnection() throws Exception {//加载数据库驱动System.out.println("1");Class.forName(DBDRIVER);System.out.println("2");//进行数据库连接= Connection(DBURL,DBUSER,DBPASSWORD);System.out.println("数据库连接成功");}//取得数据库连接public Connection getConnection(){return conn;}//关闭数据库连接public void close() throws Exception {!=null){try {lose();} catch (SQLException e) {throw e;}}}
}

步骤四:新建DAO接口

package com.lqc.dao;import com.lqc.vo.Worker;import java.util.List;public interface IWorkerDAO {public boolean doCreate(Worker worker) throws Exception;public List<Worker> findALL(String keyWord) throws Exception;public Worker findById(int empno) throws Exception;
}

在定义接口的时候,接口的前面加了一个I,这个是接口的命名规范,表示这是一个接口。
步骤五:DAO接口定义完成之后,就要写具体的实现类。分为2种,一种是真实实现类,还有一种是代理操作类。真实实现类负责数据库的具体操作,不包括数据库的打开与关闭;代理操作类真正负责的就是数据库的打开与关闭。
真实实现类

package com.lqc.dao.impl;import com.lqc.dao.IWorkerDAO;
import com.lqc.vo.Worker;import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;public class WorkerDAOImpl implements IWorkerDAO {private Connection conn =null;private PreparedStatement pstmt=null;//通过构造方法取得数据库连接public WorkerDAOImpl(Connection conn){=conn;}//数据增加操作@Overridepublic boolean doCreate(Worker worker) throws Exception {boolean flag=false;//添加sql语句String sql="INSERT INTO worker(empno,ename,job,hiredate,sal) VALUES (?,?,?,?,?)";//实例化PrepareStatement对象this.pstmt&#prepareStatement(sql);this.pstmt.setInt(1, Empno());this.pstmt.setString(Ename());this.pstmt.setString(Job());this.pstmt.setString(4, String.valueOf(new Hiredate().getTime())));this.pstmt.setFloat(Sal());if(uteUpdate()>0){flag=true;}this.pstmt.close();return flag;}//查询操作@Overridepublic List<Worker> findALL(String keyWord) throws Exception {//定义集合接受全部数据List<Worker> all=new ArrayList<Worker>();String sql="SELECT empno,ename,job,hiredate,sal FROM worker WHERE ename LIKE ? OR job LIKE ?";this.pstmt&#prepareStatement(sql);this.pstmt.setString(1,"%"+keyWord+"%");this.pstmt.setString(2,"%"+keyWord+"%");//执行查询ResultSet rs=uteQuery();Worker worker=null;//遍历集合取出每一条数据()){worker=new Worker();worker.Int(1));worker.String(2));worker.String(3));worker.Date(4));worker.Float(5));all.add(worker);}this.pstmt.close();return all;}//根据编号查询操作@Overridepublic Worker findById(int empno) throws Exception {Worker emp=null;String sql="SELECT empno,ename,job,hiredate,sal FROM worker WHERE empno=?";this.pstmt&#prepareStatement(sql);this.pstmt.setInt(1,empno);ResultSet rs=uteQuery();()){emp=new Worker();emp.Int(1));emp.String(2));emp.String(3));emp.Date(4));emp.Float(5));}this.pstmt.close();return emp;}
}

代理操作类

package com.lqc.dao.proxy;import com.lqc.dao.IWorkerDAO;
import com.lqc.dao.impl.WorkerDAOImpl;
import com.lqc.db.DatabaseConnection;
import com.lqc.vo.Worker;import java.util.List;public class WorkerDAOProxy implements IWorkerDAO {private DatabaseConnection db=null; //数据库连接对象private IWorkerDAO dao=null;        //DAO对象public WorkerDAOProxy() throws Exception {  //实例化数据库连接和DAO对象this.db=new DatabaseConnection();   //连接数据库this.dao=new WorkerDAOImpl(Connection());    //实例化真实操作类对象}@Overridepublic boolean doCreate(Worker worker) throws Exception {boolean flag=false;try{//如果要插入的雇员编号不存在if(this.dao.Empno())==null){//真实操作类调用flag=this.dao.doCreate(worker);}}catch (Exception e){throw e;}finally {this.db.close();}return flag;}@Overridepublic List<Worker> findALL(String keyWord) throws Exception {List<Worker> all=null;try{all=this.dao.findALL(keyWord);}catch (Exception e){throw e;}finally {this.db.close();}return all;}@Overridepublic Worker findById(int empno) throws Exception {Worker emp=null;try{emp=this.dao.findById(empno);}catch (Exception e){throw e;}finally {this.db.close();}return null;}
}

代理操作类中的方法是调用真实实现类中的相应方法。同时这个代理类也能够使代码开发结构更清晰。

步骤六:编写工厂类

package com.lqc.factory;import com.lqc.dao.IWorkerDAO;
import com.lqc.dao.proxy.WorkerDAOProxy;public class DAOFactory {public static IWorkerDAO getIWorkerDAOInstance() throws Exception {return new WorkerDAOProxy();}
}

这个类的功能就是直接返回DAO接口的实例化对象,也就是说在客户端直接通过工厂类就可以获取DAO接口的实例化对象。
接下来测试一下。
测试查询功能

package com.st;import com.lqc.factory.DAOFactory;
import com.lqc.vo.Worker;import java.util.Iterator;
import java.util.List;public class TestfindAll {public static void main(String args[]) throws Exception {List<Worker> all= IWorkerDAOInstance().findALL("");Iterator<Worker> iter=all.iterator();while(iter.hasNext()){Worker worker&#();System.out.Empno()+","&#Ename()+","&#Job()+","&#Hiredate()+","&#Sal());}}
}


接下来测试web程序的查询
编写work_list.jsp

<%--Created by IntelliJ IDEA.User: l1957Date: 2021/1/20Time: 11:31To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK" %>
<%@ page import="com.lqc.factory.*,com.lqc.vo.*"%>
<%@ page import="java.util.*"%>
<html>
<head><title>work list</title>
</head>
<% request.setCharacterEncoding("GBK");%>
<body>
<%String keyWord&#Parameter("kw");out.println(keyWord);if(keyWord==null){keyWord="";}List<Worker> all&#IWorkerDAOInstance().findALL(keyWord);Iterator<Worker> iter=all.iterator();
%>
<center><form action="work_list.jsp" method="post">请输入查询关键字:<input type="text" name="kw"><input type="submit" value="查询"></form><table border="1" width="80%"><tr><td>编号</td><td>姓名</td><td>工作</td><td>工作日期</td><td>工资</td></tr>
<%while(iter.hasNext()){Worker worker&#();
%><tr><td><%&#Empno()%></td><td><%&#Ename()%></td><td><%&#Job()%></td><td><%&#Hiredate()%></td><td><%&#Sal()%></td></tr><%}
%></table>
</center>
</body>
</html>


添加功能也可以自行测试
work_add.jsp

<%--Created by IntelliJ IDEA.User: l1957Date: 2021/1/20Time: 11:30To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK" %>
<html>
<head><title>work add</title>
</head>
<% request.setCharacterEncoding("GBK");%>
<body>
<form action="work_add_do.jsp" method="post">编&nbsp;&nbsp;&nbsp;&nbsp;号:<input type="text" name="empno"><br>姓&nbsp;&nbsp;&nbsp;&nbsp;名:<input type="text" name="ename"><br>职&nbsp;&nbsp;&nbsp;&nbsp;位:<input type="text" name="job"><br>工作日期:<input type="text" name="hiredate"><br>工&nbsp;&nbsp;&nbsp;&nbsp;资:<input type="text" name="sal"><br><input type="submit" value="注册"><input type="reset" value="重置">
</form>
</body>
</html>

work_add_do.jsp

<%--Created by IntelliJ IDEA.User: l1957Date: 2021/1/20Time: 11:31To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK" %>
<%@ page import="com.lqc.factory.*,com.lqc.vo.*"%>
<%@ page import=&#*"%>
<html>
<head><title>work add do</title>
</head>
<% request.setCharacterEncoding("GBK");%>
<body>
<%Worker worker=new Worker();worker.setEmpno(Integer.Parameter("empno")));worker.Parameter("ename"));worker.Parameter("job"));worker.setHiredate(new SimpleDateFormat("yyyy-MM-dd").Parameter("hiredate")));worker.setSal(Float.Parameter("sal")));try{IWorkerDAOInstance().doCreate(worker)){
%>
<h3>信息添加成功!</h3>
<%
}else{
%>
<h3>信息添加失败</h3>
<%       } %>
<%}catch(Exception e){e.printStackTrace();}
%></body>
</html>

摘自《java web从入门到项目实践》

本文发布于:2024-02-03 02:04:07,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689704847916.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:详解   实例   DAO
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23