zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    EOF ---shell编程
    Linux错误代码含义
    linux连接sybase数据库-isql
    CH7-WEB开发(集成在一起)
    [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
    [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
    [转]ASP.NET MVC 入门8、ModelState与数据验证
    [转]ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    [转]ASP.NET MVC 入门6、TempData
    [转]ASP.NET MVC 入门5、View与ViewData
  • 原文地址:https://www.cnblogs.com/yangHS/p/10800512.html
Copyright © 2011-2022 走看看