美文网首页JavaWeb
SubList分页-007-Dao类

SubList分页-007-Dao类

作者: 53b3f4658edc | 来源:发表于2017-11-06 15:09 被阅读5次

    1.这个类封装了基本的CRUD 操作,以供子类使用。

    • C reate new records
    • R etrieve existing records
    • U pdate existing records
    • D elete existing records.)

    2.当前DAO直接在方法中获取数据库连接

    1. 整个DAO采取DBUtils解决方案

    测试代码

    package top.itcourse.page.dao;
    
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import top.itcourse.page.utils.JDBCUtils;
    
    
    /**
     * 1.
     * 这个类封装了基本的CRUD(
     *  C reate new records
     *  R etrieve existing records
     *  U pdate existing records
     *  D elete existing records.)
     * 操作,以供子类使用。
     * 
     * 2.
     * 当前DAO直接在方法中获取数据库连接
     *
     *3.
     *整个DAO采取DBUtils解决方案
     *
     * @param <T>:当前DAO处理的实体类型
     */
    
    /*
     * 
     */
    public class DAO<T> {
        //dbutils对象
        private QueryRunner queryRunner = new QueryRunner();
        
        //对应查询的返回结果的类的class
        private Class<T> clazz;
        
        //在构造函数里初始化clazz(用的时候是子类在用)
        public DAO() {
            //一、getSuperclass   返回直接继承的父类(由于编译擦除,没有显示泛型参数)
            //二、getGenericSuperclass  返回直接继承的父类(包含泛型参数)
            Type superClass = getClass().getGenericSuperclass();
            
            //ParameterizedType是一个接口,这个类可以用来检验泛型是否被参数化
            if( superClass instanceof ParameterizedType ) { //被参数化了
                ParameterizedType pt = (ParameterizedType)superClass;
                //getActualTypeArguments:返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class,因为可能有多个,所以是数组。
                Type[] typeArgs = pt.getActualTypeArguments();
                if( typeArgs != null && typeArgs.length > 0 ) {
                    if( typeArgs[0] instanceof Class ) {
                        clazz = (Class<T>) typeArgs[0];
                    }
                }
            }
        }
        
        /**
         * 该方法包含了INSERT、DELETE、UPDATE操作。
         * @param sql:执行的SQL语句
         * @param args:填充SQL语句的占位符
         */
        public void update(String sql,Object ... args) {
            Connection con = null;
            try {
                con = JDBCUtils.getConnection();
                //dbutils里面封装的update方法,很刺激:连接,SQL,参数
                queryRunner.update(con, sql, args);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                JDBCUtils.relase(con);
            }
        }
        
        /**
         * 
         * @param sql:执行的SQL语句
         * @param args:填充SQL语句的占位符
         * @return:返回查询结果的一个实体类对象
         */
        public T get(String sql,Object ... args) {
            Connection con = null;
            try {
                con = JDBCUtils.getConnection();
                //dbutils中封装的方法:连接,SQL,需要返回的class(new BeanHandler<>(Class对象),占位参数
                return queryRunner.query(con, sql, new BeanHandler<>(clazz), args);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                JDBCUtils.relase(con);
            }
            return null;
        }
        
        /**
         * 
         * @param sql:执行的SQL语句
         * @param args:填充SQL语句的占位符
         * @return:返回查询结果的多个实体类对象
         */
        public List<T> getForList( String sql,Object ... args ) {
            Connection con = null;
            
            try {
                con = JDBCUtils.getConnection();
                //返回查询结果的List
                return queryRunner.query(con, sql, new BeanListHandler<>(clazz), args);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                JDBCUtils.relase(con);
            }
            return null;
        }
        
        /**
         * 
         * @param sql:执行的SQL语句
         * @param args:填充SQL语句的占位符
         * @return:返回查询结果的某一个字段的值(一个类是一条完整的记录)
         */
        public <E> E getForValue(String sql, Object ... args ) {
            Connection con = null;
            
            try {
                con = JDBCUtils.getConnection();
                //返回某个值的查询操作
                return (E) queryRunner.query(con, sql,new ScalarHandler(),args);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return null;
        }
        
    }
    

    源码下载

    关注下方的微信公众号,回复:java_div_page.code
    





    欢迎加入交流群:451826376


    更多信息:www.itcourse.top

    完整教程PDF版本下载

    相关文章

      网友评论

        本文标题:SubList分页-007-Dao类

        本文链接:https://www.haomeiwen.com/subject/hkelmxtx.html