这几天闲着无聊,就看了一下DBUtils这个数据库组件。中间有了一些想法,现在记录下来。

文章主要分几部分

1 最简单同时也是最经常使用的一些范例

2 学习源码前的一些知识储备

3 我自己写的mydbutils

4 两相比较

5 分析源码

最简单同时也是最经常使用的一些范例

看这个就OK

 http://www.cnblogs.com/xdp-gacl/p/4007225.html

学习源码前的一些知识储备

1反射

  网上资料有很多,大家自己去看。



  2内省

  大家可以认为内省就是java对bean反射的再次包装。

  bean是什么我就不说了吧。

 http://blog.csdn.net/x605940745/article/details/20240959

   看上面的代码就知道怎么用了。



  3泛型

  为什么要使用泛型?

http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html

  下面是我自己的一点理解

  Map m = new HashMap();
  m.put("key", "blarg");
  String s = (String) m.get("key");

第三行代码需要转换类型

  如果我写成这个样子

  Map<String,String> m=new Hashmap<String,String>();
  m.put("key1","blarg");
  String s=m.get("key1");

第三行就不需要转换了。我再声明map的时候就指定了它内部能存放(也只能存放)的数据类型。

  准确的说,就是在 通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。



  对于泛型的使用,我认为大家多参考集合类,就OK了。

  我自己在看泛型的时候出了两个问题

 public <T> T getObject(Class<T> c) throws Exception{
    T t=c.newInstance();
    return t;
  }

方法签名中,T就已经指明了返回的类型,那么<T>不就多余了吗?







  更详细的资料见:

http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html



  后来再看hashmap的源码时,发现get方法的签名就没有中就没有简括号

      HashMap.java
      public V get(Object key) {
        if (key == null)
            return getForNullKey();
        Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    }

通过查看<<java核心技术>>得到这样一个结论

    在泛型类中定义的泛型方法,其方法签名中不需要使用尖括号

    在普通类中定义的泛型发放,就得用<T>,来指示:这个方法是一个泛型方法。

自己写mydbutils

我在泛型这里又遇到了一个问题。

  hashmap定义的时候,泛型写在了尖括号里。

  Map<String,String> m=new Hashmap<String,String>();
  而我自己定义的BeanHandler<T>,new的时候,参数就得放在园括号里
  new BeanHandler<>(Student.class)
  public class BeanHandler<T> implements ResultSetHandler<T>{

    private Class<T> type;

      public BeanHandler(Class<T> type){
     this.type=type;
      }
      ..../
  }

为什么?

  想明白后,我就想抽自己。

  你们自己想想为什么new BeanHandler的时候泛型要放在圆括号里。

  另外,如果我想改成hashmap那种形式,怎么改?

  具体见下文

http://blog.csdn.net/dlf123321/article/details/45173505

两相比较

看看dbutils的设计思路

  http://blog.csdn.net/dlf123321/article/details/45203171

   看看我写的代码,与dbutils的源码,我认为至少有一下几个不同。

   1 源码考虑到了异步的数据库操作,因而有了AsyncQueryRunner。并且在AsyncQueryRunner与QueryRunner中提取了父类---AbstructQueryRunner。并且把关闭数据库资源,获得preparestatement,填充preparestatement等操作提炼到了父类中。

2 源码中BeanHandler中持有一个RowProcessor对象,用来转换ResultSet到Bean,Map,List<Bean>等等,这这部分,我的代码中使用了静态方法

public static <T> T creatBean(ResultSet rs, Class<T> type);

   仔细对比一下,源码中的方式还是比较好,专门有一个类做转换的工作,更加符合面向对象的思想。

3 在转换的过程中,我使用的是最基础的反射方法:

   String methodName = "set"+filedName.substring(0, 1).toUpperCase()+ filedName.substring(1);
   Method m = class.getDeclaredMethod(methodName, filedType);

其实在阅读DBUtils源码之前,我确实不知道还有内省这个东西。

   对应的代码转换成:

   Method setter = PropertyDescriptor.getWriteMethod();

   即可获得某个属性的set方法。

4 在具体的creatBean过程中,我的逻辑是以bean中的属性为主,去ResultSet中去取。

而源码的逻辑是生成一个数组,columnToProperty。例如columnToProperty[2]=4,就是说resultset的第二个字段对应于bean中的第4个属性

   源码方式的好处在于,表与bean的映射关系可以更为灵活,如何如果想让personName与person_name相对应也是可以的。而我那个思路更改起来就会很麻烦。

分析源码

http://blog.csdn.net/dlf123321/article/details/45172429





参考资料

http://www.cnblogs.com/xdp-gacl/p/4007225.html

http://blog.csdn.net/x605940745/article/details/20240959

http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.htmlhttp://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html

DBUtils学习总结的更多相关文章

  1. DBUtils 学习使用

    DBUtils 学习使用 commons-dbutils简介 commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbuti ...

  2. DBUtils学习

    1.       DBUtils是JDBC的简单封装,可以和JDBC混合使用. 2.       DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次 ...

  3. Dbutils学习(介绍和入门)

    一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)      Dbutils:主要是封装了JDBC的代码,简化dao层的操作.      作用:帮助java程序 ...

  4. DBUtils学习一 增删该查

    package com.mozq.jdbc.test; import java.sql.SQLException; import java.util.List; import java.util.Ma ...

  5. ComboPooledDataSource连接mysql

      Dbutils学习(介绍和入门)   一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用)      Dbutils:主要是封装了JDBC的代码,简化dao层 ...

  6. javaweb学习总结—Apache的DBUtils框架学习

    注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...

  7. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. JavaWeb学习总结(十四)--Apache的DBUtils

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  9. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

随机推荐

  1. Java中使用CountDownLatch进行多线程同步

    CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantL ...

  2. Bootstrap3 表格-鼠标悬停

    通过添加 .table-hover 类可以让 <tbody> 中的每一行对鼠标悬停状态作出响应. <table class="table table-hover" ...

  3. Scheme r5rs letrec的用法

    说明,这是r5rs的用法. (letrec ((<variable> <init>) ...) <body>) 假设((<variable> <i ...

  4. Android图表库MPAndroidChart(九)——神神秘秘的散点图

    Android图表库MPAndroidChart(九)--神神秘秘的散点图 今天所的散点图可能用的人不多,但是也算是图表界的一股清流,我们来看下实际的效果 添加的数据有点少,但是足以表示散点图了,我们 ...

  5. Dynamics CRM2013 从subgrid中打开快速创建窗体创建数据

    在页面上使用subgrid时,在subgrid中新建数据时需要跳转到另一个页面,这种操作比较麻烦且很不友好,这时我们想到了快速创建窗体,像下图这样直接在当前页上方下拉出现一个窗体,填写内容后点击保存就 ...

  6. 带你深入理解STL之Set和Map

    在上一篇博客带你深入理解STL之RBTree中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来" ...

  7. Afinal加载网络图片及下载文件使用方法

    Afinal快速开发框架使用起来非常方便,下面将讲解如何利用Afinal加载网络图片及下载文件: 先看效果图: 注意:使用Afinal前需添加Afinal的jar,可以在这里下载:http://dow ...

  8. Android简易实战教程--第二十六话《网络图片查看器在本地缓存》

    本篇接第二十五话  点击打开链接   http://blog.csdn.net/qq_32059827/article/details/52389856 上一篇已经把王略中的图片获取到了.生活中有这么 ...

  9. iOS中使用iCloud一些需要注意的地方(Xcode7.2)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在自己的App中如何使用iCloud有很多文章可以查阅,这里把 ...

  10. UNIX网络编程——客户/服务器程序设计示范(二)

        TCP并发服务器程序,每个客户一个子进程 传统上并发服务器调用fork派生一个子进程来处理每个客户.这使得服务器能够同时为多个客户服务,每个进程一个客户.客户数目的唯一限制是操作系统对以其名义 ...