DBUtils学习总结
这几天闲着无聊,就看了一下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学习总结的更多相关文章
- DBUtils 学习使用
DBUtils 学习使用 commons-dbutils简介 commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbuti ...
- DBUtils学习
1. DBUtils是JDBC的简单封装,可以和JDBC混合使用. 2. DBUtils对结果集自动封装为JavaBean是有着苛刻要求的:必须满足JavaBean的规范,其次 ...
- Dbutils学习(介绍和入门)
一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用) Dbutils:主要是封装了JDBC的代码,简化dao层的操作. 作用:帮助java程序 ...
- DBUtils学习一 增删该查
package com.mozq.jdbc.test; import java.sql.SQLException; import java.util.List; import java.util.Ma ...
- ComboPooledDataSource连接mysql
Dbutils学习(介绍和入门) 一:Dbutils是什么?(当我们很难理解一个东西的官方解释的时候,就让我们记住它的作用) Dbutils:主要是封装了JDBC的代码,简化dao层 ...
- javaweb学习总结—Apache的DBUtils框架学习
注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JavaWeb学习总结(十四)--Apache的DBUtils
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
随机推荐
- Android Design Support Library使用详解——Snackbar
Google在2015 I/O大会上,给我们带来了更加详细的Material Design规范,同时也引入了Android Design Support Library,为我们提供了基于Materia ...
- Android源码解析——AsyncTask
简介 AsyncTask 在Android API 3引入,是为了使UI线程能被正确和容易地使用.它允许你在后台进行一些操作,并且把结果带到UI线程中,而不用自己去操纵Thread或Handler.它 ...
- 衣带渐宽终不悔,为伊消得人憔悴--DbHelper增强版
核心理念 如何使用 测试实例 数据库内详细数据信息 测试代码 数据库连接池测试 测试集 延伸 相关下载链接 前几日,写了一篇关于一个 轻量级数据持久化的框架的博客(点击浏览: http://blog. ...
- Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 2 部分: DTrace
DTrace的原理本系列文章详细地介绍了一个 Linux 下的全新的调式.诊断和性能测量工具 Systemtap 和它所依赖的基础 kprobe 以及促使开发该工具的先驱 DTrace 并给出实际使用 ...
- 这是最好的时光 这是最坏的时光 v0.1.1.1
这是最好的时光 这是最坏的时光 v0.1.1.1 1.2 学校的生活二三事之大学 话说上一回,扯了一下我青涩的少年往事,大家反响不一,有叫好的,有吐槽的,有字字码过的,也有一目十行的.我的心情也是随着 ...
- Spark:相关错误总结
http://blog.csdn.net/pipisorry/article/details/52916307 路径错误 spark FileNotFoundError: [Errno 2] No s ...
- gloox配置聊天室
gloox配置聊天室 (金庆的专栏) gloox是XMPP协议的C++客户端库.以下代码测试创建多人聊天室(MUC), 并进行配置.参照gloox中的muc示例代码.gloox代码示例中没有聊天室的配 ...
- Android开发之Path类使用详解,自绘各种各样的图形!
玩过自定义View的小伙伴都知道,在View的绘制过程中,有一个类叫做Path,Path可以帮助我们实现很多自定义形状的View,特别是配合xfermode属性来使用的时候.OK,那我们今天就来看看P ...
- 通过grub-install命令把grub安装到u盘
通过grub-install命令把grub安装到u盘 ①准备一个u盘,容量不限,能有1MB都足够了. ②把u盘格式化(我把u盘格式化成FAT.fat32格式了,最后证明也是成功的).③开启linux系 ...
- activiti实战系列 activiti连线
11:连线 11.1:流程图 注意:如果将流程图放置在和java类相同的路径,需要配置: 11.2:部署流程定义+启动流程实例 11.3:查询我的个人任务 11.4:完成任务 说明: 1)使用流程变量 ...