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

数据开发结构流程:

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

业务层是整个项目的核心

2.DAO组成结构:

  • DatabaseConnection:专门负责数据库打开与关闭操作的类。
  • VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录。
  • DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等。
  • Impl: DAO接口的真实实现类,主要完成具体数据库操作,但不负责数据库的打开和关闭。
  • Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作。
  • Factory: 工厂类,通过工厂类取得一个DAO的实例化对象。

3.对于包的命名:

  • 数据库连接: 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.

4.DAO开发:

4.1数据库脚本如下:

create database DAO

create table Login(
UserID varchar(30) primary key,
name varchar(30),
password varchar(15)
); INSERT INTO login(UserID, name, password)VALUES('admin', 'admin', 'admin'); select * from login

4.2定义VO类,VO类有数据的属性以及setter,getter方法,代码如下:

package org.lxh.VO;

public class voDemo {
private String userid;
private String name;
private String password;
public void setUserid(String userid){
this.userid=userid;
}
public void setName(String name){
this.name=name;
}
public void setPassword(String password){
this.password=password;
}
public String getUserid(){
return this.userid;
}
public String getName(){
return this.name;
}
public String getPassword(){
return this.password;
}
}

4.3实现DateBaseConnection类,代码如下:

package org.lxh.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
public class DateBaseConnection {
private static final String DBDRIVER=
"com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQLserver数据库引擎
private static final String DBURL=
"jdbc:sqlserver://127.0.0.1:1433;DatabaseName=DAO";//数据源
private static final String DBUER="sa";//SQLserver数据库用户名
private static final String DBPASSWORD="123";//SQLserver登录密码
private Connection conn=null; //声明数据库连接对象
public DateBaseConnection() throws Exception{//在构造方法中连接数据库
Class.forName(DBDRIVER); //加载驱动程序
this.conn=DriverManager.getConnection(DBURL,DBUER,DBPASSWORD);//连接数据库
}
public Connection getConnection(){//取得数据库的连接
return this.conn;
}
public void close() throws Exception{//数据库的关闭操作
if(this.conn!=null){
try{
this.conn.close();//数据库关闭
System.out.println("数据库连接成功");
}catch(Exception e){
throw e;
}
System.out.println("数据库连接失败");
}
}
}

4.4定义DAO操作接口,代码如下:

package org.lxh.dao;

import org.lxh.VO.voDemo;

public interface IvoDemo {
//验证登录,有异常交给被调处处理
public boolean findLogin(voDemo vodemo) throws Exception;
}

4.5定义实现DAO接口类操作,代码如下:

package org.lxh.dao.impl;

import java.sql.*;

import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
/**
*
* DAO实现类,实现方法,但不负责数据库的具体连接 ,真实主题实现类
*
*/
public class voDemoDAOImpl implements IvoDemo{
private Connection conn = null; //定义数据库的连接对象
private PreparedStatement pstmt = null; //定义数据库操作对象
public voDemoDAOImpl(Connection conn){ // 构造方法,设置数据库连接
this.conn = conn;
}
/**
* 具体操作方法:查询 ,覆写DAO接口类
*/
public boolean findLogin(voDemo vodemo) throws Exception{
boolean flag = false; //定义标志位
try{
String sql = "SELECT name FROM Login WHERE UserID = ? AND password = ?";
this.pstmt = this.conn.prepareStatement(sql); // 实例化操作
this.pstmt.setString(1, vodemo.getUserid()); // 设置用户id
this.pstmt.setString(2, vodemo.getPassword()); // 设置password
ResultSet rs = this.pstmt.executeQuery(); // 取得查询结果
if(rs.next()){
vodemo.setName(rs.getString(1)); //取得姓名
flag = true;
}
}catch(Exception e){
throw e;
}
return flag;
}
}

4.6定义代理主题实现类,代码如下;

package org.lxh.dao.Proxy;

import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
import org.lxh.dao.impl.voDemoDAOImpl;
import org.lxh.dbc.DateBaseConnection; public class voDemoDAOProxy implements IvoDemo {
private DateBaseConnection dbc = null;
private IvoDemo dao = null;
public voDemoDAOProxy() { //构造方法,实例化连接,同时实例化dao对象
try {
this.dbc = new DateBaseConnection(); // 连接数据库
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.dao = new voDemoDAOImpl(this.dbc.getConnection()); //实例化真实主题类
}
public boolean findLogin(voDemo vodemo) throws Exception{ // 实现接口中的方法。
boolean flag = false; //定义标志位
try{
flag = this.dao.findLogin(vodemo); // 调用真实主题
}catch(Exception e){
throw e; //向上抛出异常
}finally{
this.dbc.close();
}
return flag; //返回标记
} }

4.7DAO工厂实现类操作,代码如下:

package org.lxh.factory;

import org.lxh.dao.IvoDemo;
import org.lxh.dao.Proxy.voDemoDAOProxy; public class DAOFactory {
public static IvoDemo getIvoDemoDAOInstance() throws Exception{
return new voDemoDAOProxy();
}
}

4.8定义servlet类操作,代码如下:

package org.lxh.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.lxh.VO.voDemo;
import org.lxh.factory.DAOFactory; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String path = "login.jsp";
String userid = request.getParameter("userid"); //接收userid的内容
String userpass = request.getParameter("userpass"); //接收userpass的内容
List<String> info = new ArrayList<String>(); // 保存返回信息
//判断输入为空的情况
if(userid == null || "".equals(userid)){
info.add("用户id不能为空");
}
if(userpass == null || "".equals(userpass)){
info.add("密码不能为空");
}
//用户名密码验证通过
if(info.size() == 0){
voDemo vodemo = new voDemo(); //实例化vo
vodemo.setUserid(userid); //设置userid
vodemo.setPassword(userpass); //设置userpass
try {
if(DAOFactory.getIvoDemoDAOInstance().findLogin(vodemo)){ //验证通过
info.add("通过验证" + vodemo.getName() + "已登录");
}else{
info.add("登录失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
request.setAttribute("info", info);
request.getRequestDispatcher(path).forward(request, response); //跳转
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response); // 调用doGet操作
} }

4.9定义JSP显示页面,代码如下:

<%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>  

<html>
<head> <title>www.thystar.com</title>
<script language = "JavaScript"> function validate(f){
if(!(/^\w{1,15}$/.test(f.userid.value))){
alert("用户ID必须是1~15位");
f.userid.focus();
return false;
}
if(!(/^\w{1,15}$/.test(f.userpass.value))){
alert("密码必须是1~15位");
f.userpass.focus();
return false;
}
return true;
}
</script> </head> <body>
<h2>用户登录</h2>
<%
request.setCharacterEncoding("GBK");
%>
<%
List<String> info=(List<String>)request.getAttribute("info");
if(info != null){
Iterator<String> iter = info.iterator();
while(iter.hasNext()){
%>
<h4><%= iter.next() %></h4>
<%
}
}
%>
<form action="LoginServlet" method="post" onSubmit = "validate(this)"> 用户ID: <input type = "text" name = "userid"><br>
密&nbsp;码:<input type = "password" name="userpass"><br>
<input type = "submit" value = "登录">
<input type = "reset" value = "重置">
</form>
</body>
</html>

实现代码图:

最新文章

  1. Windows Server2008 下用于.NET Framework3.0版本的问题无法在IIS7中配置.NET Framework4.0节点的问题
  2. [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
  3. 使用SwipeListView实现滑动效果
  4. Atitit.iso格式蓝光&#160;BDMV&#160;结构说明
  5. sql语句中left join、inner join中的on与where的区别
  6. UIScrollView子控件的布局
  7. SVG 2D入门1 - SVG综述
  8. C#处理Json文件
  9. Selenium IDE验证点
  10. overflow清楚浮动 + 去掉li标签的小圆点
  11. 让textbox紧贴IME
  12. 封装自己的Ajax框架
  13. MongoDB环境安装
  14. 测试覆盖率工具EclEmma安装与使用
  15. 清空Sql server日志
  16. ElasticSearch(四):使用Java连接ElasticSearch集群
  17. Java链表讲解
  18. [转]50个极好的bootstrap 后台框架主题下载
  19. Angular之RouterModule的forRoot与forChild
  20. “全栈2019”Java第六十九章:内部类访问外部类成员详解

热门文章

  1. Java中关于注释、标识符、变量、常量、数据类型、类型转换、转移字符以及数值型的表现形式的详解
  2. 【CF888G】Xor-MST
  3. springcloud Finchley 版本hystrix 和 hystrix Dashboard
  4. drupal-note2 drush运行make文件
  5. 常见的React面试题
  6. Jsp Layout 布局页
  7. 2016.9.24初中部上午NOIP普及组比赛总结
  8. Java-MyBatis-MyBatis3-XML映射文件:select
  9. BufferedReader用法
  10. springmvc 文件下载分批读取,防止内存溢出