一个简单的 JDBC 包装器

Cassandra JDBC Wrapper:Datastax Java 驱动的扩展 Cassandra JDBC Wrapper为Cassandra数据库的操作提供了一层标准JDBC封装,支持诸如连接管理、数据查询和更新等核心操作。通过这种封装,开发者可以更加便捷地在Java应用中集成和使用Cassandra。// 示例代码:连接 Cassandra 数据库并进行数据查询通过上述示例代码,我们可以看到,通过Cassandra JDBC Wrapper,开发者可以像使用传统关系型数据库一样,使用Statement和ResultSet进行数据库查询操作。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 一种简单程序的快速数据访问解决方案

Greg Travis(mito@panix.com)
自由程序员
2001 年 8 月

JDBC 提供了一种强大、全面的接口用来从 Java 程序访问数据库。对于较小的项目来说,使用 JDBC 似乎是理所当然的,它使一些程序员避免了同时使用数据库。本文描述了一种简单的包装器库,它让使用简单的数据库易如反掌。您会发现您已经开始想在编写的每一个程序中都使用 JDBC。

事情发生得很突然。您正在修改一个程序,您原以为它是个小程序,不料竟发现它已经迅速增长成为一个庞大的东西 — 一个项目 — 而现在您已到了需要保存一些数据的时候了。

问题是,您并不是有意让程序发展到这种程度的。 您只是不由自主地做了一小部分修改。您并没有真正准备要存储或装入。而且,您的程序是个 applet,而 applet 是无法存储或装入的。

可以存储或装入它们吗?

实际上,JDBC API 允许任何 Java 程序 — 甚至是 applet — 连接到关系型数据库(RDBMS)上。 不幸的是,JDBC 对您的小程序来说可能有一点头重脚轻了。毕竟,如果您希望做的只是存储一点点数据的话,RDBMS 是一个强大、复杂的系统。

在本文中,我们将分析一个简单的使用 JDBC 的抽象层。对于简单的应用程序来说,它可以让您只用几行代码就实现存储和装入结构化数据。它不会处理复杂的 RDBMS 使用,但那正是我们要避免的,不是吗?

JDBC 的复杂性
JDBC 使用起来可能是一个复杂的 API。它不仅必须支持整个强大的 SQL 标准,还必须很好地隐藏不同数据库引擎之间的区别。

JDBC 的复杂还在于关系型数据库是基于 SQL 构建的,而 SQL 是要给人用的,而不是给程序用的。直接使用 JDBC 有点象同时用两种语言编程。

虽然 JDBC 的这些方面并不是什么坏事,但它们确实与我们的目标 — 快速地存储少量数据相冲突。

简化的抽象
我们将创建一个简单的抽象层,让您不必顾虑所有繁琐的细节问题来直接使用 JDBC。如果您早已熟悉 JDBC 或关系型数据库了,那您一眼看到我们的类列表应该是很熟悉的:

    • Database
    • Table
    • RowSet
    • Row

我们这里不是在作任何实质性的事情;我们的数据模型本质上和关系型模型是一样的,但去掉了烦人的细节(同时去掉了强大的功能)。每一个类映射到一个基本的 RDBMS 概念上,同时也映射到一个 JDBC 类上。就是这种映射让我们的 API 可以在保持易用性的同时保留它的相关特性。

这种 API 的设计是基于对我们的数据存储需要的设想。如果您发现自己的程序需要一点不同的地方,您可以随意地改变这种抽象以适应您的情况。 这些类可以被认为是一种简化您工作的模式,而不是一成不变的规则。

如果您不熟悉 SQL 或者 RDBMS 技术,不必害怕。 下面的四节中,每一节都会帮助您熟悉我们的一个类,还有这些类映射到的 RDBMS 功能。

Database 类
当使用 JDBC 与数据库建立连接时,您必须告诉 JDBC 在何处可以找到实际的数据。 因为不同的数据库引擎有不同的访问方法和描述这些方法的不同语法,所以有不止一种方法来指定数据源。 在 JDBC 中,统一资源标识符(Uniform Resource Identifier,URI)字符串是用来指定数据源的,而这个字符串的结构是依赖于数据库的。

Database 类的主要目的就是封装这个字符串,还有建立连接操作时可能需要的任何用户名/密码信息。

下面是如何创建一个 Database 对象的方法:



  Database db =

    new Database( "jdbc:postgresql://localhost/mito",

      "mito", "" );

构造函数的第一个参数是数据源的 URI。 在这个示例中,我使用了 PostgreSQL 数据库引擎,而且在本机上访问了一个名为 mito 的数据库。 另外,我指定我的用户名 mito 和一个空的密码分别作为第二个和第三个参数。

一旦您创建了 Database 对象,您就可以使用它来访问数据,如我们在下一章可以看到的一样。

Table 类
我们在 API 中对简化的一个设想就是,当您从表的一行读取数据时,您会得到整行的数据。换句话说,表的一行是作为读写单独一块数据的最小单位。这并不十分有效,但效率不是我们方法中所首要考虑的。

Talbe 类让您可以读写这些行对象。您必须做的第一步是创建一个表对象,它简单得只要知道它的名称即可:



  Table table = db.getTable( "employee" );

创建 Table 对象的操作实际上并没有做任何事,只是让对象记住自己的名称。要做一些实际的事,我们就需要实际地使用这个 Table 对象了。在这里,我们从表中读取一行。



  Row row = table.getRow( "id=101");

注意,我们已经指定了我们只需要那些‘id’值设定为‘101’的行。通过使用 getRow() 方法,我们假定只有一行符合这个条件。在另外的情况下,我们可能需要多个行,那样我们就需要这样使用 getRows() 方法:



  RowSet rows = table.getRows( "id<103" );

在这种情况下,返回的值是一个 RowSet,而不是一个 Row。RowSet 就是 Row 的一个集合。

在接下来的两节里,我们将讨论 Row 和 RowSet 类。

Row 类
在我们的抽象中,Row 是在 RDBMS 中表示表中一行的名称/值对的集合。不同于 RDBMS 值可以是不同的类型,Row 仅包含一种类型,即字符串类型。 这还是为了让事情简单一点 — 我们假定您不需要字符串类型提供的任何更强大的功能。

一旦您有了一个 Row,就很容易从其中取出一个值,正如我们在清单 1 中看见的一样。

清单 1. 从 Row 中获取值



  Row e = table.getRow( "id=100" );

  String name = e.get( "name" );

  System.out.println( "Employee name: " name );

还要注意的是 Row 是排序的,这样您就可以通过索引来取出名称/值的对。清单 2 中给出了这样的一个示例。

清单 2. 迭代整个 Row



  Row e = table.getRow( "id=100" );

  for (int i=0; i<e.length();   i) {

    String key = e.getKey( i );

    String value = e.get( i );

    System.out.println( key " = " value );

  }

当然,您还可以改变 Row 中的值。这是在数据库中更改数据所必需的 — 稍后我们会看到这一点。

RowSet 类
记住有一些查询可以返回多个 Row,这样的话您就会得到一个 RowSet。RowSet 有一点不同于基于 Vector 的包装器。你可以轻易地迭代 RowSet 中所有的 Row,在清单 3 中可以看到这一点。

清单 3. 迭代整个 RowSet



  RowSet rs = table.get( "id<104" );

  for (int i=0; i<rs.length();   i) {

    Row row = rs.get( i );

    // do something with the row....

  }

一个完整的示例
现在我们已经看过了所有的类,让我们来看一个完整的示例吧。在清单 4 中,我们将抽取出符合特定条件的一套记录,然后打印出它们的值。

清单 4. 一个读取数据的完整示例



    // First, get all rows meeting the criterion

    RowSet rs = table.getRows( "id<103" );

    // Iterate through the set

    for (int i=0; i<rs.length();   i) {

      // Grab each row in turn

      Row row = rs.get( i );

      // Get and print the value of the "name" field

      String name = row.get( "name" );

      System.out.println( "Name: " name );

    }

如此容易!在下一节中,我们将看看怎样向数据库写入数据。

修改数据
正如前面所提到的,使用我们的 API 读写数据是以整个行为单位的。为了向数据库写入数据,您必须创建(或修改)Row 对象,然后向数据库写入那个 Row 对象。

向数据库写入数据是通过使用 Table 中的 putRow 方法。这种方法有两种变体:

    • public void putRow( Row row )
    • public void putRow( Row row, String conditions )

这两种变体分别对应于 SQL 中的 INSERT 和 UPDATE 命令。

在第一个变体中,写一行意味着将一个全新的行插入表中。

在第二个变体中,写一行意味着修改一个现有的行。conditions 参数使您能够指定您想要修改的是哪一行(哪些行)。

让我们来看看每种方法的一个示例。

插入一个新行
插入一个新行很简单,因为您不必指定要修改的行(一行或多行)。您只是简单地把行插入:



  table.putRow( row );

您可以重新创建一个 Row,如清单 5 所示。

清单 5. 重新创建一个 Row



  // Create an empty row object

  Row row = new Row();

  // Fill it up with data

  row.put( "id", "200" );

  row.put( "name", "Joey Capellino" );

或者,您可以修改一个以前曾经从数据库中读取的一个现有的行,如清单 6 所示。

清单 6. 修改现有的 Row



  // Grab a row from the database

  Row row = table.getRow( someConditions );

  // Change some or all of the fields

  row.put( "name", "Joey Capellino" );

虽然通常是在插入时重新创建 Row,更新时使用现有的 Row,实际上您可以用任何方式来进行。

更新现有的行
正如前面的部分提到的,对于您如何创建用来更新的 Row 是没有限制的。 但是,通常您是使用一个刚从数据库中读出的 Row。

为了详细描述这一点,我们将使用一个示例(在该例子中我们读出一个员工的姓名),改变这个名字,然后将更改后的结果写回数据库,如清单 7 所示。

清单 7. 通过修改 Row 进行更新



    Row row = table.getRow( "id=104" );

    row.put( "name", newName );

    table.putRow( row, "id=104" );

注意我们必须在调用 putRow() 中指定条件。这样才会使调用成为更新,而不是插入。

注意,这个调用将更新所有符合条件的行,而不是其中的一行。

结论
在本文中,我们初步认识了一种通过 JDBC 包提供一种简化的通往关系型数据库接口的 API。这种抽象保留了 JDBC 接口的很多基本关系型功能,但对其进行了简化,从而让使用非常地方便。这种简化是以效率为代价的,但当目标是简单性时,这并不是一个令人惊奇的结果。

参考资料

关于作者
Greg Travis 是居住在纽约的一个自由程序员。他对计算机的兴趣可能是源于“ Bionic Woman”中的一段情节 - Jamie 四处奔跑,试图逃离一所灯光和门都被邪恶的人工智能所控制的房子,人工智能还通过扬声器嘲笑她。他是一个传统观念的虔诚信徒 - 如果一个计算机程序能够工作,那完全是个巧合。可以通过 mito@panix.com 与他联系。
java JDBC包装类 对java的jdbc进行简单的封装,在连接不同数据库(如:mysq、sqlserver、oracle)时只需要改动一下propoties配置文件,供java初学者参考 立即下载

相关推荐

从CORDIC到DDS:手把手拆解《Verilog传奇》第9章的实战项目(附可跑通的代码)

本文详细解析了如何从CORDIC算法到DDS系统的完整实现过程,基于《Verilog传奇》第9章的实战项目,提供了可运行的Verilog代码。内容涵盖CORDIC算法的硬件实现、DDS系统架构设计、完整系统集成与验证,以及实际部署中的性能调优技巧,适合数字IC和FPGA开发者深入学习。

weixin_42623010的博客 415

数据库JDBC包装实现

定义增删改查的接口 package cn.com.aistudynet.base; /** * 该接口表示数据库配置信息 */ public interface Config { /** * 数据库加载驱动 */ String drive = "com.mysql.cj.jdbc.Driver"; /** *数据库电脑所在的ip地址 */ String ip="localhost"; /** * 数据库在

abc98526的博客 1083

麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录

本文详细介绍了麒麟V10服务器在多硬盘环境下的手动分区策略,包括/boot、swap和/根目录的优化分配方案。通过SSD与HDD混合存储架构的合理规划,提升系统性能和运维效率,适用于企业级定制化系统部署需求。

weixin_26976635的博客 410

[转载]一个简单的JDBC包装器

一个简单的JDBC包装器JDBC 提供了一种强大、全面的接口用来从 Java 程序访问数据库。对于较小的项目来说,使用 JDBC 似乎是理所当然的,它使一些程序员避免了同时使用数据库。本文描述了一种简单的包装器库,它让使用简单...

congji3817的博客 272

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1202

OpenWRT二级路由DHCP客户端配置:实现IPv4 WAN自动获取与网段隔离

本文详细讲解了如何将OpenWRT配置为二级路由器,重点在于设置其WAN口为DHCP客户端以自动获取IPv4地址,并修改LAN口网段实现与上级网络的隔离。文章提供了从网络拓扑规划、具体配置步骤到防火墙设置的完整指南,并分享了常见问题排查与避坑经验,帮助用户构建稳定且功能独立的家庭网络环境。

weixin_29268267的博客 294

JDBC包装类

package com.qf.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStream

QING 474

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

对一个简单的 JDBC 包装器的扩展及应用

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 365

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

拿到多组学的数据后一直在找合适的方法将二者进行关联,比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析,直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图,效果还不错,于是写个过程记录自用。这里演示的是属水平的差异菌群相对丰度(宏基因组结果)与代谢组鉴定到的差异代谢物进行关联。先是计算相关性生成graphml格式文件使用Gephi软件进行可视化。

twocanis的博客 6789

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8714

java数据库jar,使用Java .jar文件提供数据库?

I want to create a program which users run just by running a .jar file. I want this program to have access to a database, which is pre-filled with some data when the program is first downloaded, and a...

weixin_32667439的博客 239

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 492

Golang JDBC 驱动包装器:GDBC

Golang JDBC 驱动包装器:GDBC 1. 项目介绍 GDBC 是一个 Golang 的 JDBC 驱动包装器,它允许用户在 Go 程序中加载和使用 JDBC Java 数据库驱动,而无需依赖 Java 环境。通过使用 GraalVM 将 Java 驱动程序打包为本地库,并通过 CGO 与其通信,GDBC 能够为那些没有或有不完整或不支持 Go 驱动的数据库提供支持。目前支持 Micros...

gitblog_00292的博客 510

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java-Wrapper-包装器-JDBC-代理

所有方法接口方法抽象方法boolean> iface)如果对象实现了接口inface,或者直接或间接地为一个iface对象的包装器,则返回true。<T> T返回一个实现接口iface的对象,以允许访问非标准方法,或代理对象没有暴露的标准方法。

Java程序员的知识博客 1255

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

我们正在破解JDBC,因此您不必

我们喜欢使用JDBC 没人说。 曾经 更严重的是,如果考虑一下,JDBC实际上是一个非常出色的API。 这也可能是Java成为当今流行平台的原因之一。 在JDK 1.1之前,以及在ODBC之前(这已经很久了),很难想象有任何平台可以完全标准化数据库访问。 哎呀, SQL本身在当时甚至还没有标准化,并且Java随JDBC一起出现了,JDBC是一个简单的API,在日常工作中您只需要了解以下几点:...

cunhu4317的博客 95

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怎么解决JDBC读ORACLE的乱码问题

怎么解决JDBC读ORACLE的乱码问题 摘要: 怎么解决JDBC读ORACLE的乱码问题 ORACLE的字符集为US7ASCII,用ORACLE JDBC读的时候会有乱码,请问如何解决? 我知道可以用转码方式来解决new String(rs.getString("name").getBytes("ISO8859-1"),"GBK"); 但比较烦,有没有其他的更好的方式来解决这个问

haiross的专栏 2万+

[转载]使用通用 SQL 实体 EJB 包装器来简化 EJB 开发

使用通用 SQL 实体 EJB 包装器来简化 EJB 开发Enterprise JavaBeans(EJB)的设计旨在减少企业应用程序的开发时间,但是有可能因为滥用 EJB 而导致最终开发出来的应用程序难以维护而且性能低下。本...

congji3817的博客 207

Amazon Web Services (AWS) JDBC Driver:解锁云数据库的无限可能

Amazon Web Services (AWS) JDBC Driver:解锁云数据库的无限可能 项目介绍 Amazon Web Services (AWS) JDBC Driver 是一款专为云数据库设计的先进JDBC包装器。它并非直接连接到任何数据库,而是通过扩展现有JDBC驱动程序的功能,使应用程序能够充分利用如Amazon Aurora等集群数据库的特性。该驱动程序支持与PostgreS...

gitblog_00088的博客 651

Clojure.JDBC 使用教程

Clojure.JDBC 使用教程 项目介绍 Clojure.JDBC 是一个用于 Clojure 编程语言的低级 JDBC 包装器,旨在简化与数据库的交互。它提供了一种简洁的方式来执行 SQL 查询和操作数据库,支持多种数据库系统。该项目托管在 GitHub 上,地址为:https://github.com/funcool/clojure.jdbc。 项目快速启动 安装依赖 首先,确保你已经安装...

gitblog_00956的博客 413

jcabi-jdbc:项目的核心功能/场景

jcabi-jdbc:项目的核心功能/场景 jcabi-jdbc 是一个用于简化 JDBC 操作的流畅接口包装器。 项目介绍 jcabi-jdbc 是一个开源的 Java 库,旨在通过提供一个简单、易用的流畅接口(fluent interface)来简化 Java 数据库连接(JDBC)的操作。这个库使得数据库操作变得更加直观,易于编写和维护。它不仅支持标准 JDBC 操作,还提供了一些高级特性,...

gitblog_00995的博客 771

如何在 Java 脚本中有效地使用 JDBC

我想向您介绍一个代码行不到 170 行的 Java类,以方便处理通过 JDBC API 调用的 SQL 查询。是什么让这个解决方案变得有趣?该类可以嵌入到 Java V17 脚本中。使用 Java 脚本Java 脚本的优点是文本格式的易于移植,并且无需事先编译即可运行,同时我们在运行时从该语言的标准库中获得了大量资源。为各种原型提供了脚本的使用,其中可以解决更复杂...

627

【亲测免费】 AWS Advanced JDBC Wrapper 使用教程

AWS Advanced JDBC Wrapper 使用教程 1. 项目介绍 AWS Advanced JDBC Wrapper 是一个高级的 JDBC 包装器,旨在扩展现有 JDBC 驱动程序的功能,帮助应用程序充分利用集群数据库(如 Amazon Aurora)的特性。该项目由 Amazon Web Services (AWS) 开发并开源,基于 Apache 2.0 许可证发布。 该包装器不...

gitblog_00309的博客 1207
上一篇: Tomcat - 简明用户手册
下一篇: 配置Web应用环境实现JSP留言簿
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值