关闭

JDBC(七) DAO设计模式

标签: javadaoDAO层
387人阅读 评论(0) 收藏 举报
分类:

DAO设计模式概念

在Java web开发中,使用jsp+Javabean模式来开发web应用,程序对数据操作和访问是直接使用jdbc技术,在jsp页面嵌入大量的java代码来访问数据库,这样页面显示代码和java代码混合在一起是的代码变得难以维护,同时,代码大量重复,复用率低下。更好的做法是,在web前段,只关心数据如何显示,而不关心数据从何而来,数据的访问应该由数据层来统一完后,即是DAO,使用DAO设计模式能够很好的解决上述问题。

DAO设计模式抽象和封装了对关系型数据库的访问,DAO层负责管理数据库连接,对数据的存储做控制,使得开发者从关系型数据库中解放出来,以面向对象的思维来操作数据。

DAO层的组成部分

DAO层主要由数据库连接类,Model类,DAO接口,DAO实现类,DAO工厂类五个部分组成。

  1. 数据库连接类。数据库连接类主要负责获得数据库连接和释放数据库链接。
  2. Model类。一个Model类和数据库中的一张数据表对应,Model类的属性与数据表的列对应,也就是说一个Model类的实例和数据的一行相对应。
  3. DAO接口。DAO接口中定义了所有操作数据库的方法,包括CRUD等。在DAO的实现类中应该给出相应的实现。
  4. DAO实现类。DAO实现类即是对DAO接口中所有方法的实现,包含了对对应数据表的所有操作,同时也可以理解为从二维表格到对象的封装。
  5. DAO工厂类,工厂类主要负责创建并返回DAO实现类,控制返回的实现类是哪一个,是的客户代码无需关心使用的是哪一个实现类(只需要使用接口中的方法即可)。这样使得客户代码无需关心具体的实现类,有利于维护和扩展。

DAO设计模式实例

这里设计一个DAO层的访问,数据库连接管理采用c3p0数据库连接池。

数据库信息:
这里写图片描述
数据库链接类(JDBCUtils.java):

package com.aaa.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 获取数据库连接和示范数据库资源的类
 * 
 * @author tuxianchao
 *
 */
public class JDBCUtils {
    private static ComboPooledDataSource comboPooledDataSource = null;
    static {
        try {
            InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("c3p0-config.xml");
            Properties properties = new Properties();
            properties.load(inputStream);
            comboPooledDataSource = new ComboPooledDataSource("mysql");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * 
     * @return
     */
    public static Connection getConnection() {
        try {
            return comboPooledDataSource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public static void releaseDB(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {

        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

Model类(User.java):

package com.aaa.model;

import java.sql.Date;

/**
 * 模型设计。对应属数据库中的表,属性和数据库中的字段一一对应。
 * 
 * @author tuxianchao
 *
 */
public class User {

    private int userId;
    private String userName;
    private String userPassword;
    private Date userBirth;

    public User() {

    }

    public User(int userId, String userName, String userPassword, Date userBirth) {

        this.userId = userId;
        this.userName = userName;
        this.userPassword = userPassword;
        this.userBirth = userBirth;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public Date getUserBirth() {
        return userBirth;
    }

    public void setUserBirth(Date userBirth) {
        this.userBirth = userBirth;
    }

    @Override
    public String toString() {
        return "User [userId=" + userId + ", userName=" + userName + ", userPassword=" + userPassword + ", userBirth="
                + userBirth + "]";
    }

}

DAO(UserDAO.java):

package com.aaa.dao;

import java.util.List;

import com.aaa.model.User;

/**
 * UserDAO接口,定义了CRUD等数据操作
 * 
 * @author tuxianchao
 *
 */
public interface UserDAO {
    public int insert(User user);

    public int update(User user);

    public int delete(int userId);

    public User queryById(int userId);

    public List<User> queryAll();

}

DAO实现类(UserDAOImpl.java):

package com.aaa.dao.impl;

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

import com.aaa.dao.UserDAO;
import com.aaa.model.User;
import com.aaa.utils.JDBCUtils;

public class UserDAOImpl implements UserDAO {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;

    @Override
    public int insert(User user) {
        // TODO Auto-generated method stub
        int row = 0;// 影响的行数,返回0表示插入失败,返回1表示插入成功
        try {
            connection = JDBCUtils.getConnection();
            String sql = "INSERT INTO user VALUES(?,?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1, user.getUserId());
            preparedStatement.setObject(2, user.getUserName());
            preparedStatement.setObject(3, user.getUserPassword());
            preparedStatement.setObject(4, user.getUserBirth());
            row = preparedStatement.executeUpdate();

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return row;
    }

    @Override
    public int update(User user) {
        // TODO Auto-generated method stub
        int row = 0;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "UPDATE user SET user_name = ?, user_password = ?, user_birth = ? WHERE user_id = ?";
            preparedStatement = connection.prepareStatement(sql);

            preparedStatement.setObject(1, user.getUserName());
            preparedStatement.setObject(2, user.getUserPassword());
            preparedStatement.setObject(3, user.getUserBirth());
            preparedStatement.setObject(4, user.getUserId());

            row = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return row;
    }

    @Override
    public int delete(int userId) {
        // TODO Auto-generated method stub
        int row = 0;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "DELETE FROM user WHERE user_id =?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1, userId);
            row = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return row;
    }

    @Override
    public User queryById(int userId) {
        User user = new User();
        // TODO Auto-generated method stub
        try {
            connection = JDBCUtils.getConnection();
            String sql = "SELECT * FROM user WHERE user_id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1, userId);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                user.setUserId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setUserPassword(resultSet.getString(3));
                user.setUserBirth(resultSet.getDate(4));
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return user;
    }

    @Override
    public List<User> queryAll() {
        List<User> users = new ArrayList<>();
        User user = null;
        // TODO Auto-generated method stub
        try {
            connection = JDBCUtils.getConnection();
            String sql = "SELECT * FROM user";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                user = new User();
                user.setUserId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setUserPassword(resultSet.getString(3));
                user.setUserBirth(resultSet.getDate(4));
                users.add(user);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return users;
    }

}

DAO工厂类(DAOFactory.java):

package com.aaa.dao;

import com.aaa.dao.impl.UserDAOImpl;

/**
 * DAO工厂类
 * 
 * @author tuxianchao
 *
 */
public class DAOFactory {
    public static UserDAO getUserDAOInstance() {
        return new UserDAOImpl();
    }
}

总结:在本实例中,创建了对应数据表的User.java,在DAO接口中定义了基本的方法,在DAO的实现类中给出了对应的方法,在DAO工厂类中,返回对应实现类的实例,可以这样创建一个DAO:UserDAO userDao = DAOFactory.getUserDAOInstance(); 然后总结调用接口中的方法,而不需要关心接口的具体的实现类,这也大概是使用接口的好好处吧。对于使用工厂类来生产对应的DAO实现类,这样的好处是,当添加其他的xxxDAO的时候,只需要增加一个返回对应的xxxDAO即可,这样可以统一的使用DAOFactory来获取xxxDAO。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32459次
    • 积分:1633
    • 等级:
    • 排名:千里之外
    • 原创:138篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    联系我
    wechat:tuxianchao_