您的位置:首页 > 其它

JDBC学习之基本概念

2009-03-01 09:57 162 查看
一、第一章 基本概念

1、JDBC是什么?能做什么?

JDBC是java访问数据库的基本接口(底层接口);包括 j2se, j2ee

高级的框架或手段 Hibernate,EJB 也是基于jdbc的。

JDBC的功能:

1)可以连接数据库;(服务器) 提供java到数据库的连接;

2)通过SQL命令来操作数据库;JDBC 借助于标准查询语言对数据库进行增删改查;

3)JDBC提供对结果集的封装和处理;

4)支持事务的操作;

2、JDBC产生的背景和基本结构(工作原理):

1)背景:

JDBC应该算是企业的特性,但是放在j2se文档里;

JDBC应该算是java最早的企业级的应用;但是当时还没有j2ee,就放在j2se里了;

因为作为通用的语言必须具有访问数据库的能力,所以在java推出时就有了JDBC;

2)原理:

JDBC仿照ODBC写的;ODBC用类C(C,C++)语言写的;

两层结构:

一层是面向java程序员;

一层是面向驱动程序/driver开发人员:

3)什么是驱动程序?

驱动程序就是将 接口的一致性,实现的多样性 结合起来;

例 :

显卡的驱动,主板上有一个显卡的插槽(公共接口,针脚排列);

操作系统来调用显卡时,只需通过驱动程序来操作那块显卡;

各个厂商的显卡是不同的,但是驱动程序都实现了这个接口;

JDBC是插槽,数据库就是显卡;

驱动程序代表实现;特点是多样性;不同的驱动就是将JDBC和不同的数据库结合起来;

JDBC是一套规范/协议;物理上是JAVA接口集;突出的特点是一致性;

4) 协议:

体现的是sun公司(java程序员)和数据库厂商(驱动的开发者)的协议;

是调用者和实现者的协议;前者是按照规范去调用;后者是按照规范实现;

sun公司定义规范;java程序员写代码调用,数据库厂商实现规范;

为什么JDBC具有一致性?

接口就是实现者和调用者之间的协议,保证一致性;接口不能修改原来的定义,只能增加;

5) 总结:

JDBC是一个由java接口组成的接口集,代表了实现者(数据库厂商)和调用者(java程序员)之间的协议;

只能让操作看起来一致,并没有实现;真正去工作的是驱动;

接口例子:

螺钉、螺母,有工业规范规定的,也是接口;

遥控器,使用者和实现者的分离;实现者工作比使用者相对复杂;

程序、驱动、jdbc接口一起才能有效的工作;

人、电视、遥控器 一起才是看电视;

3、JDBC Driver的四种类型:(不管是哪个厂商的,按照历史发展顺序)

1) JDBC-ODBC桥 驱动:

由ODBC驱动提供JDBC访问;

每年都有很多计算机语言诞生,但是不久就灭亡了;

刚开始,数据库厂商也不是很看好java这门语言;不是很想写驱动;

但是j2se中有jdbc的规范;必须得实现,sun公司很巧妙的利用了ODBC(c 访问数据库的驱动),

当时ODBC所有的数据库都能访问;将JDBC翻译成了ODBC;

应用程序--> JDBC--> 桥--> ODBC-->数据库

安全性不是很好(java的安全性建立在jvm上), 效率也不高(翻译);

2) 本地API 部分java驱动:

部分Java driver把JDBC调用转化成本地的客户端API

如果代码调用了windows的系统调用,就是windows本地调用;

应用程序--> JDBC -->JVM/OS --> 数据库

速度还可以,但是不是纯java的;

3) JDBC-net :纯java驱动;

纯的Java driver,将JDBC调用转入DBMS,与网络协议无关。然后通过服务器将调用转为DBMS协议。

没有直接访问数据库,访问了中间服务器;

应用程序--> JDBC--> 驱动--> 访问中间服务器--> 数据库

本地协议,数据库服务器的应用层协议;

中间协议,中间服务器的协议;

安全性还可以,但是协议,网络造成了效率的降低;

4) 纯 java 本地协议:

纯的java driver,将JDBC调用直接转为DBMS使用的网络协议

应用程序--> JDBC--> 驱动-(本地协议)-->数据库(内置对jvm的支持)

安全性没有问题,效率也高了;数据库厂商作出了努力;

现在我们用的就是这种驱动;

4、开发者接口的内容:

驱动程序, 有很多类,但有一个主类,实现java.sql.Driver接口,手动加载这个类;

两个包:java.sql.*;//主要接口包;

javax.sql.*;//扩展功能包;j2ee版

JDBC 贯穿课程,以后Hibernate, EJB,Spring 都要用;

Driver :接口,代表驱动程序;

DriverManager:工具类,辅助管理驱动程序的;并不是规范里的内容;规范里只有接口;

Connection:接口,连接数据库,代表和数据库的物理连接;某种意义上代表数据库本身;事务也由它代表;

Statement:接口,操作数据库的对象,发送 sql语句

PreparedStatement:Statement子接口,预编译Statement,开发中主要用这个;

CallableStatement:Statement子接口,调用数据库的存储过程,用的比较少;数据库之间的存储过程是不通用的;

ResultSet:接口,结果集,代表对数据库的查询结果,并且提供处理结果的方法;

DataBaseMetadata:接口,代表原数据,数据库原数据

ResultMetadata:接口,代表原数据,结果集原数据

Types:类,辅助的类,代表JDBC类型,定义了很多整数类型的常量;是标准SQL类型的子集;

数据库:例 :vachar=12,number=2

5、访问数据库:

0) 加载驱动; 反射的方法;

1) 连接数据库;

2) 操作数据库;

3) 返回结果集:ResultSet

4) 关闭数据库连接;

Oracle的Driver的全名oracle.jdbc.driver.OracleDriver

mysql的Driver的全名com.mysql.jdbc.Driver

SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

Class.forName("oracle.jdbc.driver.OracleDriver");//Oracle的驱动,实现了Driver接口;

DriverManager.getConnection(url:String,username:String,passwd:String);

没有用驱动直接去要连接,而是用了一个驱动管理员,是为了更灵活,以后会细讲,这里先知道;

url:协议,ip地址,端口号; jdbc:oracle:thin:@192.168.0.201:tarena

Statement 从Connection 来的; stmt = con.createStatement();

例子:

public static void main(String[] args)

{

Connection con = null;// 接口不能直接new

Statement st = null;

ResultSet rs = null;

try

{

//1、 加载驱动;

Class.forName("oracle.jdbc.driver.OracleDriver");

//2、获取连接;实现类在驱动程序里;

con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.201:1521:tarena",

"xjh0704", "xjh0704");

//3、操作数据库;插入一条记录

stmt = con.createStatement();

stmt.executeUpdate("insert into ln_student values(4,'langna','shanghai')");

}catch(Exception e){

e.printStackTrace();

}finally{

//4、关闭连接;判断是否为空,然后关闭;

try{

if(con!=null) con.close();

}catch(SQLException ex){

ex.printStackTrace();

}

}

}

DriverManager 可以得到多个连接对象 Connection ,一个连接对象可以获取Statement对象;

DriverManager --Driver--Connection--Statement --ResultSet

类比: 经理 --工程师-- 连线-- -- 电话---- 电话记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: