关于DAO和分页实现

来源:互联网 发布:淘宝客怎样推广店铺 编辑:程序博客网 时间:2024/04/28 05:08
1.关于DAO<T>
    1)接口DAO一般具有insert、update、query、queryForList、getSingleValue、batch等方法
    2)其实现类BaseDAO<T>一般通过QueryRunner实现其所有方法,在这个实现类中会有clazz私有属性,为的是获取泛型参数类型
            》public BaseDao() {
                Type type = getClass().getGenericSuperclass();    //Dao
                if (type instanceof ParameterizedType) {     //判断是否是类Parameterized的实例,ParameterizedType就是代表是否是带泛型参数的类
                    Type[] types = ((ParameterizedType) type).getActualTypeArguments();    //返回Dao的泛型参数数组
                    if (types != null && types.length > 0) {
                        clazz = (Class) types[0];    //需要实例化的clazz就是第一个参数类型
                    }
                }

            }
            
            》其insert方法会有返回值,返回类型为Long型,因为使用queryRunner的方法不能得到返回值,所以只能使用传统的方法
                try {
                    connection = DBUtils.getConnection();
                    preparedStatement = connection.prepareStatement(sql,
                            Statement.RETURN_GENERATED_KEYS);//设置返回主键

                    if (args != null && args.length > 0) {
                        for (int i = 0; i < args.length; i++) {
                            preparedStatement.setObject(i + 1 , args[i]);
                        }
                    }
            
                preparedStatement.executeUpdate();
                resultSet = preparedStatement.getGeneratedKeys();//返回主键
                if(resultSet.next()){
                    id = resultSet.getLong(1);
                }
            
            》更新方法使用queryRunner.update(connection, sql);
            》查询方法使用queryRunner.query(connection, sql, new BeanHandler<T>(clazz), args);
            》查询返回List使用queryRunner.query(connection, sql, new BeanListHandler<T>(clazz), args);
            》批量操作使用queryRunner.batch(connection, sql, params);
            》得到单个值使用(V) queryRunner.query(connection, sql, new ScalarHandler(), args);
    3)具体对象的接口一般会有操作对象的所有方法
    4)具体的类需要继承BaseDAO实现其对应的接口,通过BaseDAO里的方法实现其对应接口里的方法
    
    
    
2.关于分页
    1)具有第几页pageNo、这一页显示几条记录pageSize、这一页显示哪些信息pageList、全部页数的信息量totalItemNumber
    2)其构造方法需要利用其pageNo的属性进行初始化
    3)得到pageNo的方法时需要判断其是否符合实际情况,最小值不能小于1,最大值不能超过getTotalPageNumber
    4)getTotalPageNumber由totalItemNumber/pageSize获得,还要注意不能除净的情况,如果不能除净。需要把totalPageNumber++;
    5)通过是否大于1判断是否是首页,通过判断是否小于totalPageNumber判断是否是最后一页,还需得到下一页、上一页(需要通过是否是首页或者末页进行判断)
    

3.关于条件查询
    1)根据需要条件查询,设置一个Criteria类
    2)其属性为其需要进行条件查询的属性,如果需要和分页结合起来,就还需要定义一个pageNo(页码)的属性(特别需要注意pageNo的值是否符合实际情况)
    3)查询条件:如果是属于范围类型,则可以设定默认值,最小为0,最大为Integer.MAX_VALUE。为的是当把查询条件的类作为参数进行查询时,可以不用判断是否输入了条件。


通过数据库实现其分页
// limit 4,3代表从5开始,数三个就是5,6,7
    @Override
    public List<Book> getPageList(CriteriaBook cb, int pageSize) {
        String sql = "select * from books where price>= ? and price <= ? limit ? ,? ";

        return queryForList(sql, cb.getMinPrice(),cb.getMaxPrice(),(cb.getPageNo()-1)*pageSize,pageSize);
    }
    































   
0 0