JDBC一(web基础学习笔记七)
一、JDBC
Java数据库的连接技术(Java DataBase Connectivity),能实现Java程序以各种数据库的访问
由一组使用Java语言编写的类和接口(JDBC API)组成,它java.sql以及javax.sql中
二、JDBC 原理以及驱动程序的分类
2.1、JDBC 原理
原来的 SUN 公司(现在是Oracle 公司)在开发JDBC API 时,将这些接口和类放在了两个包中,java.sql 包和javax.sql 包中。而主要的接口和类都是在java.sql 包中,javax 包叫做扩展包,javax.sql 包中有一些关于数据源、连接池和其他的一些扩展的接口和类。JDBC 中最常用的几个接口和类是 DriverManager 类、Connection 接口、Statement 接口、ResultSet 接口,DriverManager 这个类是管理驱动程序的,可以获得数据库连接对象。JDBC的驱动程序是实现了JDBC API 接口的类,由数据库厂商来提供,所以我们在使用JDBC 连接数据库的时候,需要导入数据库的驱动包,连接不同的数据库,需要导入不同的包。而我们在编写Java 应用程序时,基本上不用太关心这些包中的类。我们只需要用JDBC 的接口进行编程就可以了,也就是java.sql 包和javax.sql 包中的接口。这些接口的对象都是通过其他对象来获得的,我们不需要通过new 来创建它们。而这些对象的具体实现都是在驱动程序中实现的,是驱动程序类的对象。
2.2、驱动程序分类
- JDBC 驱动有四种,常用的JDBC 驱动有两种。在个人开发与测试中,可以使用JDBC-ODBC桥连方式,
- 在生产型开发中,推荐使用纯Java 驱动方式。
2.3、通过JDBC-ODBC 桥
通过JDBC-ODBC 桥,开发者可以使用JDBC 来访问一个ODBC 数据源。JDBC-ODBC 桥驱动程序为Java 应用程序提供了一种把JDBC 调用映射为ODBC 调用的方法。只要本地机装有相关的ODBC 驱动,那么采用JDBC-ODBC 桥几乎可以访问所有的数据库。但是,由于JDBC-ODBC 先调用ODBC 再由ODBC 去调用本地数据库接口来访问数据库。所以,执行效率比较低,对于那些大数据量存取的应用是不适合的。而且,这种方法要求客户端必须安装ODBC 驱动,所以对于基于internet 和intranet 的应用也是不合适的。因为,你不可能要求所有客户都能找到ODBC 驱动。
使用JDBC-ODBC 进行桥连步骤如下:
1、配置数据源:控制面板→管理工具→ODBC 数据源→系统DSN
2、编程,通过桥连方式与数据库建立连接
2.4、纯Java 驱动
纯Java 驱动直接把JDBC 调用转换为符合相关数据库系统规范的请求。用这种驱动编写的应用程序可以直接和数据库服务器通讯。这种类型的驱动完全由Java 实现,因此实现了平台独立性。
由于纯Java 驱动不需要先把JDBC 的调用传给ODBC 或本地数据库接口或者是中间层服务器,而是将JDBC 调用直接转换为DBMS 所使用的网络协议,所以它的执行效率是非常高的。这种驱动程序可以动态的被下载。但是它有一个缺点,就是对于不同的数据库,需要下载不同的驱动程序。
使用纯Java 驱动方式进行直连的步骤:
1、下载数据库厂商提供的驱动程序包
2、将驱动程序包引入工程中
3、编程,通过纯Java 驱动方式与数据库建立连接
三、JDBC 编程步骤
要使用 JDBC 连接和操作数据库,有一套固定的步骤。依照这些步骤,可以保证你正确的连接到数据库并且操作它。
- 第一步是注册驱动,Class.forName()方法将驱动程序类加载到虚拟机的内存中。
- 第二步是获得数据库的连接,是使用DriverManager 类的getConnection()方法来获得的,同时需要在参数中给出连接数据库的URL 和用户名、密码。这一步将得到一个数据 库连接对象,是Connection 类型的。
- 第三步是用数据库连接对象获得一个Statement 对象,这个对象可以用来执行SQL 语句。
- 第四步就是用Statement 对象执行SQL 语句了。其实,说是用Statement 对象来执行SQL还不够准确,因为SQL 语句只能被数据库来执行,Statement 只是负责发送SQL 和接收结果。但是不管是谁在执行,这一步都将执行SQL 语句。
- 第五步是处理执行结果,如果是更新的操作,可能是判断一下是否更新成功,如果是查询的操作,可能就是输出查询结果等等。
- 最后,一定要记得释放数据库的连接。因为数据库的连接是一个重量级的对象。如果是多用户并发访问的应用程序,比如B/S 应用程序,每个用户都是只连接但不释放,将不断耗费服务器的资源直至服务器down 机。
四、JDBC API 介绍
JDBC 的API 中主要定义了一些连接和操作数据库的接口,而具体的类却很少。这是因为,在开发Java 的API 的时候,不可能让JDBC 连接某个具体的数据库,而只能确定一组规范。而连接具体数据库的实现,应该由数据库的厂商来做。通过统一的JDBC 规范,使得我们在连接各种数据库的时候,编码的方式是一样的,这样更利于代码的复用和移植.
从上面JDBC 编程步骤中可以看出,使用JDBC 操作数据库需要依赖几个主要的JDBC API,接下来介绍这几个JDBC API 的使用
4.1、DriverManager 类是用来管理数据库驱动的
java.sql 包中大多数都是接口,这是为数不多的类之一。它是非常常用的一个类,最主要的功能就是获得数据库的连接,它定义了三个连接数据库的方法,差别在参数的数量上。三个参数的getConnection()方法是最常用的。三个参数分别是数据库的URL、用户名和密码。
返回类型 | 方法签名 | 说明 |
static Connection | getConnection(String url) |
试图建立到给定数据库 |
static Connection |
getConnection(String url, |
试图建立到给定数据库 |
static Connection |
getConnection(String url, |
试图建立到给定数据库 |
4.2、java.sql.Connection 接口表示应用程序与数据库的连接对象
由数据库厂商来实现,获得Connection 对象的方法是通过DriverManager 类的getConnection()方法。通过Connection 对象, 我们可以获得操作数据库的Statement 、PreparedStatement ,CallableStatement 等对象。这些对象是用来执行SQL 和存储过程的
4.3、Statement 接口的对象是用来执行SQL 语句的,而且是执行静态的SQL 语句
Statement 接口的对象是用来执行SQL 语句的,而且是执行静态的SQL 语句。所谓的静态SQL 语句,是指SQL 语句由一个固定的SQL 字符串确定,运行期不能修改参数
返回类型 | 方法签名 | 说明 |
int |
executeUpdate(String sql) |
执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或DELETE |
ResultSet |
executeQuery(String sql) |
执行给定的 SQL 语句,该语句返回单个 ResultSet 对象 |
void |
close() |
立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等 |
4.4、ResultSet 接口用来表示查询结果集
当我们调用Statement 的executeQuery()方法时,就会得到一个ResultSet 的对象。ResultSet 对象中包含根据查询语句查询出来的一个结果集,但是,实际上这些内容还是在数据库当中,还并没有真正的取出到虚拟机的内存中。ResultSet 其实是保存了一个指向其当前数据行的游标,我们需要使用ResultSet 的方法让游标一行一行的向下移动,然后获取每一行的数据,所以在操作ResultSet 对象期间,数据库连接不能关闭。
返回类型 | 方法签名 | 说明 |
boolean | next() | 将CURSOR(游标)从当前位置向前移一行 |
Type |
getType(String columnLabel) |
根据数据库表的列名得到指定列的值 |
Type |
getType(int columnIndex) |
根据列的序号得到指定列的值,第一列的序号是1。 |
void | close() |
立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该 |
五、java.sql
5.1、java.sql描述
编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。此 API 包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。尽管 JDBCTM API 主要用于将 SQL 语句传递给数据库,但它还可以用于以表格方式从任何数据源中读写数据。通过接口的 javax.sql.RowSet
组可以使用的 reader/writer 实用程序,可以被定制以使用和更新来自电子表格、纯文本文件或其他任何表格式数据源的数据
5.2、java.sql内容
java.sql
包中包含用于以下方面的 API:
- 通过
DriverManager
实用程序建立与数据库的连接DriverManager
类:建立与驱动程序的连接SQLPermission
类:当代码在 Security Manager(比如 applet)中运行时提供权限,试图通过DriverManager
设置一个记录流Driver
接口:提供用来注册和连接基于 JDBC 技术(“JDBC 驱动程序”)的驱动程序的 API,通常仅由DriverManager
类使用DriverPropertyInfo
类:提供 JDBC 驱动程序的属性,不是供一般用户使用的
- 向数据库发送 SQL 语句
Statement
:用于发送基本 SQL 语句PreparedStatement
:用于发送准备好的语句或基本 SQL 语句(派生自Statement
)CallableStatement
:用于调用数据库存储过程(派生自PreparedStatement
)Connection
接口:提供创建语句以及管理连接及其属性的方法Savepoint
:在事务中提供保存点
- 获取和更新查询的结果
ResultSet
接口
- SQL 类型到 Java 编程语言中的类和接口的标准映射关系
Array
接口:SQLARRAY
的映射关系Blob
接口:SQLBLOB
的映射关系Clob
接口:SQLCLOB
的映射关系Date
类:SQLDATE
的映射关系NClob
接口:SQLNCLOB
的映射关系Ref
接口:SQLREF
的映射关系RowId
接口:SQLROWID
的映射关系Struct
接口:SQLSTRUCT
的映射关系SQLXML
接口:SQLXML
的映射关系Time
类:SQLTIME
的映射关系Timestamp
类:SQLTIMESTAMP
的映射关系Types
类:提供用于 SQL 类型的常量
- 自定义映射 SQL 用户定义类型 (UDT) 到 Java 编程语言中的类
SQLData
接口:指定 UDT 到此类的一个实例的映射关系SQLInput
接口:提供用来从流中读取 UDT 属性的方法SQLOutput
接口:提供用来将 UDT 属性写回流中的方法
- 元数据
DatabaseMetaData
接口:提供有关数据库的信息ResultSetMetaData
接口:提供有关ResultSet
对象的列的信息ParameterMetaData
接口:提供有关PreparedStatement
命令的参数的信息
- 异常
SQLException
:由大多数方法在访问数据出问题时抛出,以及因为其他原因由其他一些方法抛出SQLWarning
:为了指示一个警告而抛出DataTruncation
:为了指示数据可能已经被截断而抛出BatchUpdateException
:为了指示并不是批量更新中的所有命令都成功执行而抛出
六、JDBC 4.0
JDBC 4.0 API 中引入的 java.sql
和 javax.sql
特性
- 自动 java.sql.Driver 发现:不再需要通过
Class.forName
来加载java.sql.Driver
类 - 添加了国家字符集 (National Character Set) 支持
- 为 SQL:2003 XML 数据类型添加的支持
- SQLException 增强:为原因链添加的支持;为公用 SQLState 类值代码添加新 SQLException
- 增强的 Blob/Clob 功能:提供创建和释放 Blob/Clob 实例以及为了提高可访问性所添加的一些其他方法
- 为访问 SQL ROWID 添加的支持
- 添加的支持,允许 JDBC 应用程序访问已被供应商包装的 JDBC 资源实例,通常在一个应用程序服务器或连接池环境中。
- 当与
PooledConnection
关联的PreparedStatement
已关闭或驱动程序确定为无效时要通知的可用性
JDBC一(web基础学习笔记七)的更多相关文章
- JDBC四(web基础学习笔记十)
一.增加 .修改.删除.查询 将功能整合在一个类中 package pb.base; import java.sql.Connection; import java.sql.DriverManager ...
- JDBC三(web基础学习笔记九)
一.JDBC编程步骤 二.将数据库的信息放入资源文件 // (1)使用Class.forName来导入drive Class.forName("oracle.jdbc.driver.Orac ...
- JDBC五数据源和数据池(web基础学习笔记十一)
一.为什么使用数据源和连接池 现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接. ...
- JDBC二查询(web基础学习笔记八)
一.建立数据库 --创建news表空间 CREATE TABLESPACE tbs_news DATAFILE 'F:\ORACLE\news.dbf' SIZE 10M AUTOEXTEND ON; ...
- Java基础学习笔记七 Java基础语法之继承和抽象类
继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...
- 过滤器(web基础学习笔记二十一)
一.过滤器简介 二.在Eclipse中创建过滤器 三.使用过滤器设置全部web字符编码 public void doFilter(ServletRequest request, ServletResp ...
- Servlet一(web基础学习笔记二十)
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- EL运算符(web基础学习笔记十七)
一.EL语法 1.1.语法结构 ${expression} 1.2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一 ...
- JavaBean(web基础学习笔记十二)
一.JavaBean简介 JavaBean是使用Java语言开发的一个可重用的组件,在JSP的开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更简洁.JSP搭配JavaBean来使用 ...
随机推荐
- wikioi 1434 孪生素数 水题、素数模版
1434 孪生素数 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 输出100以内的所有相差6的孪生素数:如, 5 11 7 13 ...
- Jmeter学习之— 参数化、关联、断言、数据库的操作
一. Jmeter参数化1. 文件参数化解释:创建测试数据,将数据写入TXT文件文件中,然后Jmeter从文件中读取数据.例如用户注册操作:1. 首先在Jmeter下创建一个线程组,如下图: 2. 然 ...
- IO流-批量修改文件名称案例
/* * 源文件名: 桌面-我们今天学习IO流了哈哈哈哈-001.jpg * 修改后文件名: 桌面-000x.jpg */public class File_listFiles_upda ...
- tomcat+java的web程序持续占cpu问题调试
原文出处:http://www.blogjava.net/hankchen 现象: 在tomcat中部署java的web应用程序,过一段时间后出现tomcat的java进程持续占用cpu高达100%, ...
- WINDOWS 的 MKLINK : 硬链接,符号链接 : 文件符号链接, 目录符号链接 : 目录联接
玩转WIN7的MKLINK 引言: 换了新电脑,终于再次使用上啦WIN7 ,经过一个周每天重装N次系统,... ... ... ... 在xp系统下,junction命令要用微软开发的小程序 junc ...
- Swift教程之枚举语法
import Foundation //MARK:-------枚举语法----------- //不像 C 和 Objective-C 一样.Swift 的枚举成员在被创建时不会被赋予一个默认的整数 ...
- js单例模式详解实例
这篇文章主要介绍了什么是单例单例模式.使用场景,提供了3个示例给大家参考 什么是单例? 单例要求一个类有且只有一个实例,提供一个全局的访问点.因此它要绕过常规的控制器,使其只能有一个实例,供使用者使用 ...
- android studio 引用aar
在:libs拷贝对应的文件 build.gradle repositories { flatDir { dirs 'libs' }}dependencies { // c ...
- Extjs文件选择器
Ext.hoo.component.FileBrowserComponent.js /** * Ext.hoo.component.FileBrowserWindow 系统文件浏览选择组件,可以选定电 ...
- CMMI之功能点估算法---内部逻辑文件和外部接口文件
功能点分析的步骤 在本文中将以国际标准IFPUG(International Function Point Users Group)组织提供的功能点估算法V4.1.1为基础与大家进行讲解.如下图所示, ...