JDBC--DAO设计模式

1、DAO(Data Access Object):访问数据信息的类,包含对数据的CRUD(Create、Read、Update、Delete),而不包含任何业务相关的信息。

--DAO能够实现功能的模块化;

--有利于代码的维护和升级。

2、DAO中常用的方法:

--1)int update(String sql, Object ... args); //执行更新操作,返回受影响的行数,包括INSERT、UPDATE、DELETE操作。

--2)<T> T get(Class<T> clazz, String sql, Object ... args); //查询一条记录,返回对应的对象。

--3)<T> List<T> getForList(Class<T> clazz, String sql, Objeect ... args); // 查询多条记录,返回对应的对象列表。

--4)<E> E getForValue(String sql, Object ... args); //返回某条记录的某一个字段的值或一个统计的记录数。

3、实现:

public class DAO {
    public int update(String sql, Object ... args){
        Connection conn = null;
        PreparedStatement ps = null;
        int rowNum = 0;
        try{
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < args.length; i++){
                ps.setObject(i + 1, args[i]);
            }

            rowNum = ps.executeUpdate();
            return rowNum;
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, ps, null);
        }
        return rowNum;
    }

    public <T> T get(Class<T> clazz, String sql, Object ...args){
        T entity = null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < args.length; i++){
                ps.setObject(i + 1, args[i]);
            }

            rs = ps.executeQuery();
            Map<String, Object> map = new HashMap<String, Object>();
            List<String> columnLabels = getColumnLabels(rs);

            if(rs.next()){
                for(String columnLabel : columnLabels){
                    Object columnValue = rs.getObject(columnLabel);
                    map.put(columnLabel, columnValue);
                }
            }

            if(map.size() > 0){
                entity = clazz.newInstance();
                for(Map.Entry<String, Object> entry : map.entrySet()){
                    String fieldName = entry.getKey();
                    Object value = entry.getValue();
                    //使用BeanUtils工具类来为属性赋值
                    BeanUtils.setProperty(entity, fieldName, value);
                    /**使用反射的方式为属性赋值
                    Field field = clazz.getDeclaredField(key);
                    field.setAccessible(true);
                    field.set(entity, value);*/
                }
                return entity;
            }

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, ps, rs);
        }
        return entity;
    }

    public <T> List<T> getForList(Class<T> clazz, String sql, Object ... args){
        List<T> list = new ArrayList<>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < args.length; i++){
                ps.setObject(i + 1, args[i]);
            }

            rs = ps.executeQuery();
            /**
             * 将得到的ResultSet结果集转换为Map<String, Object>列表,
             * 其中key值为rs表的别名,value值为对应别名的值
             */
            List<Map<String, Object>> data = handleResultSetToMapList(rs);

            /**
             * 将MapList转换为对应的BeanList
             */
            list = transferMapListToBeanList(clazz, data);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, ps, rs);
        }
        return list;
    }

    private <T> List<T> transferMapListToBeanList(Class<T> clazz,List<Map<String, Object>> data) throws Exception {
        List<T> list = new ArrayList<>();
        if(data.size() > 0){
            for(Map<String, Object> map : data){
                T entity = clazz.newInstance();
                for(Map.Entry<String, Object> entry : map.entrySet()){
                    String fieldName = entry.getKey();
                    Object value = entry.getValue();

                    BeanUtils.setProperty(entity, fieldName, value);;
                }
                list.add(entity);
            }
        }
        return list;
    }

    public static <E> E getForValue(String sql, Object ... args){
        E entity = null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < args.length; i++){
                ps.setObject(i + 1, args[i]);
            }

            rs = ps.executeQuery();

            if(rs.next()){
                return (E)rs.getObject(1);
            }

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, ps, rs);
        }
        return entity;
    }

    /**
     * 将获取到的结果集处理成MapList
     * @param rs
     * @return
     * @throws Exception
     */
    private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs)
            throws Exception {
        List<String> columnLabels = getColumnLabels(rs);
        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
        while(rs.next()){
            Map<String, Object> map = new HashMap<String, Object>();
            for(String columnLabel : columnLabels){
                Object columnValue = rs.getObject(columnLabel);
                map.put(columnLabel, columnValue);
            }
            data.add(map);
        }
        return data;
    }

    /**
     * 根据结果集获取所有列的别名
     * @param rs
     * @return
     * @throws Exception
     */
    private List<String> getColumnLabels(ResultSet rs) throws Exception{
        List<String> list = new ArrayList<>();
        ResultSetMetaData rsmd = rs.getMetaData();
        for(int i = 0; i < rsmd.getColumnCount(); i++){
            list.add(rsmd.getColumnLabel(i + 1));
        }
        return list;
    }
}
时间: 2024-10-14 19:44:34

JDBC--DAO设计模式的相关文章

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja

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

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.html 联系方式:[email protected] [正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据

jsp DAO设计模式

DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作. 一.为什么要用DAO? 比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的HTML代码和JSP代码,将显示和功能代码混在一起,难以维护.并且在JSP页面中使用JDBC代码,必须导入相应的"java.sql.*"包.基于使得JSP页面专注于数据的表现的思想,我们只是希望JSP主要负责数据的显示,而不需要关注数据的来源和途径.同时在JSP进行JDBC操作,重复编码太

JavaBean在DAO设计模式简介

一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,添加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于訪问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几

JavaBean中DAO设计模式介绍

一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,增加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于访问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几个

JavaWeb技术(二):DAO设计模式

1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DAO实现组件:DAO接口 + DAO接口的实现类 3. 事例代码 1)javabean组件:用于数据传输的对象 /** javabean数据传输对象 */ public class Customer { // 和数据库中的表是对应的 private int id; private String nam

DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据库连接类,VO类,DAO接口,DAO实现类以及DAO工厂类.   2-1 数据库连接类:    数据库连接类的主要功能就是连接数据库并获得连接对象,以及关闭数据库.通过数据库连接类可以大大地简化开发,在需要进行数据库连接时,只需要创建该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库而

Java学习之DAO设计模式

DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据传递对象(DTO)或者叫值对象(VO)或者叫领域模型(domain)[个人认为就是数据库表里对应的java对象类] 举个例子: 首先在数据库建一个表Person有四个字段id(pk),name,age,desc(描述): 然后建立domain 1 package com.gh.domain; 2 3

Spring整合JDBC模板方法设计模式之基于继承的实现

Spring整合JDBC模板方法设计模式之基于继承的实现: 模板设计模式简单描述: 把相同的部分提取出来,当我们运行的时候自动往里面设置值,在JdbcTemplate 的源代码中得execute(). 他把公共的部分拎出来写到一个特别的函数中,当我们使用的时候把会发生变化的内容在特定的部分调用,在不同的类里面处理相同的操作,这种方式就做模板设计模式. 例如,JdbcTemplate类中的方法: // ------------------------------------------------

Spring整合JDBC模板方法设计模式之基于组合的实现

Spring整合JDBC模板方法设计模式之基于组合的实现 模板设计模式指的是将相应的模板方法提取出来在一个专门的一个位置定义,然后把相同调用过程的操作通过模板实现. 对于模板设计模式,一般有2中方式 1.基于继承的方式实现 2.基于组合的方式实现 前面实现了:1.基于继承的方式实现 ,Spring整合JDBC模板方法设计模式之基于继承的实现 接下来实现:2.基于组合的方式实现 Spring整合JDBC模板方法设计模式之基于组合的方法在我们有大量类的情况下使用特别方便. 此实现模拟了Spring中