一、DAO介绍
l DAO(数据访问对象)的主要功能是数据操作;
l 使用DAO设计模式,来封装数据库持久层的所有操作,使得低级的数据逻辑和高级的业务逻辑分离,达到解耦合的目的了;
l 在程序开发的结构中属于数据层的操作;
l 程序开发的标准架构如下:
l 客户层、显示层、业务层和数据层分别介绍如下:
(1)客户层:现在都采用B/S开发架构,一般用户都使用浏览器进行访问,当然也可以采用其他程序进行访问;
(2)显示层:使用JSP/Servlet进行页面效果的显示;
(3)业务层(Business Object,业务对象):会将多个原子性的DAO操作进行组合,组合城一个完整的业务逻辑;
(4)数据层(DAO):提供多个原子性的DAO操作,如增加、修改、删除等,都属于原子性操作;
l DAO层就是编写一些具体的操作代码;
l 对于业务关联较多的系统,BO才会发挥作用;
l 如果业务操作相对简单,可以不使用BO,而完全通过DAO完成操作;
l 整个DAO中,实际上是以接口为操作标准,即客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现;
l 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也就这样完成了。