纯JDBC系统的开发随想

纯JDBC系统的开发随想
前两天,两个个纯后台应用项目在没有充分论证的情况下使用了Spring+iBatis实现,从需求到实现、测试历经两天时间,实际代码开发时间是8小时,时间比较短,因为有以前的代码积累。再加上对框架熟烂于心,就像聊天一般的把系统实现了。
今天,迫于压力,需要推翻重做,只允许用JDBC,包括日志工具包,其他的一概不让使用。我也挺郁闷的,刚做好测完了,又要推翻重来-----沉住气,硬是花了6个小时时间把这两个项目的后台代码全用JDBC实现了,不是说写JDBC代码快,而是因为给予对需求和数据库有了透彻理解的基础上。
写这些不是想发什么牢骚,而是对JDBC有了一些思考。如果现在谁要说自己系统用JDBC所写,很容易让人瞧不起,感觉很低级。因为JDBC太基础,用的好与用不好有着天壤之别。就像一把利剑,是否对你有利要看你握着剑柄还是剑刃。
着这里,我不是因为项目用了JDBC费劲而批判什么,而是要为JDBC正个身,把自己开发JDBC系统的体验与大家分享,JDBC好与不好全看你怎么用了。
本人看过无数的JDBC代码,很多系统,有初学者的,有老手的。但没看过很优雅分层的JDBC系统。很多代码都是面向过程式的往下堆,看着到处的try。。。catch,操作结果集代码,早已把业务逻辑淹没了,这可以说是一般JDBC系统的通病。
JDBC是在开发者很郁闷,代码不好写,不好维护,不好分层,那用它干啥啊,大多数开发者一般会首先考虑一个问题,自己实现一个系统,怎么做代价更小的问题。因此JDBC在第一轮的权衡下就被Out了。
对此问题进一步分析,看看能不能找到更好的解决方式。
JDBC代码为什么不好写?要管理数据库连接,要复用连接提高性能,要将结果集与Bean自动绑定,要管理事务,要处理众多的SQLException。
JDBC为什么不好维护,因为代码不好写,写得很烂,业务和数据混杂在一起,这样能好维护吗?
JDBC为什么难以分层,跨层调用Connection谁来管理,如何做到复用,事务控制在哪层?如何提交事务?如何将业务和数据分离,还需要DAO吗?
基于以上问题的分析,我把我实现过程中的一些经验总结出来与大家分享,并不能算最好,也许更好的。
1、包装一个JDBC工具类,可产静态产生连接和执行各种SQL。这是最基本的,可以省去很多重复的代码。必要的话可以自己实现各连接池,或者用开源的。这样,操作数据库的最低级代码得到了一次大的减肥。
2、而考虑系统的分层,系统分层是很必要的,逻辑清晰,易于维护,数据和业务分离。因此应该有DAO层,其次是服务层(业务层)Service,有了这两层,业务-数据实基本上已经实现分离了。
3、建立了层,那么下来就是如何管理层之间的调用,主要是数据库连接,这里常常看到一个很低级也不容易发现的设计上缺陷:在DAO中创建SQL连接,处理SQLException、并用完后立即关闭。这表面上看似没有错,但不要忘记了,事务是在Service上,事务应该放到Service层上做控制。你在DAO中把这些活都干了显然不合理,再说很多DAO调用才形成了一个业务,显然那样做,一个业务的实现需要多次打开和关闭数据库连接,这是导致性能急剧下降的原因。因此得出一个结论,不要再DAO层去管理连接。因此可以考虑在每个Service业务中获取数据连接,在业务中将Connection传递给DAO,在DAO中不要处理异常,上抛吧,以便业务层捕获并处理。对比Spring的事务处理,也是将每个业务方法的数据库连接都保存在一个线程变量中,这样既实现了连接复用,也方便了事务控制。
4、如何用JDBC实现高级框架的关联查询。典型的就是一多关系查询。这里可以分两步实现,实际上Hibernate、iBatis也是分两步来实现,看看SQL便可知道了。而且要注意两个ResultSet嵌套时候的关系,如果是多层的,更应该注重这种层次关系。
5、以上问题都解决了,还有几个不爽的地方,ResultSet到Bean对象集合的转换,这个可以通过Apache Commons DBUitls来得到解决;数据库持久化类的书写,我写了200行左右的工具,可以轻松解决。动态条件SQL拼装,这个问题是非常有挑战性的,目前我就用if。。else。。。做个简单判定来拼装。很麻烦,可以学习下iBatis的源码,看看如何实现。
6、对于事务控制,目前没有需求,但是已经也考虑到了,可以使用JDBC自己的事务管理,也可以使用cglib或者开源的工具来实现,多高的复杂度,要看你的时间来决定了。
到目前为止,我的项目也不是那么完美,还有很多地方可以不用硬编码,但是时间和精力有限。也希望和大家一块讨论。
另外,对于MySQL数据库,如果要连接多个数据库,并且这多个数据库在一个MySQL上,可以用一个数据库连接URL就行,然后在SQL中就可以动态指定操作的是哪个数据库上表。这样避免为一个数据库创建一个连接管理配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器信息MachineInfo

不管是业务功能需要还是开发诊断需要,经常需要用到CPU内存硬盘等信息,或者需要主板编号和系统编号做唯一设备标识。于是设计了机器信息类 MachineInfo ,支持Windows、Linux、Raspberry等。Nuget包:NewLife.Core源码地址&#xff1…

学习 Python 编程的 19 个资源

编译:wzhvictor,英文:codecondo segmentfault.com/a/1190000004187319用Python编写代码一点都不难,事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发, Python是一个不错的开始,甚至想做游戏…

1155低功耗cpu排行_比拼浮点运算速度,超算排行榜是这样“算”出来的

本报记者 过国忠 通 讯 员 梅国英 吴 婷6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四占有两席位置。普通计算机用指令运算速度衡量计算性能,而超算通常用浮点运算速…

mysql 用户概念_传输概念 – db对象的用户/组/权限从mysql到postgresql

这似乎比stackoverflow更适合这里,所以这里:我一直在使用mysql一段时间以来,因为在大多数便宜的虚拟主机上,它是提供的数据库.但是,现在我开始认真开发Web应用程序,我一直在本地使用postgresql作为我的数据库,以便在我感到舒服时在客户端安装上正确使用它.我唯一没有…

在CSDN上的第一篇博客

大学三年在保研成功那一天算是画上了一个圆满的句号,但是这个句号并不代表我在大学里面学到了多少知识。相反,我常常为自己匮乏的专业知识而感到灰心丧气,甚至开始怀疑自己是否适合做IT这一行。大学期间成绩虽然不错,但是那仅仅只…

使用 Tye 辅助开发 k8s 应用竟如此简单(五)

使用 Tye 辅助开发 k8s 应用竟如此简单(一)使用 Tye 辅助开发 k8s 应用竟如此简单(二)使用 Tye 辅助开发 k8s 应用竟如此简单(三)使用 Tye 辅助开发 k8s 应用竟如此简单(四)续上篇&a…

详解冒泡排序

转自:静默虚空http://www.cnblogs.com/jingmoxukong/p/4302718.html要点冒泡排序是一种交换排序。什么是交换排序呢?交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。算…

java面向对象使用字符串_java面向对象中的String类中12种常用的方法

1、字符串与字符数组的转换字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串。public class StringAPIDemo01{public static void main(String[] args){String str1 "hello"; //定义字符串ch…

python测试4_Python 各种测试框架简介(四):pytest

pytest 有时也被称为 py.test,是因为它使用的执行命令是 $ py.test。本文中我们使用 pytest 指代这个测试框架,py.test 特指运行命令。##较于 nose这里没有使用像前三篇一样(简介-举例-discovery-环境)式的分段展开,是因为 pytest 与 nose 的…

在Eigrp做不等值路由的负载均衡

在Eigrp做不等值路由的负载均衡 EIGRP Load Balancing 每个路由协议都支持等值路径的负载均衡.除此之外,IGRP和EIGRP也支持不等值路径的负载均衡,使用variance命令. Variance命令向路由器通告一个n值,n值使用variance命令指定.n值为1-128之间,默认为1。 网络拓扑 Va…

雪花算法Snowflake

雪花Id生成算法,是鼎鼎有名的分布式Id生成算法。它的优点在于,在分布式系统中快速生成有时间顺序的唯一编号!Snowflake实测每秒可生成900万个唯一Id。Nuget包:NewLife.Core源码地址:https://github.com/NewLifeX/X/blo…

java爬取新浪微博登陆_30行jsoup代码搞定新浪微博登录抓取爬虫

主要是设置cookies 想知道方法的朋友可以留言哦爬虫问题都可以探讨哦import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.jsoup.Connection;import org.jsoup.Connection.Method;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;p…

像小猪佩奇那样生活,需要多少钱?

每个有娃的家庭,几乎都有一个小猪佩奇的超级粉丝《小猪佩奇》(又名《粉红猪小妹》)史上最赚钱的英国学前电视动画片动画之一有网友从经济的角度算了笔账像佩奇一家那样生活需要多少钱呢?▼这是佩奇的家,视野相当不错的…

几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...

相信还有很多地方的网课没有结束,前两天有小伙伴在后台留言求几何画板,这款软件大都收费,所以小软公然发到这里怕是不太稳妥,如果被删除就是被举报啦,需要的小伙伴速度下载保存~几何画板英文名:Sketchpad&a…

解惑3G业务

内容简介: 本书系统地介绍了第三代移动通信系统的业务,主要从业务概念、业务实现流程、关键技术、关键问题以及解决问题的思路几个角度进行介绍。本书内容包括:通信业务发展整体分析、3G的移动视频业务、基于SIP的移动“邀请”业务、移动位置…

Delphi 26 岁

喜欢就关注我们吧!诞生于1995年的 Delphi 现在已经 26 岁了。1995年2月14日,Borland 公司推出了面向开发者的新工具——Delphi,旨在接替 DOS 时代盛行一时的 Turbo Pascal。说到这两款产品必然离不开它们的灵魂人物——Anders Hejlsberg&…

row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别

需求描述:分析最近三个月每天排名前30的邮箱收件数量。涉及到的表字段:发件时间,收件人。一、ROW_NUMBER表t查询出了3月每天不同类型邮箱收件量的降序排名,表t1通过ROW_NUMBER函数给每行数据添加序列号,select ROW_NUM…

在U盘上安装linux

所谓在U盘上安装Linux,就是在U盘上放置一些文件,可以让电脑从U 盘启动linux(需要电脑支持从U盘启动)。这篇教程简单说一下怎么在U盘上安装DSL。主要是这个发行版小,50M左右,而且包含了该有的很多软件。前提…

java中的console是干什么的_[Java教程]javascript中,你真的会用console吗?

[Java教程]javascript中,你真的会用console吗?0 2015-08-11 17:00:09使用console进行性能测试和计算代码运行时间对于前端开发人员,在开发过程中经常需要监控某些表达式或变量的值,如果使用用debugger会显得过于笨重,最…

边缘计算k8s集群之SuperEdge

什么是边缘计算边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安…