JDBC之DAO设计

1 篇文章 0 订阅
1 篇文章 0 订阅

一、DAO介绍

DAO(数据访问对象)的主要功能是数据操作;

使用DAO设计模式,来封装数据库持久层的所有操作,使得低级的数据逻辑和高级的业务逻辑分离,达到解耦合的目的了;

在程序开发的结构中属于数据层的操作;

程序开发的标准架构如下:

 

客户层、显示层、业务层和数据层分别介绍如下:

(1)客户层:现在都采用B/S开发架构,一般用户都使用浏览器进行访问,当然也可以采用其他程序进行访问;

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

(3)业务层(Business Object,业务对象):会将多个原子性的DAO操作进行组合,组合城一个完整的业务逻辑;

(4)数据层(DAO):提供多个原子性的DAO操作,如增加、修改、删除等,都属于原子性操作;

DAO层就是编写一些具体的操作代码;

对于业务关联较多的系统,BO才会发挥作用;

如果业务操作相对简单,可以不使用BO,而完全通过DAO完成操作;

整个DAO中,实际上是以接口为操作标准,即客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现;

DAO由一下几个部分组成:

 

复杂的讲可分为如下几个组成部分:

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

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

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

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

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

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

 

简单的讲可以分成如下几个部分:

1.一个DAO接口;(定义功能)

2.一个实现DAO接口具体类;(具体功能实现)

3.一个DAO工厂类;(可有可没有)

4.数据传输对象(有时也叫值对象)->数据库的表对应一个类,这个类的结构和数据库的结构一样,可以称作vo,也可以称作Javabean;

 

以维护一个客户信息为例,具体组件如下所示:

1.CustomerDao接口

2.CustomerBean(也可以称作Customer值对象,Customer VO)

3.CustomerDao(功能接口)

4.CustomerDaoImpl(接口的具体实现类)

5.CustomerFactory(工厂类,实例化作用)

 

 

 

二、DAO设计模式实例

创建一个用户表(userTbl)

 

myelipse的文件结构如下所示:


 User.java(对应数据表的VO)

package com.amker.bean;

public class User {

private int id;

private String username;

private String password;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUserName() {

return username;

}

 public void setUserName(String userName) {

this.username = userName;

}

 public String getPassword() {

return password;

}

 public void setPassword(String password) {

this.password = password;

}

}


userDao.java(对应接口类,定义功能)

package com.amker.dao;

import com.amker.bean.User;

public interface UserDao {

// login

public User login(String username, String password);

// register

public void register(User u);

 // check

public boolean check(String username);

}


userDaoImpl.java(定义接口功能实现类)

package com.amker.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.amker.bean.User;

import com.amker.dao.UserDao;

import com.amker.util.DBUtil;

public class UserDaoImpl implements UserDao{

//register

public void register(User u)

{

String sql="insert into UserTbl(id,username,password)values(?,?,?)";

DBUtil util=new DBUtil();

Connection conn=util.openConnetion();

try {

PreparedStatement pstmt=conn.prepareStatement(sql);

pstmt.setInt(1, u.getId());

pstmt.setString(2,u.getUserName());

pstmt.setString(3,u.getPassword());

pstmt.executeUpdate();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//login

public User login(String username,String password)

{

String sql="select id,username,password from UserTbl where username=? and password=?";

DBUtil util=new DBUtil();

Connection conn=util.openConnetion();

try {

PreparedStatement pstmt=conn.prepareStatement(sql);

pstmt.setString(1, username);

pstmt.setString(2,password);

ResultSet rs=pstmt.executeQuery();

if(rs.next())

{

int id=rs.getInt(1);

User u=new User();

u.setId(id);

u.setUserName(username);

u.setPassword(password);

return u;

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return null;

}

//check

public boolean check(String username)

{

String sql="select id,username,password from UserTbl where username=? ";

DBUtil util=new DBUtil();

Connection conn=util.openConnetion();

try {

PreparedStatement pstmt=conn.prepareStatement(sql);

pstmt.setString(1, username);

ResultSet rs=pstmt.executeQuery();

if(rs.next())

{

return true;

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return false;

} 

}


JUnit测试程序代码

鼠标选定UserDaoImpl.java,右键new other,出现如下的选项,选择JUnit Test Case

点击next:

 

出现如下选项,勾选箭头所指的选项,package中点击Browse选择自己指定的包,我的包不是下面所截图那样,我的是在com.amker.test包里

 

出现如下选项勾选userDaoImpl所有方法,然后点击finnish即可。


可见com.amker.test自动生成UserDaoImplTest.java文件,如下图截图所示:


修改UserDaoImplTest.java文件相关内容后,写相应代码测试UserDaoImpl.java所实现的功能,检查功能是否能正常运行。

 UserDaoImpTest.java

package com.amker.test;

import com.amker.bean.User;

import com.amker.dao.UserDao;

import com.amker.dao.impl.UserDaoImpl;

import junit.framework.TestCase;

public class UserDaoImplTest extends TestCase {

//自动调用并执行

UserDao dao;

public void setUp() throws Exception {

dao=new UserDaoImpl();

}

 //运行结束执行

public void tearDown() throws Exception {

}

public void testRegister() {

User u=new User();

u.setId(3);

u.setUserName("jury");

u.setPassword("789");

dao.register(u);

}

public void testLogin() {

boolean b=dao.check("jury");

System.out.println(b);

}

public void testCheck() {

User u=dao.login("jury","789");

System.out.println(u.getUserName());

}

}

 运行后结果如下,表示测试成功

                                   (一)

                                   (二)

表示测试成功,简单DAO也就这样完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值