DAO设计模式

DAO

Data Access Object

作用:

访问数据信息的类,包含了对数据的CRUD(create,read,update,delete),而不包含任何业务相关的信息。

优势:

实现功能的模块化,更有利于代码的维护和升级。

DAO可以被子类继承或直接使用。

使用:

//INSERT,UPDATE,DELETE 操作可以包含在其中

void update(String sql,Object...args);

    //修改的测试
    @Test
    public void test1(){
        String sql = "update student set name='yang',password='111' where id=? ";
        update(sql,1);
    }
    //修改
    public void update(String sql,Object...args){
        Connection conn = null;
        PreparedStatement preparedStatement = null;

        try {
            conn = Methods.getConnection();
            preparedStatement = conn.prepareStatement(sql);

            for(int i = 0;i<args.length;i++){
                preparedStatement.setObject(i+1,args[i]);
            }
            preparedStatement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Methods.release(preparedStatement,conn,null);
        }
    }

  

//查询一条记录,返回对应的对象

<T> T get(Class<T> clazz,String sql,Object...args);

 //查询记录测试
    @Test
    public void test2(){
        String sql = "select * from student where id = ?";
        Student stu = get(Student.class,sql,1);
        System.out.println(stu);
    }
    //查询一条数据
    public <T> T get(Class<T> clazz, String sql, Object...args){
        T entity = null;
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            conn = Methods.getConnection();
            preparedStatement = conn.prepareStatement(sql);
            for (int i = 0; i < args.length ; i++) {
                preparedStatement.setObject(i+1,args[i]);
            }
            resultSet = preparedStatement.executeQuery();

            //5.若ResultSet中有记录
            //准备一个Map<String,Object>:键:存扩列的别名,值:存放列的值
            if(resultSet.next()){
                Map<String,Object> map = new HashMap<String,Object>();

                //6.得到ResultetMetaData对象
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

                //7.处理ResultSet,把指针向下移动一个单位

                //8.由ResultSetMetaData对象得到结果集中有多少列
                int columnCount = resultSetMetaData.getColumnCount();

                //9.由ResultSetMetaData对象得到每一列的别名,由ResultSet得到具体每一列的值
                for (int i = 0; i < columnCount ; i++) {
                    String columnLabel = resultSetMetaData.getColumnLabel(i+1);
                    Object columnValue = resultSet.getObject(i+1);

                    //10.填充map对象
                    map.put(columnLabel,columnValue);
                }

                //11.用反射创建Class对应的对象
                entity = clazz.newInstance();

                //12.遍历Map对象,用反射填充对象的属性值:
                //属性名为Map中的Key,属性值为Map中的value
                for (Map.Entry<String,Object> entry : map.entrySet()) {
                        String propertyName = entry.getKey();
                        Object propertyValue = entry.getValue();
                        BeanUtils.setProperty(entity,propertyName,propertyValue);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Methods.release(preparedStatement,conn,resultSet);
        }

        return entity;
    }

  

//查询多条记录,返回对应的对象的集合

<T> List<T>getForList(Class<T> clazz,String sql,Object...args);

 //查询多条记录测试
    @Test
    public void test3(){
        String sql = "select * from student";
        List<Student> list = getList(Student.class,sql);
        for (Student stu:list
             ) {
            System.out.println(stu);
        }
    }

    //查询多条记录
    public <T>  List<T> getAll(Class<T> clazz, String sql, Object...args){
        List<T> list = new ArrayList<>();
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            conn = Methods.getConnection();
            preparedStatement = conn.prepareStatement(sql);
            for (int i = 0; i < args.length ; i++) {
                preparedStatement.setObject(i+1,args[i]);
            }
            resultSet = preparedStatement.executeQuery();

            //5.若ResultSet中有记录
            //准备一个List<Map<String,Object>>:键:存扩列的别名,值:存放列的值,其中一个Map对应着一条记录
            List<Map<String,Object>> values = new ArrayList<>();

                //6.得到ResultetMetaData对象
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();

                Map<String,Object> map = null;
                //7.处理ResultSet,使用while循环
                while(resultSet.next()){
                    map = new HashMap<String,Object>();

                    for (int i = 0; i < resultSetMetaData.getColumnCount() ; i++) {
                        String columnLabel = resultSetMetaData.getColumnLabel(i+1);
                        Object columnValue = resultSet.getObject(i+1);
                        //10.填充map对象
                        map.put(columnLabel,columnValue);
                    }
                    //11.把一条记录的一个Map对象放入准备的list集合中
                    values.add(map);
                }

                T bean = null;

                //12.遍历values集合
                if(values.size()>0){
                    for (Map<String,Object> l: values) {
                        bean = clazz.newInstance();
                        for (Map.Entry<String,Object> entry : l.entrySet()) {
                            String propertyName = entry.getKey();
                            Object propertyValue = entry.getValue();

                            //11.用反射创建Class对应的对象
                            BeanUtils.setProperty(bean,propertyName,propertyValue);
                        }
                        //13.把Object对象放入list中
                        list.add(bean);
                    }
                }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Methods.release(preparedStatement,conn,resultSet);
        }

        return list;
    }

  

//返回某条记录的某一个字段的值或一个统计的值(一共有多少条记录)

<E> E getForValue(String sql,Object...args);

 try-catch(ctrl+alt+t)  

getset方法重写父类方法(ctrl+alt+insert) 

选定本行(ctrl+insert)

选定内容上下移动(ctrl+shift+上下) 

参数提示(ctrl+p)

原文地址:https://www.cnblogs.com/yangHS/p/10800512.html