JSP详细DAO设计模式及应用(!)



JSP详细DAO设计模式及应用(!)

原文地址:http://just-do-myself.iteye.com/blog/655227

 

DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作。

一、为什么要用DAO?

比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的HTML代码和JSP代码,将显示和功能代码混在一起,难以维护。并且在JSP页面中使用JDBC代码,必须导入相应的”Java.sql.*”包。基于使得JSP页面专注于数据的表现的思想,我们只是希望JSP主要负责数据的显示,而不需要关注数据的来源和途径。同时在JSP进行JDBC操作,重复编码太多。如,不同的页面连接同一个数据库时需要在每个页面中都进行JDBC编码。

DAO设计模式提供了一种通用的模式,来简化大量的代码,增强程序的可移植性。

 

二、DAO组成

DAO由5个重要部分组成:数据库连接类、VO、DAO接口、DAO实现类和DAO工厂类。

 

 

1、数据库连接类(DBConn):一个Java类。负责与后台数据库进行连接。提供了至少三个方法:

构造方法 public DBConn():进行数据库连接,得到一个Connection对象。

返回数据库连接Connection的public Connection getConnection():提供一个外部获取连接的方法,返回一个Connection对象。

关闭数据库连接public void close():关闭数据库连接,Connection对象调用close方法。。

 

在JDBC中,进行数据库连接需要四个参数:数据库驱动类DBDriver、数据库连接URL、用户名、密码。注意需要在项目的构建路径下放入相应的数据库连接驱动软件包。

 

例:连接MySQL数据库下的JavaWeb数据库,用户名为root、密码为admin。

DataBaseConnection.java

 

 

Java代码  收藏代码
  1. package db;
  2. import java.sql.* ;
  3. // 主要功能就是连接数据库、关闭数据库
  4. public class DataBaseConnection{
  5.     //定义数据库驱动类
  6.     private final String DBDRIVER = ”com.mysql.jdbc.Driver” ;
  7.     //定义数据库连接URL
  8.     private final String DBURL = ”jdbc:mysql://localhost:3306/javaweb” ;
  9.     //定义数据库连接用户名
  10.     private final String DBUSER = ”root” ;
  11.     //定义数据库连接密码
  12.     private final String DBPASSWORD = ”admin” ;
  13.     //定义数据库连接对象
  14.     private Connection conn = null ;
  15.     //构造方法,加载驱动
  16.     public DataBaseConnection(){
  17.         try{
  18.             Class.forName(DBDRIVER) ;
  19.             this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
  20.         }
  21.         catch (Exception e){
  22.             System.out.println(“加载驱动失败”);
  23.         }
  24.     }
  25.     // 取得数据库连接
  26.     public Connection getConnection(){
  27.         return conn ;
  28.     }
  29.     // 关闭数据库连接
  30.     public void close(){
  31.         try{
  32.             conn.close() ;
  33.         }catch (Exception e){
  34.             System.out.println(“数据库连接关闭失败”);
  35.         }
  36.     }
  37. }

 

 

 

 

同样,需要在项目的构建路径下放入MySQL的JDBC数据库驱动包:mysql-connector-java.jar.在附件中已上传了相应Jar包。

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

2、VO(Value Objects)值对象:与数据库表一一对应的Java类。含有与数据库表字段一一对应的属性,相应属性的getter和setter方法。甚至还有一些验证方法。VO提供了一个面向对象的方法来操作数据库。以后我们的DAO接口就是通过调用VO来进行数据库操作的。

例:对应于数据库表T_User:三个字段,id、username、password。相应的VO类

User.java

Java代码  收藏代码
  1. package db;
  2. public class User {
  3.     //用户id
  4.     private int userid;
  5.     //用户姓名
  6.     private String username;
  7.     //用户密码
  8.     private String password;
  9.     //获得用户id
  10.     public int getUserid(){
  11.         return userid;
  12.     }
  13.     //设置用户id
  14.     public void setUserid(int userid){
  15.         this.userid = userid;
  16.     }
  17.     //获得用户名
  18.     public String getUsername() {
  19.         return username;
  20.     }
  21.     //设置用户名
  22.     public void setUsername(String username) {
  23.         this.username = username;
  24.     }
  25.     //获得用户密码
  26.     public String getPassword() {
  27.         return password;
  28.     }
  29.     //设置用户密码
  30.     public void setPassword(String password) {
  31.         this.password = password;
  32.     }
  33. }

 

 

3、DAO接口:定义了所有的用户的操作,如添加记录、删除记录和查询记录等。这不是一个具体的实现类,而是一个接口,仅仅定义了相应的操作(方法),这是给后来的具体实现提供一种灵活性和易维护性。具体的实现需要具体实现类实现这个接口的方法来实现。

例:对上面的T_User表进行CRUD操作。

UserDAO.java

Java代码  收藏代码
  1. package db ;
  2. import java.util.* ;
  3. // 定义数据库操作方法
  4. public interface UserDAO{
  5.     // 增加操作
  6.     public void insert(User user) throws Exception ;
  7.     // 修改操作
  8.     public void update(User user) throws Exception ;
  9.     // 删除操作
  10.     public void delete(int userid) throws Exception ;
  11.     // 按ID查询操作
  12.     public User queryById(int userid) throws Exception ;
  13.     // 查询全部
  14.     public List queryAll() throws Exception ;
  15. }

 

4、DAO实现类:这里才是具体的操作的实现。需要实现DAO接口以及相应的方法。

同样,一个DAO接口可以由多个实现。例如,上例中的可以有Mysql数据库来实现,也可以使用Oracle数据库来实现。

同理,也可以是对同一数据库的不同实现。

例:DAO的Mysql实现。

UserDAOImpl.java

Java代码  收藏代码
  1. package db;
  2. import java.sql.PreparedStatement;
  3. import java.sql.ResultSet;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import com.javaweb.ch08.Person;
  7. public class UserDAOImpl implements UserDAO {
  8.     //添加操作
  9.     public void insert(User user) throws Exception {
  10.         String sql = ”INSERT INTO user(username,password) VALUES(?,?)” ;
  11.         PreparedStatement pstmt = null ;
  12.         DataBaseConnection dbc = null ;
  13.         // 下面是针对数据库的具体操作
  14.         try{
  15.             // 连接数据库
  16.             dbc = new DataBaseConnection() ;
  17.             pstmt = dbc.getConnection().prepareStatement(sql) ;
  18.             pstmt.setString(1, user.getUsername());
  19.             pstmt.setString(2, user.getPassword());
  20.             // 进行数据库更新操作
  21.             pstmt.executeUpdate() ;
  22.             pstmt.close() ;
  23.         }catch (Exception e){
  24.             throw new Exception(“操作出现异常”) ;
  25.         }
  26.         finally{
  27.             // 关闭数据库连接
  28.             dbc.close() ;
  29.         }
  30.     }
  31.     //修改操作
  32.     public void update(User user) throws Exception {
  33.         String sql = ”UPDATE user SET username=?,password=? WHERE userid=?” ;
  34.         PreparedStatement pstmt = null ;
  35.         DataBaseConnection dbc = null ;
  36.         // 下面是针对数据库的具体操作
  37.         try{
  38.             // 连接数据库
  39.             dbc = new DataBaseConnection() ;
  40.             pstmt = dbc.getConnection().prepareStatement(sql) ;
  41.             pstmt.setString(1, user.getUsername());
  42.             pstmt.setString(2, user.getPassword());
  43.             pstmt.setInt(3,user.getUserid());
  44.             // 进行数据库更新操作
  45.             pstmt.executeUpdate() ;
  46.             pstmt.close() ;
  47.         }
  48.         catch (Exception e){
  49.             throw new Exception(“操作出现异常”) ;
  50.         }
  51.         finally{
  52.             // 关闭数据库连接
  53.             dbc.close() ;
  54.         }
  55.     }
  56.     //删除操作
  57.     public void delete(int userid) throws Exception {
  58.         String sql = ”DELETE FROM user WHERE userid=?” ;
  59.         PreparedStatement pstmt = null ;
  60.         DataBaseConnection dbc = null ;
  61.         // 下面是针对数据库的具体操作
  62.         try{
  63.             // 连接数据库
  64.             dbc = new DataBaseConnection() ;
  65.             pstmt = dbc.getConnection().prepareStatement(sql) ;
  66.             pstmt.setInt(1,userid) ;
  67.             // 进行数据库更新操作
  68.             pstmt.executeUpdate() ;
  69.             pstmt.close() ;
  70.         }catch (Exception e){
  71.             throw new Exception(“操作出现异常”) ;
  72.         }
  73.         finally{
  74.             // 关闭数据库连接
  75.             dbc.close() ;
  76.         }
  77.     }
  78.     //按ID查询
  79.     public User queryById(int userid) throws Exception {
  80.         User user = null ;
  81.         String sql = ”SELECT * FROM user WHERE userid=?” ;
  82.         PreparedStatement pstmt = null ;
  83.         DataBaseConnection dbc = null ;
  84.         // 下面是针对数据库的具体操作
  85.         try{
  86.             // 连接数据库
  87.             dbc = new DataBaseConnection() ;
  88.             pstmt = dbc.getConnection().prepareStatement(sql) ;
  89.             pstmt.setInt(1, userid);
  90.             // 进行数据库查询操作
  91.             ResultSet rs = pstmt.executeQuery() ;
  92.             if(rs.next())
  93.             {
  94.                 // 查询出内容,之后将查询出的内容赋值给user对象
  95.                 user = new User() ;
  96.                 user.setUserid(rs.getInt(1));
  97.                 user.setUsername(rs.getString(2));
  98.                 user.setPassword(rs.getString(3));
  99.             }
  100.             rs.close() ;
  101.             pstmt.close() ;
  102.         }catch (Exception e){
  103.             throw new Exception(“操作出现异常”) ;
  104.         }
  105.         finally{
  106.             // 关闭数据库连接
  107.             dbc.close() ;
  108.         }
  109.         return user ;
  110.     }
  111.     public List<User> queryAll() throws Exception {
  112.         List<User> all = new ArrayList<User>() ;
  113.         String sql = ”SELECT * FROM user ” ;
  114.         PreparedStatement pstmt = null ;
  115.         DataBaseConnection dbc = null ;
  116.         // 下面是针对数据库的具体操作
  117.         try{
  118.             // 连接数据库
  119.             dbc = new DataBaseConnection() ;
  120.             pstmt = dbc.getConnection().prepareStatement(sql) ;
  121.             // 进行数据库查询操作
  122.             ResultSet rs = pstmt.executeQuery() ;
  123.             while(rs.next()){
  124.                 // 查询出内容,之后将查询出的内容赋值给user对象
  125.                 User user = new User() ;
  126.                 user.setUserid(rs.getInt(1));
  127.                 user.setUsername(rs.getString(2));
  128.                 user.setPassword(rs.getString(3));
  129.                 // 将查询出来的数据加入到List对象之中
  130.                 all.add(user) ;
  131.             }
  132.             rs.close() ;
  133.             pstmt.close() ;
  134.         }
  135.         catch (Exception e){
  136.             throw new Exception(“操作出现异常”) ;
  137.         }
  138.         finally{
  139.             // 关闭数据库连接
  140.             dbc.close() ;
  141.         }
  142.         return all ;
  143.     }
  144. }

5、DAO工厂类:在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库的操作。这时要求必须知道具体的实现子类,对于后期的修改十分不便。如后期需要创建一个该DAO接口的oracle实现类。这时就必须修改所有使用DAO实现类的代码。如果使用DAO工厂类的一个静态方法(不需要创建对象即可调用)来获取DAO实现类实例,这时替换DAO实现类,只需修改DAO工厂类中的方法代码,而不需要修改所有的调用DAO实现的代码。

DAO工厂类是一个单例模式,这样避免的数据库的不一致。

例:通过DAO工厂类来获取具体的DAO实现类。

DAOFactory.java

Java代码  收藏代码
  1. package db;
  2. public class DAOFactory{
  3.     public static UserDAO getUserDAOInstance(){
  4.         return new UserDAOImpl() ;
  5.     }
  6. }

这里若改变为Oracle实现类UserDAOOracleImpl来实现DAO,只需在DAOFactory中修改

Java代码  收藏代码
  1. package db;
  2. public class DAOFactory{
  3.     public static UserDAO getUserDAOInstance(){
  4.         <span style=”background-color: #ff0000;”>return new UserDAOOracleImpl()</span> ;
  5.     }
  6. }

 

有了上面五个部分,就可以通过DAO工厂类获取DAO实现类实例。通过调用DAO实现类实例中的方法就可以完成相应的数据库的CRUD操作。

 

三、表示层调用通过DAO工厂类获取DAO实现类实例的方法完成相应的操作。

1、添加记录:AddUserDemo.jsp

Jsp代码  收藏代码
  1. <%@ page language=”java” contentType=”text/html;charset=gb2312″%>
  2. <%@ page import=”db.*”%>
  3. <html>
  4. <head>
  5.     <title>添加用户记录</title>
  6. </head>
  7. <body>
  8.     <%
  9.         //通过DAO工厂获得DAO实现类实例
  10.         UserDAO userDAO = DAOFactory.getUserDAOInstance();
  11.         //设置需要添加的用户
  12.         User user = new User();
  13.         user.setUsername(“dao”);
  14.         user.setPassword(“123″);
  15.         userDAO.insert(user);
  16.     %>
  17. </body>
  18. </html>

 

2、更新记录:UpdateUserDemo.jsp

 

Jsp代码  收藏代码
  1. <%@ page language=”java” contentType=”text/html;charset=gb2312″%>
  2. <%@ page import=”db.*”%>
  3. <html>
  4. <head>
  5.     <title>更新用户记录</title>
  6. </head>
  7. <body>
  8.     <%
  9.         //通过DAO工厂获得DAO实现类实例
  10.         UserDAO userDAO = DAOFactory.getUserDAOInstance();
  11.         //设置需要更新的用户
  12.         User user = new User();
  13.         user.setUserid(10);
  14.         user.setUsername(“dao”);
  15.         user.setPassword(“123456″);
  16.         //执行更新操作
  17.         userDAO.update(user);
  18.     %>
  19. </body>
  20. </html>

 

3、删除记录:DeleteUserDemo.jsp

Jsp代码  收藏代码
  1. <%@ page language=”java” contentType=”text/html;charset=gb2312″%>
  2. <%@ page import=”db.*”%>
  3. <html>
  4. <head>
  5.     <title>删除用户记录</title>
  6. </head>
  7. <body>
  8.     <%
  9.         //通过DAO工厂获得DAO实现类实例
  10.         UserDAO userDAO = DAOFactory.getUserDAOInstance();
  11.         //执行删除操作
  12.         userDAO.delete(10);
  13.     %>
  14. </body>
  15. </html>

 

4、按ID查询记录:QueryByIdDemo.jsp

Jsp代码  收藏代码
  1. <%@ page language=”java” contentType=”text/html;charset=gb2312″%>
  2. <%@ page import=”db.*”%>
  3. <html>
  4. <head>
  5.     <title>按ID查询记录</title>
  6. </head>
  7. <body>
  8.     <%
  9.         //通过DAO工厂获得DAO实现类实例
  10.         UserDAO userDAO = DAOFactory.getUserDAOInstance();
  11.         //指定按ID查询
  12.         User user = userDAO.queryById(2);
  13.         out.println(“用户名:” + user.getUsername() + ”<br>”);
  14.         out.println(“密码:” + user.getPassword());
  15.     %>
  16. </body>
  17. </html>

 

5、查询所有记录:QueryAllUserDemo.jsp

Jsp代码  收藏代码
  1. <%@ page language=”java” contentType=”text/html;charset=gb2312″%>
  2. <%@ page import=”db.*”%>
  3. <%@ page import=”java.util.*”%>
  4. <html>
  5. <head>
  6.     <title>查询所有记录</title>
  7. </head>
  8. <body>
  9.     <%
  10.         //通过DAO工厂获得DAO实现类实例
  11.         UserDAO userDAO = DAOFactory.getUserDAOInstance();
  12.         //查询所有用户
  13.         List<User> all = userDAO.queryAll();
  14.         Iterator<User> iter = all.iterator();
  15.         //遍历输出所有用户信息
  16.         while(iter.hasNext()) {
  17.             User user = iter.next();
  18.             out.println(“用户名:” + user.getUsername());
  19.             out.println(“,密码:” + user.getPassword() + ”<br>”);
  20.         }
  21.     %>
  22. </body>
  23. </html>