Java数据库的存取技术

  IT技术日新月异,新技术的出现令人目不暇接,似乎每一天都在产生着新名词。不过归根结底IT所要实现的价值不外乎数据收集,然后再以客户希望的形式展示给客户而已。因此数据存取技术也就成了一个永恒的话题。而在Java这个开放的世界里,数据库存取技术是五花八门,种类繁多。我们也来侃侃Java世界里主流的数据库存取技术。

  首先列出英雄榜

  1.JDBC直接访问数据库

  2.EJBentitybean.

  3.JDO技术。

  4.第三方O/R工具,如目前大红大紫的Hibernate,其它如Castor,Toplink.

  先说说这个历史最为悠久的JDBC吧。从Java诞生的那天起,这位仁兄就开始登上历史舞台了。Java能有今天这么风光,JDBC可以说是功不可末。一路走来,如今已是JDBC3.0了。在没有JDBC的时候,访问数据库那是八仙过海,各显神通,各家数据库厂商都有自己的一套API,苦就苦了开发人员了。换了个数据库,那个程序要改是面目全非。JDBC规范的出台,向世界宣告从此有了访问关系数据库的标准通用接口了。JDBC标准获得了几乎所有数据库厂商的支持,好像还真难找到这么一个数据库,它是没有JDBC支持的。JDBC规范一经发布,获得了空前成功,很快成为java访问数据库的标准。JDBC的成功在于它的规范统一标准的接口,只需要掌握标准的SQL语言就可以访问各种不同的数据库了。这种数据库间的可移植性和Java一直高喊的口号CompileOnce,Runeverywhere遥相呼应。JDBC今天还是java访问数据库的基石,CMP,JDO,Hibernate说到底只是更好的封装了JDBC,提供了更为上层的更为强大的接口而已。然后说说JDBC直接访问数据库的方式来实现java持久性。

  这种方式相对于CMP来说比较简单直接,特别是对于小型应用十分方便。比如,我要写一个简单的留言版程序,就没有必要sessionbean,entitybean,又是home接口又是远程接口,一层层调了吧。直接JDBC,写SQL语句了事。和其它持久化技术相比,JDBC直接访问数据库的方式需要程序员操心的事情多了一些,你得自己关心transaction,自己关心连接池,你得写大量的getset方法,把SQLselect出来的值一个一个塞到你的javaobject中,或者把javaobject的值一个一个给取出来,用SQLinsert到数据库,完全手动进行O/Rmapping。为了克服这些缺点,CMP,JDO等等开始陆续登上历史舞台。

  DO的简单易用是最为人们所称道的,不需要你写大量无用的接口,不需要你继承什么特殊的类,唯一所要做的就是对你的class文件做一下enhance。用了JDO,可以说我们的java程序这下真正OO了,我们无需再理会数据库里面有啥表格了,存取都是以javaobject为对象了,所有数据库表格都是自动生成的。这一点可以说也是一个革命了。在此之前,项目设计阶段,DatabaseSchema设计可以说是个重头戏。而现在用JDO开发,完全不需要数据库设计了。那你的DatabaseSchema呢?就是你的Class啊,JDO会根据你的Class自动生成相应的数据库表格。一个字,爽!从数据库可移植性来看,JDO也是优势明显,就我使用过的Kodo和Genie来看,几个简单应用程序换数据库时候除了换一个JDBCdriver,换一下数据库URL,无需对程序做任何改动。这一点对EJB来说又是处于劣势。从家庭出身来看,JDO也是出生名门,从一开始就处于JCP管理之下。从企业级支持来看,它可以很好的和Sessionbean协同工作,对于企业级开发,Sessionbean+JDO的方式是Sessionbean+entity方式的一个强有力竞争对手。虽然有这么多优点,不过它的发展之路也非一帆风顺,这不,今年五月份JDO2.0的投票,IBM,Oracle,Bea三大巨头同时投了反对票。不过稍微一想,就可以理解,这并不是JDO本身技术有什么重大缺陷,而是JDO动到这些巨头们的奶酪了。Bea,IBM做着业界最为著名应用服务器,weblogic和WebSphere,在EJB上面是投下了血本了,他们不能眼睁睁看着JDO来蚕食EJB市场。而Oracle,还在卖着它自己的O/R工具Toplink,看着JDO日渐强大,他能不着急么。不过呢,公司再牛,他也挡不住历史前进的车轮吧,最终JDO2.0的投票还是以绝对的票数(12:3)通过了。

  还有其它散落江湖的Java持久化技术,如Hibernate,Castor,Toplink,他们虽然没有皇家血统,不过实力也是不容小视。就拿Hibernate来说,是javaworld评选出来的2003年度最佳java数据存取工具,目前可以说是大红大紫。而Castor和Toplink也算是历史悠久了,在JDO没有出世之前,它们就在江湖上混着了。目前也占据着一定的市场。这些第三方的工具从功能上来说很类似于JDO,只是各自的API互不相同。这也是后来JDO规范的呼声越来越高的一个原因吧。这些第三方O/Rmapping工具能在江湖上立足,也确实都有各自过人之处。如Hibernate金字招牌就是OpenSource,支持几乎世面上所能看到得绝大部分数据库,并且文档也非常齐全。Toplink么,可谓历史悠久,又榜着Oracle这棵大树。目前来看,这些工具也占据着java数据库存取的不小市场。个人觉得,随着JDO规范的不段完善,JDO产品的普及,这一部分人员可能会在以后渐渐退出历史舞台。不过从Hibernate目前如日中天的气势来看,好像说这句话还为时过早。

  关于这些技术优劣之争从它们刚刚出生那天起从来就没有停止过,而各家各派也从来没有能够说服过对方。对于我们应用开发者而言,撇开应用纯粹来争论技术优劣并没有多大意义。还是俗话说的好,没有最好的,只有最合适的。我们能够在做开发的时候能够选择一个最合适于自己应用的技术,那就足够了。总的来说,JDBC面向RDBMS,比较适合关系数据库模式驱动的应用,例如统计表格数据,生成报表之类的应用。EJB技术以J2EE应用服务器为中心,如果你的应用确实需要灵活的可声明的事务边界,需要支持大容量的访问和不间断的服务,需要应用服务器的集群,那么选EJB吧。JDO则面向对象,对于以域对象为中心的应用,包含图,树模型的应用,JDO是首选。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用JDBC API连接数据库,并使用BLOB(二进制大对象)数据类型来存储和检索图像。以下是一个简单的示例代码,演示了如何将图像存储在数据库中: ```java // 1. 创数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password"); // 2. 准备SQL语句 String sql = "INSERT INTO mytable (image) VALUES (?)"; PreparedStatement statement = conn.prepareStatement(sql); // 3. 读取图像文件 File file = new File("myimage.png"); FileInputStream inputStream = new FileInputStream(file); // 4. 将图像文件写入BLOB字段 statement.setBinaryStream(1, inputStream, (int) file.length()); // 5. 执行SQL语句 statement.executeUpdate(); // 6. 关闭连接和流 inputStream.close(); statement.close(); conn.close(); ``` 在上面的示例中,我们使用PreparedStatement对象来执行SQL语句,并使用setBinaryStream方法将图像文件的InputStream对象写入BLOB字段。最后,我们关闭连接和流对象以释放资源。 如果要从数据库中检索图像,请使用以下代码: ```java // 1. 创数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password"); // 2. 准备SQL语句 String sql = "SELECT image FROM mytable WHERE id=?"; PreparedStatement statement = conn.prepareStatement(sql); statement.setInt(1, 1); // 3. 执行SQL语句并获取结果集 ResultSet rs = statement.executeQuery(); // 4. 从结果集中获取BLOB字段并将其保存到文件中 if (rs.next()) { InputStream inputStream = rs.getBinaryStream("image"); OutputStream outputStream = new FileOutputStream("retrievedimage.png"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } // 5. 关闭连接和结果集 rs.close(); statement.close(); conn.close(); ``` 在上面的示例中,我们使用ResultSet对象获取结果集,并使用getBinaryStream方法检索BLOB字段的InputStream对象。然后,我们使用OutputStream将InputStream对象中的数据写入文件中。最后,我们关闭连接和结果集对象以释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值