JDBC(七) DAO设计模式

原创 2016年08月31日 00:26:07

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。

版权声明:本文为博主原创文章,未经博主允许不得转载。

jdbc之二:DAO模式

1、创建Dao接口。 package com.ljh.jasonnews.server.dao; import java.sql.Connection; public interface Dao ...
  • jediael_lu
  • jediael_lu
  • 2014年04月29日 15:13
  • 6437

JDBC_Dao工厂模式

我们写一个程序来模拟上层对数据的操作: public class UserDaoTest {  public static void main(String[] args) {   UserDa...
  • u014792323
  • u014792323
  • 2014年04月18日 23:18
  • 578

DAO设计模式简介

DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。 数据开发结构: 资源层是数据库的操作层,里面可以进行...
  • thystar
  • thystar
  • 2014年12月07日 12:57
  • 2986

JDBC数据库访问、DAO理解

JDBC是java程序访问数据库的标准,他是由一组java语言编写的类和接口组成,这些类和接口叫做JDBC API,它为java程序提供了一种通用的数据访问接口,使用JDBC API可以访问任何的数据...
  • jijiaxin1989
  • jijiaxin1989
  • 2015年01月24日 22:36
  • 2161

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

系列文章并非本人原创。 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.h...
  • li12412414
  • li12412414
  • 2016年07月29日 09:53
  • 1240

Jdbc与Dao和Javabean的区别

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口...
  • wangxs_ooo
  • wangxs_ooo
  • 2017年01月03日 14:58
  • 2377

J2EE之DAO设计模式及简单实现

JAVAEE(Java Enterprise Edition ) 模式 : DAO模式 因此在了解DAO模式之前,我们先来学习一下Java EE的体系结构: (一)JavaEE体系结构 客户端:...
  • Megustas_JJC
  • Megustas_JJC
  • 2016年12月21日 15:59
  • 632

J2EE规范jdbc使用到的设计模式

1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访...
  • Mark2When
  • Mark2When
  • 2016年12月27日 15:10
  • 699

Java通过JDBC 进行Dao层的封装

前言前面有一章节,我专门讲解了Java通过JDBC 进行MySQL数据库操作,这主要讲解了MaySQL数据库的连接和简单的操作,但是在真正的java项目中,我们要不断的和数据库打交道,为了提高数据库操...
  • ToBeTheEnder
  • ToBeTheEnder
  • 2016年10月16日 23:50
  • 5683

MVC+DAO设计模式下的设计流程

这里总结一下MVC+DAO的设计流程。通过MVC+DAO的设计模式,可以使项目在设计过程中结构更为明晰,并且能够方便的进行修改。MVC是一个分层模型,即模型、视图、控制器。DAO是一个数据库访问模型,...
  • tao_sun
  • tao_sun
  • 2014年02月12日 17:55
  • 3084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDBC(七) DAO设计模式
举报原因:
原因补充:

(最多只允许输入30个字)