DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作。

一、为什么要用DAO?

  比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的HTML代码和JSP代码,将显示和功能代码混在一起,难以维护。并且在JSP页面中使用JDBC代码,必须导入相应的"java.sql.*"包。基于使得JSP页面专注于数据的表现的思想,我们只是希望JSP主要负责数据的显示,而不需要关注数据的来源和途径。同时在JSP进行JDBC操作,重复编码太多。如,不同的页面连接同一个数据库时需要在每个页面中都进行JDBC编码。

  DAO设计模式提供了一种通用的模式,来简化大量的代码,增强程序的可移植性。

二、DAO组成

在这个模式中DAO主要完成数据的操作,客户端依靠DAO接口进行操作,服务端要将接口进行具体实现。DAO的主要组成由以下几个部分组成。

1、DatabaseConnection:专门负责数据库打开与关闭操作的类。

2、VO:主要由属性、setter、getter方法,VO类中的属性与数据表中的字段相对应。每一个VO对象相当于表中的一条记录。

3、DAO接口:主要定义数据库操作的接口,定义数据库的原子性操作,如增删改,按ID查询。

4、Impl:DAO的具体实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭,接口类的名称首字母用“I”,表示其是一个接口。

5、Proxy:代理实现类。主要完成数据库的打开和关闭,并调用Impl类对象(真实对象类)的操作,之所以增加代理类是为了以后的拓展,如果一个程序可以A-B,那么中间最好加一个过渡,使用A-C-B的形式,可以有效减少程序的耦合度,使开发结构更加清晰。

6、Factory:工厂类,通过工厂类取得一个DAO的实例化对象,编写工厂类也是为了降低代码的耦合度,工厂类产生实例的方法通常是静态函 数,这样一来就可以通过工厂类名直接生成实例。

用户登录源码   DAOModel

1、数据库连接类(DBConn):一个Java类。负责与后台数据库进行连接。提供了至少三个方法:

构造方法 public DataBaseConnection():进行数据库连接,得到一个Connection对象。
返回数据库连接Connection的public Connection getConnection():提供一个外部获取连接的方法,返回一个Connection对象。
关闭数据库连接public void close():关闭数据库连接,Connection对象调用close方法。。

在JDBC中,进行数据库连接需要四个参数:数据库驱动类DBDriver、数据库连接URL、用户名、密码。

注意需要在项目的构建路径下放入相应的数据库连接驱动, mysql-connector-java-5.1.6-bin

连接MySQL数据库下的test数据库,用户名为root、密码为123456。

DataBaseConnection.java

  1. // 本类只用于数据库连接及关闭操作
  2. package cn.hist.test.dbconn;
  3.  
  4. import java.sql.* ;
  5.  
  6. //主要功能就是连接数据库、关闭数据库
  7. public class DataBaseConnection{
  8. //定义数据库驱动类
  9. private final String DBDRIVER = "org.gjt.mm.mysql.Driver";
  10. //定义数据库连接URL
  11. private final String DBURL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF8";
  12. //定义数据库连接用户名
  13. private final String DBUSER = "root";
  14. //定义数据库连接密码
  15. private final String DBPASSWORD = "123456";
  16. //定义数据库连接对象
  17. private Connection conn = null ;
  18. //构造方法,加载驱动
  19. public DataBaseConnection(){
  20. try{
  21. Class.forName(DBDRIVER) ;
  22. conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
  23. }
  24. catch (Exception e){
  25. System.out.println("加载驱动失败");
  26. }
  27. }
  28. // 取得数据库连接
  29. public Connection getConnection() {
  30. return this.conn;
  31. }
  32. // 关闭数据库连接
  33. public void close(){
  34. try{
  35. conn.close() ;
  36. }catch (Exception e){
  37. System.out.println("数据库连接关闭失败");
  38. }
  39. }
  40. }

2、VO(Value Objects)值对象:与数据库表一一对应的Java类。含有与数据库表字段一一对应的属性,相应属性的getter和setter方法。甚至还有一些验证方法。VO提供了一个面向对象的方法来操作数据库。以后我们的DAO接口就是通过调用VO来进行数据库操作的。
例:对应于数据库表T_User:三个字段,id、username、password。相应的VO类
User.java

  1. package cn.hist.test.vo;
  2.  
  3. public class User {
  4. // 用户姓名
  5. private String username;
  6. // 用户密码
  7. private String password;
  8.  
  9. // 获得用户名
  10. public String getUsername() {
  11. return username;
  12. }
  13.  
  14. // 设置用户名
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18.  
  19. // 获得用户密码
  20. public String getPassword() {
  21. return password;
  22. }
  23.  
  24. // 设置用户密码
  25. public void setPassword(String password) {
  26. this.password = password;
  27. }
  28. }

3、DAO接口:定义了所有的用户的操作,如添加记录、删除记录和查询记录等。这不是一个具体的实现类,而是一个接口,仅仅定义了相应的操作(方法),这是给后来的具体实现提供一种灵活性和易维护性。具体的实现需要具体实现类实现这个接口的方法来实现。
UserDAO.java

  1. package cn.hist.test.dao;
  2.  
  3. import cn.hist.test.vo.User;
  4.  
  5. //定义数据库操作方法
  6. public interface UserDAO {
  7. // 用户名,密码登录
  8. public boolean isLogin (User user) throws Exception ;
  9. }

4、DAO实现类:这里才是具体的操作的实现。需要实现DAO接口以及相应的方法。

UserDAOImpl.java

  1. package cn.hist.test.impl;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6.  
  7. import cn.hist.test.dao.UserDAO;
  8. import cn.hist.test.vo.User;
  9.  
  10. public class UserDAOImpl implements UserDAO {
  11. private Connection conn = null;
  12. private PreparedStatement pstmt = null;
  13.  
  14. public UserDAOImpl(Connection conn) {//构造方法取得与数据库连接
  15. this.conn = conn;
  16. }
  17.  
  18. // 用户名,密码登录操作
  19. public boolean isLogin(User user) throws Exception {
  20. boolean flag = false;
  21. String sql = "SELECT * FROM user" ;
  22. this.pstmt = this.conn.prepareStatement(sql); //预编译
  23. ResultSet rs = pstmt.executeQuery() ;
  24. String username = user.getUsername();
  25. String password = user.getPassword();
  26. while (rs.next()) {
  27. // 查询出内容,分别与用户输入的用户名和密码进行比较
  28. if (username.equals(rs.getString("username")) && password.equals(rs.getString("password"))) {
  29. flag = true;
  30. }
  31. }
  32. this.pstmt.close(); //关闭打开的操作
  33. return flag;
  34. }
  35. }

5、Proxy:代理实现类。主要完成数据库的打开和关闭,并调用Impl类对象(真实对象类)的操作,之所以增加代理类是为了以后的拓展,如果一个程序可以A-B,那么中间最好加一个过渡,使用A-C-B的形式,可以有效减少程序的耦合度,使开发结构更加清晰。

UserDAOProxy.java

  1. package cn.hist.test.proxy;//代理类
  2.  
  3. import cn.hist.test.dao.UserDAO;
  4. import cn.hist.test.dbconn.DataBaseConnection;
  5. import cn.hist.test.impl.UserDAOImpl;
  6. import cn.hist.test.vo.User;
  7.  
  8. public class UserDAOProxy implements UserDAO {
  9. private DataBaseConnection dbc = null; //定义数据库连接类
  10. private UserDAO userDAOImpl = null; //声明DAO
  11.  
  12. public UserDAOProxy() throws Exception { //构造方法中实例化连接与实例化DAO对象
  13. this.dbc = new DataBaseConnection(); //连接数据库
  14. this.userDAOImpl = new UserDAOImpl(this.dbc.getConnection());//实例化真实类
  15. }
  16.  
  17. public boolean isLogin(User user) throws Exception {
  18. boolean flag = false; //首先要定义要返回的变量
  19. try {
  20. flag = userDAOImpl.isLogin(user); //调用真实主题操作
  21. } catch (Exception e) {
  22. throw e;
  23. } finally {
  24. dbc.close(); //关闭数据库
  25. }
  26. return flag;
  27. }
  28. }

6、DAO工厂类:在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库的操作。这时要求必须知道具体的实现子类,对于后期的修改十分不便。如后期需要创建一个该DAO接口的Oracle实现类。这时就必须修改所有使用DAO实现类的代码。如果使用DAO工厂类的一个静态方法(不需要创建对象即可调用)来获取DAO实现类实例,这时替换DAO实现类,只需修改DAO工厂类中的方法代码,而不需要修改所有的调用DAO实现的代码。
DAO工厂类是一个单例模式,这样避免的数据库的不一致。
例:通过DAO工厂类来获取具体的DAO实现类。
DAOFactory.java

  1. package cn.hist.test.factory;//工厂类(能够根据能够根据不同的参数信息得到对象的实例)
  2.  
  3. import cn.hist.test.dao.UserDAO;
  4. import cn.hist.test.proxy.UserDAOProxy;
  5.  
  6. public class DAOFactory {
  7. public static UserDAO getUserDAOInstance() throws Exception { //取得DAO接口实例
  8. return new UserDAOProxy(); //取得代理类的实例
  9. }
  10. }

三、用户登录实例

login.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <title>2</title>
  8. <link rel="stylesheet" href="">
  9. </head>
  10. <form id="form1" action="LoginCheck" method="post">
  11. username: <input type="text" name="username" id="username" />
  12. password: <input type="password" name="password" id="password" />
  13. <input type="submit" value="登录" id="send" />
  14. </form>
  15. </body>
  16. </html>

LoginCheck.java

  1. package cn.hist.test.servlet;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9.  
  10. import cn.hist.test.dao.UserDAO;
  11. import cn.hist.test.factory.DAOFactory;
  12. import cn.hist.test.vo.User;
  13.  
  14. public class LoginCheck extends HttpServlet {
  15. @Override
  16. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  17. throws ServletException, IOException {
  18.  
  19. req.setCharacterEncoding("utf-8");
  20. resp.setContentType("text/html;charset=utf-8");
  21. boolean flag = false;
  22. HttpSession session = req.getSession();
  23. String username = req.getParameter("username");
  24. String password = req.getParameter("password");
  25. UserDAO userDAOProxy = null;
  26. try {
  27. userDAOProxy = DAOFactory.getUserDAOInstance();
  28. } catch (Exception e1) {
  29. e1.printStackTrace();
  30. }
  31. User user = new User();
  32. user.setUsername(username);
  33. user.setPassword(password);
  34. try {
  35. flag = userDAOProxy.isLogin(user);
  36. if (flag) {
  37. session.setAttribute("user", user);
  38. resp.sendRedirect("success.jsp");
  39. } else {
  40. resp.sendRedirect("fail.jsp");
  41. }
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

success.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <title>Test</title>
  8. <link rel="stylesheet" href="">
  9. </head>
  10. <body>
  11. ${sessionScope.user.username} ,欢迎登录。
  12. <a href="Exit">退出</a>
  13. </body>
  14. </html> 

fail.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <title>fail</title>
  8. <link rel="stylesheet" href="">
  9. </head>
  10. <body>
  11. <p>登录失败!</p>
  12. </body>
  13. </html>

Exit.java

  1. package servlet;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10.  
  11. public class Exit extends HttpServlet{
  12. @Override
  13. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  14. throws ServletException, IOException {
  15. HttpSession session = req.getSession();
  16. session.removeAttribute("user");
  17. resp.sendRedirect("login.jsp");
  18. }
  19. }

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. version="2.5">
  6. <servlet>
  7. <servlet-name>LoginCheck</servlet-name>
  8. <servlet-class>cn.hist.test.servlet.LoginCheck</servlet-class>
  9. </servlet>
  10. <servlet>
  11. <servlet-name>Exit</servlet-name>
  12. <servlet-class>cn.hist.test.servlet.Exit</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>LoginCheck</servlet-name>
  16. <url-pattern>/LoginCheck</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19. <servlet-name>Exit</servlet-name>
  20. <url-pattern>/Exit</url-pattern>
  21. </servlet-mapping>
  22. <welcome-file-list>
  23. <welcome-file>login.jsp</welcome-file>
  24. </welcome-file-list>
  25. </web-app>

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

  1. Java Dao设计模式

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

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

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

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

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

  4. JavaBean在DAO设计模式简介

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

  5. JavaBean中DAO设计模式介绍

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

  6. DAO设计模式(转)

    J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码. 我们先来回顾一下DAO设计模式和数据访问对象. DAO基础  ...

  7. JavaBean中DAO设计模式简介

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

  8. DAO设计模式

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

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

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

随机推荐

  1. zepto源码研究 - zepto.js - 5(dom属性管理)

    index: $.fn = {...... indexOf: emptyArray.indexOf,} index: function(element){ //这里的$(element)[0]是为了将 ...

  2. JavaScript--Json对象

    JSON(JavaScript Object  Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何 ...

  3. QT5-控件-QLabel和QLCDNumber-标签显示图片或者视频,LCD用于上位机不错

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #incl ...

  4. 工作流activiti-02事物控制、流程引擎创建

    使用activiti中有个很重要的问题就是需要保证事物的控制 activiti使用的是mybatis作为orm技术 封装了一系列的操作数据库操作  这也就是大家调用的api 操作的数据库表都是acti ...

  5. JS实现定时器(类似工行网银支付限时操作)

      js脚本内容: //5秒倒计时 var num = 0 ; var max = 5 ; var id = null ; id = setInterval(box , 1000) ; //1秒钟调用 ...

  6. PLSQL developer连接不上64位Oracle的解决方法

    PLSQL developer连接不上64位Oracle的解决方法 64位下装Oracle 11g 64位,PLSQL Developer使用出现问题. 问题描述: 登录对话框中,数据库下拉框为空: ...

  7. javascript访问级别

    JavaScript中没有官方的访问级别语法,JavaScript没有类似于Java语言智能搞得private或protected这样的访问级别关键字,默认情况下,,对象中所有的成员都是公有和可访问的 ...

  8. GDI相关函数

    GetWindowRect计算窗口大小 MoveWindow 设置窗口大小 SetMapMode 该函数设置指定设备环境的映射方式 MM_LOMETRIC:每个逻辑单位转换为0.1毫米,X正方向向右, ...

  9. yield 生成器例子

    #!/usr/bin/env python #encoding: utf-8 import time def consumer(name): print ('%s 来吃包子了...' % (name) ...

  10. 使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework

    在Xamain 未被收购之前,这货monodroid.exe  就是一个打包的绑定...无奈 配置环境复杂,未能实现 ...有mono运行时就行了..不折腾了 玛德 让C#程序独立运行(脱离 .NET ...