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.html2.
《Java Web开发实战经典》
相关文章推荐
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- java实现连接mysql数据库单元测试查询数据项目分享
- java Web连接MySQL数据库工具类 实现分组查询取组最后一条数据