学习Java JDBC,看这篇就够了

JDBC (Java DB Connection)---Java数据库连接

JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口)。它由一些Java语言编写的类和界面组成。

JDBC为数据库应用开发人员和数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯JAVA语言编写完整的数据库应用程序。

JDBC代表JAVA数据库连接。它是一个软件层,允许开发者在JAVA中编写客户端/服务器应用。

一、ODBC到JDBC的发展历程

ODBC是OpenDatabaseConnectivity的英文简写。它是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的,用C语言实现的,标准应用程序数据接口。通过ODBCAPI,应用程序可以存取保存在多种不同数据库管理系统(DBMS)中的数据,而不论每个DBMS使用了何种数据存储格式和编程接口。

1.ODBC的结构模型

ODBC的结构包括四个主要部分:应用程序接口、驱动器管理器、数据库驱动器和数据源。

应用程序接口:屏蔽不同的ODBC数据库驱动器之间函数调用的差别,为用户提供统一的SQL编程接口。

驱动器管理器:为应用程序装载数据库驱动器。

数据库驱动器:实现ODBC的函数调用,提供对特定数据源的SQL请求。如果需要,数据库驱动器将修改应用程序的请求,使得请求符合相关的DBMS所支持的文法。

数据源:由用户想要存取的数据以及与它相关的操作系统、DBMS和用于访问DBMS的网络平台组成。

虽然ODBC驱动器管理器的主要目的是加载数据库驱动器,以便ODBC函数调用,但是数据库驱动器本身也执行ODBC函数调用,并与数据库相互配合。因此当应用系统发出调用与数据源进行连接时,数据库驱动器能管理通信协议。当建立起与数据源的连接时,数据库驱动器便能处理应用系统向DBMS发出的请求,对分析或发自数据源的设计进行必要的翻译,并将结果返回给应用系统。

2.JDBC的诞生

自从Java语言于1995年5月正式公布以来,Java风靡全球。出现大量的用java语言编写的程序,其中也包括数据库应用程序。由于没有一个Java语言的API,编程人员不得不在Java程序中加入C语言的ODBC函数调用。这就使很多Java的优秀特性无法充分发挥,比如平台无关性、面向对象特性等。随着越来越多的编程人员对Java语言的日益喜爱,越来越多的公司在Java程序开发上投入的精力日益增加,对java语言接口的访问数据库的API的要求越来越强烈。也由于ODBC的有其不足之处,比如它并不容易使用,没有面向对象的特性等等,SUN公司决定开发一Java语言为接口的数据库应用程序开发接口。在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就是JDBCAPI)就成为Java语言的标准部件。

二、JDBC技术概述

JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface,应用程序设计接口)。

通过使用JDBC,开发人员可以很方便地将SQL语句传送给几乎任何一种数据库。也就是说,开发人员可以不必写一个程序访问Sybase,写另一个程序访问Oracle,再写一个程序访问Microsoft的SQLServer。用JDBC写的程序能够自动地将SQL语句传送给相应的数据库管理系统(DBMS)。不但如此,使用Java编写的应用程序可以在任何支持Java的平台上运行,不必在不同的平台上编写不同的应用。Java和JDBC的结合可以让开发人员在开发数据库应用时真正实现“WriteOnce,RunEverywhere!”

Java具有健壮、安全、易用等特性,而且支持自动网上下载,本质上是一种很好的数据库应用的编程语言。它所需要的是Java应用如何同各种各样的数据库连接,JDBC正是实现这种连接的关键。

JDBC扩展了Java的能力,如使用Java和JDBCAPI就可以公布一个Web页,页中带有能访问远端数据库的Ap plet。或者企业可以通过JDBC让全部的职工(他们可以使用不同的操作系统,如Windwos,Machintosh和UNIX)在In tranet上连接到几个全球数据库上,而这几个全球数据库可以是不相同的。随着越来越多的程序开发人员使用Java语言,对Java访问数据库易操作性的需求越来越强烈。

JDBC API定义了一组用于与数据库通信的接口和类。这些接口和类位于java.sql包中。

JDBC是用来(让我们的程序)通过网络来操作数据库的,作用很重要;JDBC技术也是Java核心技术之一。凡是需要用网络操作数据库的程序,JDBC编程有问题,一切都是白搭。

三、JDBC技术及使用详解

从结构图中可以看出,通过JDBC API 让我们的Java应用程序可以利用JDBCDriver Manager[JDBC驱动管理],连接到JDBC驱动;体现在我们的工程中也就是要导入驱动jar包。

何谓驱动?

不同的数据库厂商或者同一厂商的不同数据库版本都会提供不同的驱动,任何应用程序都是通过这个驱动来操作特定厂商、特定版本的数据库的。

使用JDBC的第一步就是要注册(加载)这个驱动。

JDBC驱动程序的分类

第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。

这类驱动一般不用现在的编程应用中。

第二类JDBC驱动程序是部分JAVAAPI代码的驱动程序,用于把JDBC调用转换成主流数据库API的本机调用。

第三类JDBC驱动程序是面向数据库中间件的纯JAVA驱动程序,JDBC调用被转换成一种中间件厂商的协议,中间件再把这些调用转换到数据库API。

第四类JDBC驱动程序是直接面向数据库的纯JAVA驱动程序。

是使用JDBC驱动程序访问数据库的首选方式

通过JDBC操作数据库——步骤:

第1步:注册驱动 (只做一次)

第2步:建立连接(Connection)

第3步:创建执行SQL的语句(Statement)

第4步:执行语句

第5步:处理执行结果(ResultSet)

第6步:释放资源

使用JDBC第一步:加载驱动

注册驱动有三种方式:

1.      Class.forName(“com.mysql.jdbc.Driver”);

推荐这种方式,不会对具体的驱动类产生依赖

2. DriverManager.registerDriver(com.mysql.jdbc.Driver);

会对具体的驱动类产生依赖

3. System.setProperty(“jdbc.drivers”, “driver1:driver2”);

虽然不会对具体的驱动类产生依赖;但注册不太方便,所以很少使用

使用JDBC第二步:建立连接

通过Connection建立连接,Connection是一个接口类,其功能是与数据库进行连接(会话)。

建立Connection接口类对象:

Connection conn =DriverManager.getConnection(url, user, password);

其中URL的格式要求为:

JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…

如:"jdbc:mysql://localhost:3306/test“

user即为登录数据库的用户名,如root

password即为登录数据库的密码,为空就填””

使用JDBC第三步:创建执行对象

执行对象Statement负责执行SQL语句,由Connection对象产生。

Statement接口类还派生出两个接口类PreparedStatement和CallableStatement,这两个接口类对象为我们提供了更加强大的数据访问功能。

创建Statement的语法为:

Statement st = conn.createStatement();

使用JDBC第四步:执行SQL语句

执行对象Statement提供两个常用的方法来执行SQL语句。

executeQuery(Stringsql),该方法用于执行实现查询功能的sql语句,返回类型为ResultSet(结果集)。

如:ResultSet  rs =st.executeQuery(sql);

executeUpdate(Stringsql),该方法用于执行实现增、删、改功能的sql语句,返回类型为int,即受影响的行数。

如:int flag = st.executeUpdate(sql);

使用JDBC第五步:处理执行结果

ResultSet对象

ResultSet对象负责保存Statement执行后所产生的查询结果。

结果集ResultSet是通过游标来操作的。

游标就是一个可控制的、可以指向任意一条记录的指针。有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行修改、删除,或者要在哪一条记录之前插入数据。一个结果集对象中只包含一个游标。

使用JDBC 第六步——释放资源

Connection对象的close方法用于关闭连接,并释放和连接相关的资源。

使用JDBC——模板

一些重要的接口----------------------------------------------------------------------------------------------------

PreperedStatement接口

PreperedStatement从Statement扩展而来。

需要多次执行SQL语句,可以使用PreparedStatement。

PreparedStatement可以对SQL语句进行预编译

并且可以存储在PreparedStatement对象中,当多次执行SQL语句时可以提高效率。

作为Statement的子类,PreparedStatement继承了Statement的所有函数。

创建PreperedStatement

PreparedStatementstr=con.prepareStatement("update user set id=? where username=?”);//此处?为通配符

其他的CRUD方法和Statement基本一致。

CallableStatement接口

CallableStatement类继承了PreparedStatement类,他主要用于执行SQL存储过程。

在JDBC中执行SQL存储过程需要转义。

JDBC API提供了一个SQL存储过程的转义语法:

{call<procedure-name>[<arg1>,<arg2>, ...]}

procedure-name:是所要执行的SQL存储过程的名字

[<arg1>,<arg2>, ...]:是相对应的SQL存储过程所需要的参数

ResultSetMeta接口

前面使用ResultSet接口类的对象来获取了查询结果集中的数据。

但ResultSet功能有限,如果我们想要得到诸如查询结果集中有多少列、列名称分别是什么就必须使用ResultSetMeta接口了。

ResultSetMeta是ResultSet的元数据。

元数据就是数据的数据, “有关数据的数据”或者“描述数据的数据”。

ResultSetMeta的使用

获得元数据对象

ResultSetMetaData rsmd=rst.getMetaData();

返回所有字段的数目

public int getColumCount() throwsSQLException

根据字段的索引值取得字段的名称

public String getColumName (int colum)throws SQLException

根据字段的索引值取得字段的类型

public String getColumType (int colum)throws SQLException

PreperedStatement接口和Statement的区别

(1) 使用Statement发送和执行sql语句

Statement stmt = con.creatStatement();//加载时,无参数,不编译sql语句

String sql = "selete * from emp";

ResultSet rs = stmt.executeQuery(sql);//执行时编译sql语句,返回查询结果集

(2) 使用PreparStatement发送和执行sql语句

String sql = "selete * from emp";

PreparStatement ps=con.prepareStatement(sql);//加载时就编译sql语句

ResultSet rs = ps.executeQuery();//此处执行时,不需要传参

还有就是

Statement stmt;支持可以通过字符串拼接(来传递参数),如StringdeleteStu = "delete from student where id="+id;但容易SQL注入

PreparedStatement   ps; 不支持字符串拼接,提供?通配符传递参数,更安全;如String deleteStu = "delete from student where id=?";

ps.setInt(1, id);  //设置第一个?通配值为id

JDBC事务

何谓事务?

所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

事务的ACID属性:

1.       原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2.       一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3.       隔离性(Isolation)事务的隔离性是指一个事务的执行不能被其他事务干扰。

4.       持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

JDBC中使用COMMIT 和 ROLLBACK语句来实现事务。

COMMIT用于提交事务,ROLLBACK用于数据库回滚。

通过这两个语句可以确保数据完整性;数据改变被提交之前预览;将逻辑上相关的操作分组。

RollBack语句数据改变被取消使之再一次事务中的修改前的数据状态可以被恢复。

为了让多个 SQL 语句作为一个事务执行,基本步骤为:

先调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务。

然后在所有的 SQL 语句都成功执行后,调用 commit();

如果在出现异常时,可以调用 rollback();使方法回滚事务。

JTA事务

在实际应用中经常会涉及到多个数据源的不同的连接,并且数据的操作要处于一个事务之中。

如去银行进行转账,转账的两个账户是不同的银行,当然数据的操作就跨数据库了,或者叫处于不同的数据源之中。

跨越多个数据源的事务,就要使用JTA容器实现事务。

在分布式的情况下的JTA容指的是Web容器,大家非常熟悉的Tomcat不能实现JTA的操作。

目前支持JTA的容器有非常著名的BEA公司的 Weblogic,IBM公司的WebSphere等企业级的Web应用服务器。

JTA分成两阶段提交

第一步,通过JNDI在分布式的环境中查找相关资源。

javax.transaction.UserTransactiontx =                                        (UserTransaction)ctx.lookup(“jndiName");

tx.begin()

第二步,提交

tx.commit();

时间: 2024-10-27 16:16:11

学习Java JDBC,看这篇就够了的相关文章

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友),但是转念一想不如来点猛的(考虑到急性子的朋友),让你通过本文的学习就能快速的入门ASP.NET Core.既然是快速入门所以过多过深的内容我这里就一笔带过了!然后在后面的一些列文章中再慢慢的对其中的概念进行阐述. 本文已收录至.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规

学习java随笔第十一篇:java窗体程序

要开java的窗体程序,就要下载开发窗体的工具. 这里我用的是的myeclipse,可以直接在网上下载安装即可. 我用的是10.0版本的,如果需要汉化的话,可以看一下这篇文章:myeclipse.10安装和汉化方法 java窗体 package java20130629; import javax.swing.*; public class Form extends JFrame { public Form() { this.setLayout(null); JLabel jl=new JLab

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情.或者详细点,或者简单点.那么有没有一种快速有效的方法来构建api说明文档呢?答案是肯定的, Swagger就是最受欢迎的REST APIs文档生成工具之一! 为什么使用Swagger作为REST APIs文档生成工具 Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学

学习java随笔第八篇:封装、继承、多态

java和c#一样都是面向对象的语言. 面向对象的语言有三大特征:封装.继承.多态 封装 封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. class Person2 { private String name; public void setName(String name) { this.name=name; } public String getName() { return name; } private String sex; public voi

学习java随笔第七篇:java的类与对象

类 同一个包(同一个目录),类的创建与调用 class Man{ String name; void GetMyName() { System.out.println(name); } } public class Person { public static void main(String arges[]) { Man m=new Man(); m.name="小黄"; m.GetMyName(); } } 运行结果 不同的包(不同目录目录),类的创建与调用 package Peo

学习java随笔第六篇:数组

一维数组 创建一维数组并输出 public class OneDimensionalArray { public static void main(String argas[]) { int i[]=new int[10]; for(int j=0;j<i.length;j++) { i[j]=j; System.out.println(i[j]); } } } 多维数组 创建多维数组并输出 public class MultiDimensional { public static void m

Pycharm新手教程,只需要看这篇就够了

pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版本,Professional(专业版本)」和「社区版」,专业版功能最强大,主要是为 Python 和 web 开发者而准备,是需要付费的.社区版是专业版的阉割版,比较轻量级,主要是为 Python 和数据专家而准备的.一般我们做开发,下载专业版本比较合适. 文章转自:django中文网---Pych

使用Visual Studio Code开发.NET Core看这篇就够了

原文:使用Visual Studio Code开发.NET Core看这篇就够了 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9926078.html 在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发,测试以及调试.尽管Visual Studio Code的部分功能还达不到Visual Studio的水平,但它实际上已经足够强大来满足我们的日常开发.而且其轻量化,插件化

你真的完全了解Java动态代理吗?看这篇就够了

之前讲了<零基础带你看Spring源码--IOC控制反转>,本来打算下一篇讲讲Srping的AOP的,但是其中会涉及到Java的动态代理,所以先单独一篇来了解下Java的动态代理到底是什么,Java是怎么实现它的. 动态代理看起来好像是个什么高大上的名词,但其实并没有那么复杂,直接从字面就很容易理解.动态地代理,可以猜测一下它的含义,在运行时动态地对某些东西代理,代理它做了其他事情.先不去搞清楚这个动态代理真正的含义,我们来举个生动的例子来理解下它到底做了什么. 一个例子 一个程序员Devel