企业分层架构:

资源层:主要是数据库的操作层,里面可以进行各种数据存储,但是这些数据存储操作的时候肯定依靠SQL语句,如果在一个程序中出现过多的SQL语句,JSP页面非常复杂,不便于程序的可重用性

数据层:一个专门操作数据库的组件

业务层(Business Object):整个项目的核心

显示层:使用JSP/Servlet进行页面效果的显示

客户层:现在基本采用B/S开发架构,用浏览器访问

DAO组成:

1. VO:由属性,setter,getter方法组成,VO类中的属性和表中的字段相对应,每个VO类的对象都是表中的每一条数据

2. DBC(DatabaseConnection):专门负责数据库打开与关闭操作的类

3. DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增加,删除,修改,按ID查询

包含4,5两个包

  4. Impl:DAO接口的真实实现类,完成具体的数据库操作,不负责数据库的打开和关闭

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

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

VO类 emp.java:\cn\mldn\lxh\vo

  1. package cn.mldn.lxh.vo ;
  2. import java.util.Date ;
  3. public class Emp {
  4. private int empno ;
  5. private String ename ;
  6. private String job ;
  7. private Date hiredate ;
  8. private float sal ;
  9. public void setEmpno(int empno){
  10. this.empno = empno ;
  11. }
  12. public void setEname(String ename){
  13. this.ename = ename ;
  14. }
  15. public void setJob(String job){
  16. this.job = job ;
  17. }
  18. public void setHiredate(Date hiredate){
  19. this.hiredate = hiredate ;
  20. }
  21. public void setSal(float sal){
  22. this.sal = sal ;
  23. }
  24. public int getEmpno(){
  25. return this.empno ;
  26. }
  27. public String getEname(){
  28. return this.ename ;
  29. }
  30. public String getJob(){
  31. return this.job ;
  32. }
  33. public Date getHiredate(){
  34. return this.hiredate ;
  35. }
  36. public float getSal(){
  37. return this.sal ;
  38. }
  39. }

DBC类: DatabaseConnection.java:\cn\mldn\lxh\dbc

  1. package cn.mldn.lxh.dbc ;
  2. import java.sql.Connection ;
  3. import java.sql.DriverManager ;
  4. public class DatabaseConnection {
  5. //private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
  6. private static final String DBDRIVER = "com.mysql.jdbc.Driver" ;
  7. private static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ;
  8. private static final String DBUSER = "root" ;
  9. private static final String DBPASSWORD = "linda0213" ;
  10. private Connection conn ;
  11. public DatabaseConnection() throws Exception {
  12. Class.forName(DBDRIVER) ;
  13. this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
  14. }
  15. public Connection getConnection(){
  16. return this.conn ;
  17. }
  18. public void close() throws Exception {
  19. if(this.conn != null){
  20. try{
  21. this.conn.close() ;
  22. }catch(Exception e){
  23. throw e ;
  24. }
  25. }
  26. }
  27. }

接口IEmpDAO.java: \cn\mldn\lxh\dao

注意接口方法命名:

数据库更新:doXXX

查询:findXXX,getXXX

  1. package cn.mldn.lxh.dao ;
  2. import java.util.* ;
  3. import cn.mldn.lxh.vo.* ;
  4. public interface IEmpDAO {
  5. public boolean doCreate(Emp emp) throws Exception ;
  6. public List<Emp> findAll(String keyWord) throws Exception ;
  7. public Emp findById(int empno) throws Exception ;
  8. }

有了接口,下面是具体的实现类:EmpDAOImpl.java: 放在DAO的子包里: \cn\mldn\lxh\dao\impl

  1. package cn.mldn.lxh.dao.impl ;
  2. import java.util.* ;
  3. import java.sql.* ;
  4. import cn.mldn.lxh.dao.* ;
  5. import cn.mldn.lxh.vo.* ;
  6.  
  7. public class EmpDAOImpl implements IEmpDAO {
  8. private Connection conn = null ;
  9. private PreparedStatement pstmt = null ;
  10. public EmpDAOImpl(Connection conn){
  11. this.conn = conn ;
  12. }
  13. public boolean doCreate(Emp emp) throws Exception{
  14. boolean flag = false ;
  15. String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES (?,?,?,?,?)" ;
  16. this.pstmt = this.conn.prepareStatement(sql) ;
  17. this.pstmt.setInt(1,emp.getEmpno()) ;
  18. this.pstmt.setString(2,emp.getEname()) ;
  19. this.pstmt.setString(3,emp.getJob()) ;
  20. this.pstmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime())) ;
  21. this.pstmt.setFloat(5,emp.getSal()) ;
  22. if(this.pstmt.executeUpdate() > 0){
  23. flag = true ;
  24. }
  25. this.pstmt.close() ;
  26. return flag ;
  27. }
  28. public List<Emp> findAll(String keyWord) throws Exception{
  29. List<Emp> all = new ArrayList<Emp>() ;
  30. String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?" ;
  31. this.pstmt = this.conn.prepareStatement(sql) ;
  32. this.pstmt.setString(1,"%"+keyWord+"%") ;
  33. this.pstmt.setString(2,"%"+keyWord+"%") ;
  34. ResultSet rs = this.pstmt.executeQuery() ;
  35. Emp emp = null ;
  36. while(rs.next()){
  37. emp = new Emp() ;
  38. emp.setEmpno(rs.getInt(1)) ;
  39. emp.setEname(rs.getString(2)) ;
  40. emp.setJob(rs.getString(3)) ;
  41. emp.setHiredate(rs.getDate(4)) ;
  42. emp.setSal(rs.getFloat(5)) ;
  43. all.add(emp) ;
  44. }
  45. this.pstmt.close() ;
  46. return all ;
  47. }
  48. public Emp findById(int empno) throws Exception{
  49. Emp emp = null ;
  50. String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?" ;
  51. this.pstmt = this.conn.prepareStatement(sql) ;
  52. this.pstmt.setInt(1,empno) ;
  53. ResultSet rs = this.pstmt.executeQuery() ;
  54. if(rs.next()){
  55. emp = new Emp() ;
  56. emp.setEmpno(rs.getInt(1)) ;
  57. emp.setEname(rs.getString(2)) ;
  58. emp.setJob(rs.getString(3)) ;
  59. emp.setHiredate(rs.getDate(4)) ;
  60. emp.setSal(rs.getFloat(5)) ;
  61. }
  62. this.pstmt.close() ;
  63. return emp ;
  64. }
  65. }

代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作\cn\mldn\lxh\dao\proxy\EmpDAOProxy.java;

  1. package cn.mldn.lxh.dao.proxy ;
  2. import java.util.* ;
  3. import java.sql.* ;
  4. import cn.mldn.lxh.dao.* ;
  5. import cn.mldn.lxh.dbc.* ;
  6. import cn.mldn.lxh.dao.impl.* ;
  7. import cn.mldn.lxh.vo.* ;
  8.  
  9. public class EmpDAOProxy implements IEmpDAO {
  10. private DatabaseConnection dbc = null ;
  11. private IEmpDAO dao = null ;
  12. public EmpDAOProxy() throws Exception {
  13. this.dbc = new DatabaseConnection() ;
  14. this.dao = new EmpDAOImpl(this.dbc.getConnection()) ;
  15. }
  16. public boolean doCreate(Emp emp) throws Exception{
  17. boolean flag = false ;
  18. try{
  19. if(this.dao.findById(emp.getEmpno()) == null){
  20. flag = this.dao.doCreate(emp) ;
  21. }
  22. }catch(Exception e){
  23. throw e ;
  24. }finally{
  25. this.dbc.close() ;
  26. }
  27. return flag ;
  28. }
  29. public List<Emp> findAll(String keyWord) throws Exception{
  30. List<Emp> all = null ;
  31. try{
  32. all = this.dao.findAll(keyWord) ;
  33. }catch(Exception e){
  34. throw e ;
  35. }finally{
  36. this.dbc.close() ;
  37. }
  38. return all ;
  39. }
  40. public Emp findById(int empno) throws Exception{
  41. Emp emp = null ;
  42. try{
  43. emp = this.dao.findById(empno) ;
  44. }catch(Exception e){
  45. throw e ;
  46. }finally{
  47. this.dbc.close() ;
  48. }
  49. return emp ;
  50. }
  51. }

Factory: 工厂类 \cn\mldn\lxh\factory\DAOFactory.java:

  1. package cn.mldn.lxh.factory ;
  2. import cn.mldn.lxh.dao.IEmpDAO ;
  3. import cn.mldn.lxh.dao.proxy.EmpDAOProxy ;
  4. public class DAOFactory {
  5. public static IEmpDAO getIEmpDAOInstance() throws Exception{
  6. return new EmpDAOProxy() ;
  7. }
  8. }

测试程序:TestDAOInsert.java:

  1. package cn.mldn.lxh.dao.test ;
  2. import cn.mldn.lxh.factory.DAOFactory ;
  3. import cn.mldn.lxh.vo.* ;
  4. public class TestDAOInsert{
  5. public static void main(String args[]) throws Exception{
  6. Emp emp = null ;
  7. for(int x=0;x<5;x++){
  8. emp = new Emp() ;
  9. emp.setEmpno(1000 + x) ;
  10. emp.setEname("李兴华 - " + x) ;
  11. emp.setJob("程序员 - " + x) ;
  12. emp.setHiredate(new java.util.Date()) ;
  13. emp.setSal(500 * x) ;
  14. DAOFactory.getIEmpDAOInstance().doCreate(emp) ;
  15. }
  16. }
  17. }

测试程序:TestDAOSelect.java:

  1. package cn.mldn.lxh.dao.test ;
  2. import java.util.* ;
  3. import cn.mldn.lxh.factory.DAOFactory ;
  4. import cn.mldn.lxh.vo.* ;
  5. public class TestDAOSelect{
  6. public static void main(String args[]) throws Exception{
  7. List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll("") ;
  8. Iterator<Emp> iter = all.iterator() ;
  9. while(iter.hasNext()){
  10. Emp emp = iter.next() ;
  11. System.out.println(emp.getEmpno() + "、" + emp.getEname() + " --> " + emp.getJob()) ;
  12. }
  13. }
  14. }

当DAO开发完成之后,下面就利用JSP完成DAO程序的调用: emp_insert.jsp:

  1. <%@ page contentType="text/html" pageEncoding="GBK"%>
  2. <html>
  3. <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
  4. <body>
  5. <form action="emp_insert_do.jsp" method="post">
  6. 雇员编号:<input type="text" name="empno"><br>
  7. 雇员姓名:<input type="text" name="ename"><br>
  8. 雇员职位:<input type="text" name="job"><br>
  9. 雇佣日期:<input type="text" name="hiredate"><br>
  10. 基本工资:<input type="text" name="sal"><br>
  11. <input type="submit" value="注册">
  12. <input type="reset" value="重置">
  13. </form>
  14. </body>
  15. </html>

处理emp_insert_do.jsp:

  1. <%@ page contentType="text/html" pageEncoding="GBK"%>
  2. <%@ page import="cn.mldn.lxh.factory.*,cn.mldn.lxh.vo.*"%>
  3. <%@ page import="java.text.*"%>
  4. <html>
  5. <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
  6. <% request.setCharacterEncoding("GBK"); %>
  7. <body>
  8. <%
  9. Emp emp = new Emp() ;
  10. emp.setEmpno(Integer.parseInt(request.getParameter("empno"))) ;
  11. emp.setEname(request.getParameter("ename")) ;
  12. emp.setJob(request.getParameter("job")) ;
  13. emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("hiredate"))) ;
  14. emp.setSal(Float.parseFloat(request.getParameter("sal"))) ;
  15. try{
  16. if(DAOFactory.getIEmpDAOInstance().doCreate(emp)){
  17. %>
  18. <h3>雇员信息添加成功!</h3>
  19. <%
  20. } else {
  21. %>
  22. <h3>雇员信息添加失败!</h3>
  23. <%
  24. }
  25. %>
  26. <%
  27. }catch(Exception e){
  28. e.printStackTrace() ;
  29. }
  30. %>
  31. </body>
  32. </html>

显示信息emp_list.jsp:

  1. <%@ page contentType="text/html" pageEncoding="GBK"%>
  2. <%@ page import="cn.mldn.lxh.factory.*,cn.mldn.lxh.vo.*"%>
  3. <%@ page import="java.util.*"%>
  4. <html>
  5. <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
  6. <% request.setCharacterEncoding("GBK") ; %>
  7. <body>
  8. <%
  9. String keyWord = request.getParameter("kw") ;
  10. if(keyWord == null){
  11. keyWord = "" ; // 如果没有查询关键字,则查询全部
  12. }
  13. List<Emp> all = DAOFactory.getIEmpDAOInstance().findAll(keyWord) ;
  14. Iterator<Emp> iter = all.iterator() ;
  15. %>
  16. <center>
  17. <form action="emp_list.jsp" method="post">
  18. 请输入查询关键字:<input type="text" name="kw">
  19. <input type="submit" value="查询">
  20. </form>
  21. <table border="1" width="80%">
  22. <tr>
  23. <td>雇员编号</td>
  24. <td>雇员姓名</td>
  25. <td>雇员工作</td>
  26. <td>雇佣日期</td>
  27. <td>基本工资</td>
  28. </tr>
  29. <%
  30. while(iter.hasNext()){
  31. Emp emp = iter.next() ;
  32. %>
  33. <tr>
  34. <td><%=emp.getEmpno()%></td>
  35. <td><%=emp.getEname()%></td>
  36. <td><%=emp.getJob()%></td>
  37. <td><%=emp.getHiredate()%></td>
  38. <td><%=emp.getSal()%></td>
  39. </tr>
  40. <%
  41. }
  42. %>
  43. </table>
  44. </center>
  45. </body>
  46. </html>

可以发现,一个JSP页面中不导入SQL包,如果有可能,一个包都不要导入。

总结:

可以发现,使用JSP+DAO的开发之后,程序更加清晰,而且以后所有的数据层操作可以任意移植,不一定非要在JSP上使用。

通过JSP+JavaBean的开发模式,也称为Model I, 通过JSP显示,通过JavaBean完成功能,达到显示和操作分离。

JavaBean-- DAO设计模式的更多相关文章

  1. JavaBean中DAO设计模式介绍(转)

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  2. JavaBean在DAO设计模式简介

    一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Se ...

  3. JavaBean中DAO设计模式介绍

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是client,简单的来说就是浏览器. 2.显示层:JSP/ ...

  4. JavaBean中DAO设计模式简介

    一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Ser ...

  5. JavaWeb技术(二):DAO设计模式

    1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DA ...

  6. DAO设计模式

    DAO设计模式 DAO设计模式简介: DAO设计模式可以减少代码量,增强程序的可移植性,提高代码的可读性. DAO(数据库操作对象)设计模式是 JavaEE 数据层的操作.主要由五部分组成: 1.数据 ...

  7. Java Dao设计模式

    一.信息系统的开发架构   客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/S ...

  8. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

    1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据 ...

  10. jsp DAO设计模式

    DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的 ...

随机推荐

  1. 完美版cookie设置/得到/删除2016/423

    function setCookie(key, value, t) { var oDate = new Date(); oDate.setDate( oDate.getDate() + t ); do ...

  2. MVC 包命名规范

    action+form = model     actionservlet+struts-config.xml= controller     jsp+自定义标签=veiw 备注:这里说明的非常好 m ...

  3. 使用node.js创建第一个应用

    node.js应用组成部分 1.引入require模块:我们可以使用require指令来载入Node.js模块. 2.创建服务器:服务器可以监听客户端的请求,类似于Apache,Nninx等HTTP服 ...

  4. 在 Linux 环境下报错 java.lang.reflect.InvocationTargetException

    今天开发了一个 excel 导出数据的功能,放到 linux 服务器上后发现报错. 捕获到 java.lang.reflect.InvocationTargetException 异常,这个异常不太常 ...

  5. vbs 读取txt是读取特定的行

    读取第三行的内容:Set fso = CreateObject("scripting.filesystemobject")path="A.TXT文件的路径"Se ...

  6. JedisConnectionException: Unexpected end of stream.

    在实际项目中遇到redis读取时报错. 报错是 [ERROR]  redis.clients.jedis.exceptions.JedisConnectionException: Unexpected ...

  7. POJ- Find a multiple -(抽屉原理)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6452   Accepted: 2809   Special Judge D ...

  8. Underscore.js 的模板功能介绍与应用

    Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能,需要了解的朋友可以详细参考下   U ...

  9. php数据排序---array_multisort

    PHP代码 <?php $ar1 = array(10, 100, 100, 0); $ar2 = array(1, 3, 2, 4); array_multisort($ar1, $ar2); ...

  10. iPhone5s 等 64位真机 运行 带有百度地图等 仅支持32位系统API和SDK的问题

    将下图中画红色框的部分去掉,程序就不再支持64位了.iPhone5s 将使用它的32位兼容模式.(而不再是64位模式)百度地图也不会报错了.