纯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://lavasoft.blog.51cto.com/62575/234158
相关推荐
2. **URL配置**:连接SQL Server通常需要提供一个数据库URL,如`jdbc:sqlserver://hostname:port;databaseName=dbname`。URL中包含了服务器地址、端口和数据库名等信息。 3. **认证机制**:驱动支持多种认证方式,...
SQLJDBC4-4.0.jar属于JDBC驱动的四大类型之一:Type 4纯Java驱动,无需依赖于特定数据库系统的本地库,直接通过网络协议与数据库进行通信。 二、SQLJDBC4驱动详解 SQLJDBC4是微软针对SQL Server发布的JDBC驱动程序...
"jdbc:sqlserver://localhost:1433;databaseName=myDB", "username", "password"); ``` 这里,`com.microsoft.sqlserver.jdbc.SQLServerDriver`是JDBC驱动的类名,`jdbc:sqlserver://localhost:1433;databaseName=...
- URL格式:`jdbc:oracle:thin:@<主机>:<端口>:<SID>` - 示例:`jdbc:oracle:thin:@localhost:1521:orcl` 2. **DB2数据库**: - JDBC驱动类:`com.ibm.db2.jdbc.app.DB2Driver` - URL格式:`jdbc:db2://<主机>:...
2. **建立连接**:通过`DriverManager.getConnection()`方法创建数据库连接,需要提供数据库URL、用户名和密码,例如`Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", ...
适合人群:Java开发人员,尤其是初学者和希望深入理解 JDBC内部机制和技术细节的开发人员。 使用场景及目标:适用于企业级开发中的数据库操作任务,旨在提升应用程序的性能和稳定性。通过学习本文,读者可以熟练掌握...
总结来说,Java的JDBC编程是Java开发者必备的技能之一,它使得Java程序能高效地与数据库进行交互,而MySQL作为常用的数据库系统,掌握其基本操作对于数据库开发和管理至关重要。通过学习和实践,开发者可以熟练地...
描述中的“连接SQL SERVER的JDBC 6,用于其它开发软件连接sql server的连接桥”进一步阐述了这个驱动程序的作用。它作为一个桥梁,使得非SQL Server原生支持的开发工具(如Eclipse、IntelliJ IDEA等)也能通过Java...
为了支持向后兼容以及可能的升级方案,JDBC Driver 2.0 在每个安装包中都包括 2 个 JAR 类库:sqljdbc.jar 和 sqljdbc4.jar。 sqljdbc.jar 类库提供对 JDBC 3.0 的支持。 sqljdbc.jar 类库要求使用 5.0 版的 Java ...
每个数据库驱动都有其特定的URL格式,例如,`jdbc:mysql:`前缀表示连接到MySQL,而`jdbc:sqlserver:`表示连接到SQL Server。`jdbc:oracle:thin:`是Oracle数据库的“瘦”驱动,它不依赖本地Oracle客户端库。 在实际...
Specification-Title: Oracle JDBC driver classes for use with JDK14 Sealed: true Created-By: 1.4.2_14 (Sun Microsystems Inc.) Implementation-Title: ojdbc14.jar Specification-Vendor: Oracle Corporation ...
URL 的结构通常是 `jdbc:<subprotocol>:<subname>`,其中 `<subprotocol>` 表示用于连接数据库的具体协议,而 `<subname>` 则提供了进一步的连接信息。 ##### 4.5 传递参数和接收结果 使用 JDBC NetServer 进行...
数据库URL的语法为jdbc:子协议:子名字。 JDBC编程的六大步骤 JDBC编程的六大步骤是: 1. 注册驱动 2. 建立连接 3. 创建语句 4. 执行语句 5. 处理结果集 6. 关闭连接 JDBC增强功能 JDBC 2.0提供了许多增强功能,...
- URL格式:`jdbc:oracle:thin:@<主机>:<端口>:<SID>` - 示例:`jdbc:oracle:thin:@localhost:1521:orcl` 2. **DB2** 数据库 - 驱动类:`com.ibm.db2.jdbc.app.DB2Driver` - URL格式:`jdbc:db2://<主机>:<端口...
在提供的部分内容中,“`jdbc:oracle:thin:@SFMWLHRTRLFQJQA:1521:orclsid`” 是一个典型的 JDBC-Oracle-Thin 连接字符串。下面我们将逐个部分进行解析: - **jdbc:**:表示使用 JDBC 协议。 - **oracle:**:指定...
"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver" * 6. Sybase url示例: "jdbc:sybase:Tds:localhost:5007/tsdata" * 7. MySQL url示例: "jdbc:mysql://localhost/test?user=root&...
String url = "jdbc:kingbase://hostname:port/databasename"; String username = "your_username"; String password = "your_password"; try { Class.forName("com.kingbase.jdbc.Driver"); Connection conn = ...
Sybase官方的JDBC驱动程序——jConnect 驱动类名:com.sybase.jdbc3.jdbc.SybDriver 连接URL:jdbc:sybase:Tds:host:port/database?property_name=value
- **JDBC URL**:`jdbc:microsoft:sqlserver://<server_name>:<port>` - 默认端口:1433 - 如果服务器使用默认端口,则 `<port>` 可以省略。 ##### 2. Microsoft SQL Server 2005 及以上版本 - **驱动程序包名**...
Java连接达梦数据库驱动dm_jdbc: dm_jdbc\com.dameng.floader.jar dm_jdbc\com.dameng.impexp.jar dm_jdbc\Dm7Dictionary.jar dm_jdbc\Dm7JdbcDriver14.jar dm_jdbc\Dm7JdbcDriver15.jar dm_jdbc\Dm7JdbcDriver16....