JDBC的进化4--最终进化

除去直接调用开源组织给提供的jar包外,我今天要说的内容就是JDBC的最终版,需要我们多敲多练多理解。最重要的是理解。废话不多说了,开始吧。

早上的时候,我将昨天的内容整理,能处理事务的通用方法写到了JDBCUtils工具类中。

其实到这里的时候,所有细节部分的代码都已经实现了。接下来要进行的内容,其实就是对这些内容的整合,整体的调控。

我们来说DAO:

现在我们希望这个程序能更加自动化一点,我们只需要提供一个连接,它就能返回给我们一个对象或一个对象集,或一个结果。或是我们提供一个连接,一个对象,它就能自动的实现增删改。那么DAO就是这样产生的。

应用泛型类,我们将DAO设计成适用于可操作不同对象的增删改查的父类。具体的操作 由操纵具体实体类 的子类DAO 来完成。

来看代码:

DAO:

public class Dao<T> {
    Class<T> clazz = null;

    @SuppressWarnings("unchecked")
    public Dao(){
        Type type = this.getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) type;
        Type[] types = pt.getActualTypeArguments();
        clazz = (Class<T>) types[0];
        System.out.println(clazz);
    }

    protected List<T> getGroupValue(Connection conn, String sql, Object...args){
        List<T> list = new ArrayList<T>();
        // get PreparedStatement‘s object
        PreparedStatement ps = null;
        // execute sql
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);

            // set ps
            for(int i = 0; i < args.length; i++){
                ps.setObject(i+1, args[i]);
            }

            rs = ps.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            System.out.println(columnCount);

            while(rs.next()){
                T t = clazz.newInstance();
                for(int i = 1; i <= columnCount; i++){
                    // read
                    String columnName = rsmd.getColumnLabel(i);
                    Object columnValue = rs.getObject(columnName);

                    // write
                    Field field = clazz.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(t, columnValue);
                }
                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, null);
        }

        return list;
    }

    protected Object getValue(Connection conn, String sql, Object... args){
        Object object = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // get PreparedStatement‘s object
            ps = conn.prepareStatement(sql);

            // set ps
            for(int i = 0; i < args.length; i++){
                ps.setObject(i+1, args[i]);
            }

            // execute the sql
            rs = ps.executeQuery();

            // read rs
            if(rs.next()){
                object = rs.getObject(1);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, null);
        }

        return object;
    }

    /**
     * getPrepareAllTransaction()
     *
     * @param conn
     * @param sql
     * @param clazz
     * @param args
     * @return
     */
    protected List<T> getPrepareAllTransaction(Connection conn, String sql,
            Object... args) {
        List<T> list = new ArrayList<T>();
        // get PreparedStatement
        PreparedStatement ps = null;
        // execute the sql
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);
            // set the ps
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            rs = ps.executeQuery();
            // get the columnNum
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnNum = rsmd.getColumnCount();
            // read the rs and write to an object
            while (rs.next()) {
                T t = clazz.newInstance();
                for (int i = 1; i <= columnNum; i++) {
                    // read
                    String columnName = rsmd.getColumnLabel(i);
                    Object columnVal = rs.getObject(columnName);

                    // through the method(reflect)
                    PropertyUtils.setProperty(t, columnName, columnVal);
                }
                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, null);
        }
        return list;
    }

    /**
     * getTransacation
     *
     * @param conn
     * @param sql
     * @param clazz
     * @param args
     * @return
     */
    protected T getPrepareTransaction(Connection conn, String sql, Object... args) {
        T t = null;
        // get PreparedStatement‘s object
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            ps = conn.prepareStatement(sql);

            // set the ps
            ps.setObject(1, args[0]);

            rs = ps.executeQuery();

            ResultSetMetaData rsmd = rs.getMetaData();

            int columnNum = rsmd.getColumnCount();

            // read and write
            if (rs.next()) {
                t = clazz.newInstance();
                for (int i = 1; i <= columnNum; i++) {
                    // read
                    String columnName = rsmd.getColumnLabel(i);
                    Object columnValue = rs.getObject(columnName);

                    // write
                    Field field = clazz.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(t, columnValue);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, ps, null);
        }
        return t;
    }

    /**
     * Update
     *
     * @param conn
     * @param sql
     * @param args
     * @return
     */
    protected int transactionUpdate(Connection conn, String sql, Object... args) {
        // get preparedStatement‘s object
        PreparedStatement ps = null;
        // execute the ps
        int rows = 0;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);

            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);
            }
            rows = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(ps, null);
        }
        // return
        return rows;
    }
}

发现,里面的方法和我们之前写的方法没有什么区别,只不过因为T的声明到了DAO里,所以我们下面的方法中就不需要再次声明。同时提供了一个构造方法,方法中利用反射,获取了当前对象的类的父类的泛型类型this.getClass().getGenericSuperClass(); 这是获取了父类所有泛型的类型,里面可能有一个值比如DAO<T>,也可能存在多个值,比如Map<K, V> ,通过API我们发现,Type中没有这样的方法可以将里边的类型全部取出来,而它的子接口中提供了这样的方法。

ParameterizedType pt = (ParameterizedType) type;

getActualTypeArguments() 返回一个type[]数组。这里因为我们知道就有一个泛型类型,直接取索引为0的元素即为泛型类型。

创建一个具体的操作类:

public class UserDAO extends Dao<User>{
    // select function
    public Object getSpecialValue(Connection conn){
        String sql = "SELECT count(*) FROM users";
        return getValue(conn, sql);
    }

    // select All
    public List<User> getAllUser(Connection conn){
        String sql = "SELECT * FROM users";
        return getPrepareAllTransaction(conn, sql);
    }

    // select info through id....
    public User getUser(Connection conn, int id){
        String sql = "SELECT * FROM users WHERE id = ?";
        return getPrepareTransaction(conn, sql, id);
    }

    //delete
    public int delete(Connection conn, int id){
        String sql = "DELETE FROM users WHERE id = ?";
        return transactionUpdate(conn, sql, id);

    // update
    public int update(Connection conn, User user){
        String sql = "UPDATE users SET address = ? WHERE id = ?";
        return transactionUpdate(conn, sql, user.getAddress(), user.getId());

    }

    // insert
    @Test
    public int insert(Connection conn, User user){
        String sql = "INSERT INTO users(name, address, phone) values(?,?,?)";
        int rows = transactionUpdate(conn, sql, user.getName(), user.getAddress(), user.getPhone());
        return rows;
    }
}

这里这个类是用来操作User类的。测试这里就不写了。还是要说一下刚刚的构造器。

我们在创建UserDao的时候,它默认的会调用UserDao的无参构造器,而又因为有继承,这个UserDao的构造器又会默认的调用父类DAO的构造器,再按照上面的步骤分析,是不是就明白了。

这样做的好处就是,我们不用在有的方法中继续重复的写Class clazz这个参数。

DAO就算说完了。

到这里为止,就要画个分割线了。之前的部分需要我们多多理解。因为这是后面学习三大框架的基础,核心。按照从进化1到最终进化这个思路,随便在一个编辑器里,从头到尾写三遍。我感觉很有必要。

————————————————华丽丽的分割线—————————————-

接下来是开源组织提供的一些工具类,他能帮我们完成上面所有的内容。当然可能他们写的更好,但是核心的思想就是上面这些。

获取连接:

推荐:c3p0

推荐理由:可以通过xml文件来进行配置。

执行SQL语句:

DbUtils()

具体的使用,参考他们提供的帮助文档。



今天实在是瞌睡的不行了,学校烦心的事情又比较多,本来想放弃更这篇博客的。但是又想了想,如果我这一放弃,就会给我以后的放弃带来更多的理由,而我克服了。我会坚持下去。加油吧,少年。

时间: 2024-10-09 15:53:12

JDBC的进化4--最终进化的相关文章

mips平台使用jdbc操作sqlite的最终解决方案

1.概述: 本项目需要在多平台上(mips必须支持)操作嵌入式数据库sqlite,而最新的sqlite-jdbc-3.15.1.jar的本地驱动只含有少量的平台,于是解决支持mips平台实在必行.方法有多,具体如下. 1.1 SQLite三种JDBC驱动的区别 摘自http://blog.sina.com.cn/s/blog_654337ca01016x4n.html 在DBeaver中看到SQLite有三种JDBC驱动,查了它们官方网站的相关解释,发现它们还是挺不一样的. SQLite Wra

马云的阿里正在实践《失控》里人类下一轮进化:连接

1994年写成的<失控>讲了一件事情:连接.按<失控>的核心观点,连接是人类下一轮的进化方式,从以个人为单元的社会进化到以群体为单元的社会,连接是主要的技术实现手段.<失控>还有一个观点,就是现在的人们通过连接成群体来实践下一轮进化,但进化之后的群体智能是什么样子,这超越了现在人们的想象.因此,不能用今天的经验来预测明天的世界,连接之后的群体智能将在连接的过程中自然而然展现出来. 可以说腾讯率先在消费人群中实践了<失控>的思想,这也成就了微信的成功.后来,马

《盲眼钟表匠》:进化造就了这个世界的各种复杂的生物。30年前的书,离的有点远 五星推荐

本书英文版第一版是1986年出的.到现在近30年了.作者是英语世界中捍卫进化论.宣扬无神论方面的专家和名人. 神创论反驳进化论的观点之一是像眼睛这样复杂的器官一定是实现设计出来的而不是进化出来的.本书主要是针对神创论的这个观点做反驳.同时也把进化论的主要观点.各种误解.反方的各种观点梳理了一遍. 作者认为:有证据表明,许多复杂的器官都由多个物种分别进化出来.人类的眼睛有一个明显的缺陷:视神经分布在感光细胞前面挡住光线,视神经成组穿过视网膜的地方干脆成为盲点,章鱼的眼睛则没有这个缺陷:乌贼的眼睛则

一种实现人工智能程序自进化的概念原理

本文主要论述五点: 1.能自我学习自我控制自我进化的信息处理控制能力就叫智能: 2.实现人工智能程序自进化的模式是程序自己修改自己的自循环: 3.智能算法通过若干子系统的功能实现自循环: 4.人工智能“学习”的机制过程(算法)和“学习”的结果(训练数据.大数据)都直接影响其功能: 5.智能认知系统是信息社会的未来.是科技的未来. 能自我学习自我控制自我进化(自我进化包含了自我评价机制)的信息处理(信息感知.信息识别.信息拓展等)控制能力就叫智能.智能是带有不可预知性的,就象人学习,不同的人看同一

[Evolutionary Algorithm] 进化算法简介

进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编码,种群初始化,交叉变异算子,经营保留机制等基本操作.与传统的基于微积分的方法和穷举方法等优化算法(具体介绍见博客[Math] 常见的几种最优化方法中的其他数学优化方法)相比,进化计算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织.自适应.自学习的特性,能够不受问题性质的限制,有效地

互联网之于人类社会进化的意义

生物演化由自身信息系统主导,细胞进化由DNA主导,人行为的进化由大脑主导,人类社会的进化由社会信息系统主导,而互联网处在社会信息系统的核心. DNA.大脑.互联网,它们分别在微观层面.常规层面.宏观层面推动了细胞.人.人类社会的进化. 在进化中,大脑.互联网起到了与DNA相同的作用,这就是它们共同的规律. DNA.大脑.互联网共同推动了生物的进化. 原文地址:https://www.cnblogs.com/saofenghan/p/12313755.html

阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_03.jdbc操作数据库的问题分析

分析一段代码,传统的jdbc的功能,最终要实现的功能就是sql语句. 原文地址:https://www.cnblogs.com/wangjunwei/p/11297836.html

文本数据的机器学习自动分类方法(转)

http://blog.csdn.net/jdbc/article/details/50586042 本文为第一部分,着重介绍文本预处理以及特征抽取的方法. 随着互联网技术的迅速发展与普及,如何对浩如烟海的数据进行分类.组织和管理,已经成为一个具有重要用途的研究课题.而在这些数据中,文本数据又是数量最大的一类."文本分类是指在给定分类体系下,根据文本内容自动确定文本类别的过程"(达观数据科技联合创始人,张健).文本分类有着广泛的应用场景,例如: 新闻网站包含大量报道文章,基于文章内容,

《虚拟人》:准科幻,讨论人的记忆与思维能力能够复制到机器之后的种种场景。3星。

感觉实质内容更像科幻小说(形式上不像).一开始判断人类将可以把大脑中的记忆与思维能力复制到软件,后面大部分都基于这个假设来讨论由此带来的社会.法律.宗教方面的各种可能出现的场景.3星. 以下是书中一些内容的摘抄: 1:事实上,有人与我持相同看法.本书内容大部分来自2003—2011年间我赞助过的座谈会和研讨会,书中观点参考了当今诸多颇具创造性.技术性和科学性的研究先锋们的观点.#286 2:“有重要证据显示,人类不是唯一拥有能够产生意识神经基质的物种.非人类动物,包括所有哺乳动物和鸟类.许多其他