您的位置:首页 > 数据库 > MySQL

DAO模式实现MySQL数据库对数据的查询

2014-08-31 23:57 295 查看

1. 前言

  在本人开发的一个系统中需要提供注册和登陆系统,自然需要有用户管理,对用户需要进行基础的增删改查,DAO是常用的设计模式之一,对数据访问进行抽象,可以大大减低不同的数据库之间移植的工作量,本文主要根据本人实现自己DAO模型的过程,讲述DAO设计模式以及本人是如何使用DAO实现对数据的访问的。

2. DAO设计模式

  DAO全程是Data Access Object,是J2EE核心模式之一,主要用于上层应用程序与持久化机制之间的中间层,对于底层的数据库持久化,其各部分关系答题如下:



使用DAO的好处是可以使上下的各个模块相对独立,只要DAO的接口不变化,即使上层的应用代码或者底层的持久层的实现频繁变化,相互之间几乎没有影响。
使用DAO设计模式的时候需要注意的是尽量不要让底层的实现泄露给上层,DAO的核心是DAO接口(interface),DAO由以下几个部分组成:
    DatabaseConnection: 专门负责数据库的打开与关闭的类。
    VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每个VO类的对象都表示表中的一条记录。
    DAO:主要定义操作的接口,定义一系列数据库的原子性操作标准,如增加、修改、删除、插入、按照ID查询等。
    Impl:DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭。
    Proxy:代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。
    Factory:工厂类,通过工厂类取得一个DAO 的实例化对象。

3. 编码实现

    下面我们实现一个对用户进行增删改查的DAO样例,各个包的含义如下:
     ebs.dao.factory: 里面主要存放获取数据库连接实例的工厂类
     ebs.dao.proxy:   DAO的代理实现
     ebs.dao.user:    DAO的实现
     ebs.dbc.DBConnection: 主要存放数据库连接相关的实现类
     ebs.system.vo: 主要存放VO类的实现

     即,如下:
     


数据库表User结构如下:



下面讲解代码的具体实现,DAO模式的核心是DAO接口的设计,首先看一下底层数据库连接的实现:
首先,在IDBConnection.java中实现数据库连接的接口:

package ebs.dbc.DBConnection;

import java.sql.Connection;

public interface IDBConnection {
public Connection getConnection();
public void close() throws Exception;
}


接口可以有多种实现,由于目前我用的是MySQL数据库所以我按照MySQL的API实现对应的数据库连接类,后续移植到Oracle等数据库上的时候只要替换这个类的实现就OK了,上层的应用程序无需修改,因为上层是通过接口IDBConnection来操作数据库连接的。
MySQLDBConnection.java 实现如下:
package ebs.dbc.DBConnection;

import java.sql.Connection;
import java.sql.DriverManager;

public class MySQLDBConnection implements IDBConnection {
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBURL = "jdbc:mysql://localhost:3306/mldn";
public static final String DBUSER = "root";
public static final String DBPASSWD = "root";
private Connection conn = null;

public MySQLDBConnection() throws Exception {
try {
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWD);
} catch (Exception e) {
throw e;
}
}

public Connection getConnection() {
return this.conn;
}

public void close() throws Exception {
if (this.conn != null) {
try {
this.conn.close();
} catch (Exception e) {
throw e;
}
}
}
}


下面是数据库的工厂类,通过工厂类可以获取数据库的连接实例:
DBConnectionFactory.java
package ebs.dao.factory;

import ebs.dbc.DBConnection.MySQLDBConnection;

public class DBConnectionFactory {
private static MySQLDBConnection dbc = null;
public static MySQLDBConnection getDatabaseConnection() throws Exception {
if (dbc == null) {
try {
dbc = new MySQLDBConnection();
} catch (Exception e) {
throw e;
}
}
return dbc;
}
}
上面基本上就是数据库连接实现的全部了,下面要实现用户操作相关的DAO,首先实现VO类User.java:
package ebs.system.vo;

import java.util.Date;

public class User {

private int id;
private String username;
private String nickname;
private String email;
private Date reg_time;
private String passwd;

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 getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getReg_time() {
return reg_time;
}
public void setReg_time(Date reg_time) {
this.reg_time = reg_time;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}


下面要定义的就是DAO的核心,DAO接口,要设计好自己打算在DAO中提供哪些服务, IUserDAO.java:
package ebs.dao.user;

import java.util.List;

import ebs.system.vo.User;

public interface IUserDAO {

public boolean doCreate(User user) throws Exception;

public boolean doDelete(int id) throws Exception;

public boolean doModify(User user) throws Exception;

public List<User> findAll(String keyWord) throws Exception;

public User findById(int id) throws Exception;
}


下面实现这个接口, UserDAOImpl.java:
package ebs.dao.user;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import ebs.system.vo.User;

public class UserDAOImpl implements IUserDAO {

private Connection conn = null;
private PreparedStatement pstmt = null;

public UserDAOImpl(Connection conn) {
this.conn = conn;
}

@Override
public boolean doCreate(User user) throws Exception {
boolean flag = false;
String sql = "INSERT INTO user(username, nickname, email, reg_time, passwd) VALUES(?, ?, ?, ?, ?);";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1, user.getUsername());
this.pstmt.setString(2, user.getNickname());
this.pstmt.setString(3, user.getEmail());
this.pstmt.setDate(4, new java.sql.Date(System.currentTimeMillis()));
this.pstmt.setString(5, user.getPasswd());
if (this.pstmt.executeUpdate() > 0) {
flag = true;
}
this.pstmt.close();
return flag;
}

@Override
public boolean doDelete(int id) throws Exception {
boolean flag = false;
String sql = "DELETE FROM user WHERE id=?";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setInt(1, id);
if (this.pstmt.executeUpdate(sql) > 0) {
flag = true;
}
this.pstmt.close();
return flag;
}

@Override
public boolean doModify(User user) throws Exception {
boolean flag = false;
String sql = "UPDATE USER SET username=?, nickname=?, email=?, passwd=? WHERE id=?;";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1, user.getUsername());
this.pstmt.setString(2, user.getNickname());
this.pstmt.setString(3, user.getEmail());
this.pstmt.setString(4, user.getPasswd());
this.pstmt.setInt(5, user.getId());
if(this.pstmt.executeUpdate(sql) > 0) {
flag = true;
}
this.pstmt.close();
return flag;
}

@Override
public List<User> findAll(String keyWord) throws Exception {
List<User> userlist = new ArrayList<User>();
String sql = "SELECT username, nickna
a788
me, email, reg_time, passwd FROM user WHERE username LIKE ? OR nickname LIKE ?;";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1, keyWord);
this.pstmt.setString(2, keyWord);
ResultSet rs = this.pstmt.executeQuery(sql);
User user = null;
while(rs.next()) {
user = new User();
user.setUsername(rs.getString(1));
user.setNickname(rs.getString(2));
user.setEmail(rs.getString(3));
user.setReg_time(rs.getDate(4));
user.setPasswd(rs.getString(5));
userlist.add(user);
}
this.pstmt.close();
return userlist;
}

@Override
public User findById(int id) throws Exception {
User user = null;
String sql = "SELECT username, nickname, email, reg_time, passwd FROM user WHERE id=?;";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setInt(1, id);
ResultSet rs = this.pstmt.executeQuery(sql);
if(rs.next()) {
user.setUsername(rs.getString(1));
user.setNickname(rs.getString(2));
user.setEmail(rs.getString(3));
user.setReg_time(rs.getDate(4));
user.setPasswd(rs.getString(5));
}
this.pstmt.close();
return user;
}

}


下面是DAO的代理类的实现,代理类其实是包装了DAO的真实实现类,UserDAOProxy.java:
package ebs.dao.proxy;

import java.util.List;

import ebs.dao.factory.DBConnectionFactory;
import ebs.dao.user.IUserDAO;
import ebs.dao.user.UserDAOImpl;
import ebs.dbc.DBConnection.IDBConnection;
import ebs.system.vo.User;

public class UserDAOProxy implements IUserDAO {

private <strong>IDBConnection</strong> dbc = null;
private <strong>IUserDAO</strong> user = null;
public UserDAOProxy() throws Exception {
this.dbc = (IDBConnection)DBConnectionFactory.getDatabaseConnection();
this.user = new UserDAOImpl(dbc.getConnection());
}

@Override
public boolean doCreate(User user) throws Exception {
boolean flag = false;
try {
flag = this.user.doCreate(user);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return flag;
}

@Override
public boolean doDelete(int id) throws Exception {
boolean flag = false;
try {
flag = this.user.doDelete(id);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return flag;
}

@Override
public boolean doModify(User user) throws Exception {
boolean flag = false;
try {
flag = this.user.doModify(user);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return flag;
}

@Override
public List<User> findAll(String keyWord) throws Exception {
List<User> userlist = null;
try {
userlist = this.user.findAll(keyWord);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return userlist;
}

@Override
public User findById(int id) throws Exception {
User user = null;
try {
user = this.user.findById(id);
} catch (Exception e) {
throw e;
} finally {
this.dbc.close();
}
return null;
}
}
这类需要仔细查看的是DAO是如何获取数据库连接的,以及如何获取DAO的真实实现的实例的。

4. 参考资料

    1. http://www.oracle.com/technetwork/java/dataaccessobject-138824.html
    2.
《Java Web开发实战经典》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JSP DAO JAVA
相关文章推荐