DAO设计模式简介

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。

数据开发结构:


资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作

业务层是整个项目的核心


DAO组成

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

VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;

DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等;

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

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

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


对于包的命名:

在使用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.

用DAO重新写登陆页面:

所需要的文件:这里直接使用MVC模式开发,使用myeclipse 10。



数据库脚本:


 
 
  1. /*=============删除数据库=============*/
  2. DROP DATABASE IF EXISTS usr;
  3. /*=============创建数据库=============*/
  4. CREATE DATABASE usr;
  5. /*=============使用数据库=============*/
  6. USE usr;
  7. /*=============删除数据库表===========*/
  8. DROP TABLE IF EXISTS login;
  9. /*=============创建数据库表===========*/
  10. CREATE TABLE login(
  11. userid VARCHAR( 30) PRIMARY KEY,
  12. name VARCHAR( 30) NOT NULL,
  13. password VARCHAR( 32) NOT NULL
  14. );
  15. INSERT INTO login(userid, name, password) VALUES( 'admin', 'admin', 'admin');

1.定义vo类,vo类定义了数据的属性,及相应的setter,getter方法。

定义User类 :User.java -------- package org.thystar.mvcdemo.vo.User.


 
 
  1. /**
  2. * vo层
  3. */
  4. package org.thystar.mvcdemo.vo;
  5. /**
  6. *
  7. * 定义用户类
  8. */
  9. public class User {
  10. private String userid; //用户ID
  11. private String name; //用户名
  12. private String password; //密码
  13. public String getUserid() {
  14. return userid;
  15. }
  16. public void setUserid(String userid) {
  17. this.userid = userid;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public String getPassword() {
  26. return password;
  27. }
  28. public void setPassword(String password) {
  29. this.password = password;
  30. }
  31. }

2. 定义数据库连接类,这个类只负责连接数据库:

定义DataBaseConnection类 DatabaseConnection.java ------------package org.thystar.mvcdemo.dbc.DatabaseConnection;


 
 
  1. package org.thystar.mvcdemo.dbc;
  2. import java.sql.*;
  3. /**
  4. *
  5. * 连接数据库
  6. *
  7. */
  8. public class DatabaseConnection {
  9. // 定义数据库驱动程序
  10. private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
  11. // 数据库连接地址
  12. private static final String DBURL = "jdbc:mysql://localhost:3306/usr";
  13. private static final String DBUSER = "root"; // 数据库连接用户名
  14. private static final String DBPASSWORD = "mysqladmin"; // 数据库连接密码
  15. private Connection conn = null; //声明数据库连接对象
  16. public DatabaseConnection() throws Exception{ //构造函数
  17. try{
  18. Class.forName(DBDRIVER); // 加载驱动程序
  19. this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 取得数据库连接
  20. } catch(Exception e){
  21. throw e;
  22. }
  23. }
  24. public Connection getConnection() { //取得数据库连接
  25. return this.conn;
  26. }
  27. public void close() throws Exception { // 关闭数据库操作
  28. if( this.conn != null){ // 避免NullPointerException
  29. try{
  30. this.conn.close(); // 关闭数据库
  31. } catch(Exception e){
  32. throw e; // 抛出异常
  33. }
  34. }
  35. }
  36. }

3 . 定义数据库操作接口,定义数据库操作的方法:

定义IUserDAO接口,IUserDAO.java --------- package org.thystar.mvcdemo.dao.IUserDAO


 
 
  1. package org.thystar.mvcdemo.dao;
  2. // 在这个操作中要导入vo包。
  3. import org.thystar.mvcdemo.vo.*;
  4. /**
  5. *
  6. * 数据库操作接口
  7. *
  8. */
  9. public interface IUserDAO {
  10. /**
  11. * 用户登录验证
  12. * @param user 传入vo对象
  13. * @return 验证操作结果
  14. * @throws Exception
  15. */
  16. public boolean findLogin(User user) throws Exception;
  17. }

4. 定义DAO实现类,实现接口中定义的方法

定义UserDAOImpl类, UserDAOImpl.java ---------package org.thystar.mvcdemo.dao.impl.UserDAOImpl


 
 
  1. package org.thystar.mvcdemo.dao.impl;
  2. import java.sql.*;
  3. import org.thystar.mvcdemo.dao.IUserDAO;
  4. import org.thystar.mvcdemo.vo.User;
  5. /**
  6. *
  7. * DAO实现类,实现方法,但不负责数据库的具体连接
  8. *
  9. */
  10. public class UserDAOImpl implements IUserDAO{
  11. private Connection conn = null; //定义数据库的连接对象
  12. private PreparedStatement pstmt = null; //定义数据库操作对象
  13. public UserDAOImpl(Connection conn){ // 构造方法,设置数据库连接
  14. this.conn = conn;
  15. }
  16. /**
  17. * 具体操作方法:查询
  18. */
  19. public boolean findLogin(User user) throws Exception{
  20. boolean flag = false; //定义标志位
  21. try{
  22. String sql = "SELECT name FROM login WHERE userid = ? AND password = ?";
  23. this.pstmt = this.conn.prepareStatement(sql); // 实例化操作
  24. this.pstmt.setString( 1, user.getUserid()); // 设置用户id
  25. this.pstmt.setString( 2, user.getPassword()); // 设置password
  26. ResultSet rs = this.pstmt.executeQuery(); // 取得查询结果
  27. if(rs.next()){
  28. user.setName(rs.getString( 1)); //取得姓名
  29. flag = true;
  30. }
  31. } catch(Exception e){
  32. throw e;
  33. }
  34. return flag;
  35. }
  36. }
可以看出,在真实的数据库的实现类中,没有处理数据库打开和关闭的操作,只是通过构造方法取得了数据库的连接,真正的负责打开和关闭的操作由代理类实现

5.代理(proxy)类实现:负责数据库的打开和关闭及调用真实实现类对象操作:

定义UserDAOProxy implements IUserDAO,UserDAOProxy.java ------------package org.thystar.mvcdemo.dao.proxy.UserDAOProxy


 
 
  1. package org.thystar.mvcdemo.dao.proxy;
  2. /**
  3. * 代理类,要找到真实主题
  4. */
  5. import org.thystar.mvcdemo.dao.IUserDAO;
  6. import org.thystar.mvcdemo.dbc.DatabaseConnection;
  7. import org.thystar.mvcdemo.dao.impl.UserDAOImpl;
  8. import org.thystar.mvcdemo.vo.User;
  9. public class UserDAOProxy implements IUserDAO {
  10. private DatabaseConnection dbc = null;
  11. private IUserDAO dao = null;
  12. public UserDAOProxy() { //构造方法,实例化连接,同时实例化dao对象
  13. try {
  14. this.dbc = new DatabaseConnection(); // 连接数据库
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. this.dao = new UserDAOImpl( this.dbc.getConnection()); //实例化真实主题类
  20. }
  21. public boolean findLogin(User user) throws Exception{ // 实现接口中的方法。
  22. boolean flag = false; //定义标志位
  23. try{
  24. flag = this.dao.findLogin(user); // 调用真实主题
  25. } catch(Exception e){
  26. throw e; //向上抛出异常
  27. } finally{
  28. this.dbc.close();
  29. }
  30. return flag; //返回标记
  31. }
  32. }

6. 工厂类的实现: 取得DAO实例

定义DAOFactory类, DAOFactory.java --------------package org.thystar.mvcdemo.factory.DAOFactory


 
 
  1. package org.thystar.mvcdemo.factory;
  2. import org.thystar.mvcdemo.dao.IUserDAO;
  3. import org.thystar.mvcdemo.dao.proxy.UserDAOProxy;
  4. /**
  5. *
  6. * 工长类
  7. *
  8. */
  9. public class DAOFactory {
  10. public static IUserDAO getIUserDAOInstance(){ // 取得DAO实例
  11. return new UserDAOProxy(); // 返回代理实例
  12. }
  13. }
工厂类的功能就是直接返回DAO接口的实例化对象,以后客户端直接通过工厂类就可以取得DAO接口的实例化对象

到这里,数据层的部分就完成了,下面开始定义Servlet/jsp部分,也就是显示层,进行页面的显示

7 .定义Servlet:

LoginServlet.java


 
 
  1. /**
  2. * 定义Servlet
  3. */
  4. package org.thystar.mvcdemo.servlet;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import org.thystar.mvcdemo.factory.DAOFactory;
  14. import org.thystar.mvcdemo.vo.User;
  15. public class LoginServlet extends HttpServlet {
  16. private static final long serialVersionUID = 1L;
  17. /**
  18. * The doGet method of the servlet. <br>
  19. *
  20. * This method is called when a form has its tag value method equals to get.
  21. *
  22. * @param request the request send by the client to the server
  23. * @param response the response send by the server to the client
  24. * @throws ServletException if an error occurred
  25. * @throws IOException if an error occurred
  26. */
  27. public void doGet(HttpServletRequest request, HttpServletResponse response)
  28. throws ServletException, IOException {
  29. String path = "login.jsp";
  30. String userid = request.getParameter( "userid"); //接收userid的内容
  31. String userpass = request.getParameter( "userpass"); //接收userpass的内容
  32. List<String> info = new ArrayList<String>(); // 保存返回信息
  33. //判断输入为空的情况
  34. if(userid == null || "".equals(userid)){
  35. info.add( "用户id不能为空");
  36. }
  37. if(userpass == null || "".equals(userpass)){
  38. info.add( "密码不能为空");
  39. }
  40. //用户名密码验证通过
  41. if(info.size() == 0){
  42. User user = new User(); //实例化vo
  43. user.setUserid(userid); //设置userid
  44. user.setPassword(userpass); //设置userpass
  45. try {
  46. if(DAOFactory.getIUserDAOInstance().findLogin(user)){ //验证通过
  47. info.add( "通过验证" + user.getName() + "已登录");
  48. } else{
  49. info.add( "登录失败");
  50. }
  51. } catch (Exception e) {
  52. // TODO: handle exception
  53. e.printStackTrace();
  54. }
  55. }
  56. request.setAttribute( "info", info);
  57. request.getRequestDispatcher(path).forward(request, response); //跳转
  58. }
  59. /**
  60. * The doPost method of the servlet. <br>
  61. *
  62. * This method is called when a form has its tag value method equals to post.
  63. *
  64. * @param request the request send by the client to the server
  65. * @param response the response send by the server to the client
  66. * @throws ServletException if an error occurred
  67. * @throws IOException if an error occurred
  68. */
  69. public void doPost(HttpServletRequest request, HttpServletResponse response)
  70. throws ServletException, IOException {
  71. this.doGet(request, response); // 调用doGet操作
  72. }
  73. }

8. 登陆页 

login.jsp


 
 
  1. <%@ page contentType = "text/html" pageEncoding= "GBK" import = "java.util.*"%>
  2. <html>
  3. <head>
  4. <title>www.thystar.com</title>
  5. <script language = "JavaScript">
  6. function validate(f){
  7. if(!(/^\w{1,15}$/.test(f.userid.value))){
  8. alert("用户ID必须是1~15位");
  9. f.userid.focus();
  10. return false;
  11. }
  12. if(!(/^\w{1,15}$/.test(f.userpass.value))){
  13. alert("密码必须是1~15位");
  14. f.userpass.focus();
  15. return false;
  16. }
  17. return true;
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <h2>用户登录</h2>
  23. <%
  24. request.setCharacterEncoding("GBK");
  25. %>
  26. <%
  27. List<String> info=(List<String>)request.getAttribute("info");
  28. if(info != null){
  29. Iterator<String> iter = info.iterator();
  30. while(iter.hasNext()){
  31. %>
  32. <h4><%= iter.next() %></h4>
  33. <%
  34. }
  35. }
  36. %>
  37. <form action="LoginServlet" method="post" onSubmit = "validate(this)">
  38. 用户ID: <input type = "text" name = "userid"><br>
  39. 密  码:<input type = "password" name="userpass"><br>
  40. <input type = "submit" value = "登录">
  41. <input type = "reset" value = "重置">
  42. </form>
  43. </body>
  44. </html>

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值