JDBC知识(一)

来源:互联网 发布:张孝祥java百度网盘 编辑:程序博客网 时间:2024/05/22 13:55
JDBC:
一、Why JDBC
我们一直说,计算机是用来帮助人们进行快速运算的。运算最根本的依据是数据。那么我们需要有操作的数据的来源,并且最终计算完成后,需要数据能够长久的保存,也就是数据能够持久化。


持久化:写入到
狭义上讲  内存对象 -----------》持久化介质(磁带,磁盘,文件等。。)
如果直接写入文件中,可以在应用程序中使用I/O操作来处理数据,但是获取有结构的数据,并且对数据进行制定查找,修改比较复杂。不好管理。


后来尝试给文件制定规则,用来存储数据,我们有xml文件,xml文件可以作为小型数据库,也是可以存储信息,并且具有结构化良好,可读性高,自我描述功能强的优点。但是这种格式存储的数据,非常简单,不提供给我们对于检索,排序等更多优化的性能,可以说,他本身在处理大数据量的需求下,是不适用的。所以xml我们仅适用于做小数据量的信息传递。针对于xml文件我们也有专门的解析和构建方式如Sax和Dom。


然后有了数据库的产生。数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等。当数据库产生之后,如果我们的应用程序需要得到数据库中数据的支持,就需要和数据库之间产生交互。各语言和数据库之间交互的技术应运而生。JDBC解决java操作的内存中的数据和数据库之间的交互问题。


二、What JDBC
连接数据库的方式:
1.ODBC:开放数据库连接(Open Database Connectivity,ODBC)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,是数据库访问接口标准。开放数据库互连定义了访问数据库API的一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言(但是Microsoft的ODBC文档是用C语言描述的,许多实际的ODBC驱动程序也是用C语言写的。)ODBC规范后来被X/OPEN和ISO/IEC采纳,作为SQL标准的一部分。
简单点说,ODBC是基于C语言实现的。提供了语言和数据库进行交互的一致性的接口,便于语言和和数据库通信以及语言对数据库的各种操作。


    2.JDBC: Java Data Base Connectivity,java数据库连接
可以认为是java版本的odbc。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成


  JDBC API主要分为两部分:
  1.针对应应用开发人员,必须遵循的规则。
  2.对于数据库驱动开发人员必须遵循的规则。(各数据库驱动实现类在对应的jar包中)
   我们主要关注针对于应用开发人员的标准。


三、数据库驱动


数据库软件可以由各个数据库厂商提供,我们熟知的mysql,oracle,sqlserver,access,db2等等都是由不同的厂商提供的,即有不同的开发商开发,因此对于数据库软件的实现过程都不尽相同。


应用程序也可以由不同的人进行开发,写代码实现的过程也不尽相同(因此应用程序和数据库软件之间属于many-to-many的关系)。如果想让应用软件和数据库之间能够产生交互,并且尽可能相互适应。换句话说,一个代码在连接任何数据库是都不用更改,就可以随意切换,一个数据库软件也可以和各种开发人员实现的应用程序无缝连接。这个时候就需要定义应用程序和数据库之间进行交互的规则(标准)。这个标准称之为驱动(Driver)。


开发商在开发数据库软件时提供针对于Driver标准的实现,应用开发人员再开发时,通过标准Driver的调用转换成对实际数据库Driver程序的调用。


因此,每一款数据库软件在实现时都会提供相对于Driver标准的一些列接口和类的实现。更明确一点说我们需要获取人家提供的这个驱动包才能保证程序和数据库之间的连接。


四、JDBC驱动
四种JDBC驱动:
1)JDBC-ODBC桥加ODBC
作为jdk1.1后的一部分,是sun.jdbc.odbc包的一部分
将jdbc调用转化为odbc调用,性能低,要求用户在终端上安装相应驱动
适用于快速的原型开发,没有提供JDBC驱动的数据库如Access
java --->JDBC-ODBC桥---->ODBC --->数据库厂商代码


2)部分java实现的本地JDBC驱动
相对1有所提高,直接利用开发商提供的本地库来直接与数据库通信,下载对应的工具
java ----type2 ----native Database library ----数据库厂商代码


3)jdbc网络纯java驱动程序
将JDBC调用转换为DBMS无关的网络协议,然后由某个服务器将其转换为相应的DBMS调用
java --->type3 ---java middleware --->jdbc Driver ----->数据库厂商代码
具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的


4)本地协议纯java驱动程序
将jdbc调用直接转化成响应的DBMS调用
最高的性能,通过自己的本地协议直接与数据库引擎通信,具备internet的装配能力
目前java程序连接数据库都是用纯jdbc驱动。


使用纯jdbc驱动需要先获取数据库厂商提供的驱动包:
针对于oracle数据库,可以从安装目录下的app\oracle\product\10.2.0\server\jdbc\lib下找一个叫做ojdbc14.jar。
根据jdbc版本的更新换代,现在最高的jdbc版本为4.0的版本。可以单独获取jar包,例如获取ojdbc5.jar,ojdbc6.jar.
14,10g  5,6 11g
JDBC与SQL语句
       SQL语句是对所有关系型数据库都通用的命令语句,而JDBC则是执行SQL语句的工具。
       除了标准的SQL语句之外,所有数据库都会在标准的SQL语句基础上进行扩展,增加一些额外的功能,这些
   额外的功能属于特定的数据库系统,不能在所有的数据库系统上都通用,因此,如果想让我们的数据库应用程序
   可以跨数据库运行,则应该尽量少用这些属于特定数据库的扩展。也就是说对于使用标准的SQl语句进行的数据库操作,只要为程序提供不同的数据库驱动,应用程序就可以在所有的数据库之间切换。




五、JDBC应用开发接口:
java.sql.*;  ------标准版
javax.sql.*; ------企业版。


我们主要看java.sql.*包下的接口和类:


1).Driver: 驱动的标准接口。
2).DriverManager: 驱动管理器,管理多个加载的驱动程序;
能够根据数据库的url标识,自动查找合适的数据库驱动类。
3).Connection: 和数据库连接的对象形式,代表了一个和数据库的连接;
4).Statement:  用以执行SQL语句
  a. Statement;
  b. PreparedStatement(继承自Statement);
5).ResultSet: 结果集,用来获取select语句返回的数据结果


六、JDBC的执行流程:

1.由DriverManager根据数据库的URL标识,自动识别查找注册给DriverManager的多各Driver对象,
2.通过调用Driver对象的Connect方法和数据库之间建立起来连接(此时返回Connection对象)
3.建立起来了解之后,由Statement对象负责搬运sql语句到数据库服务端执行,然后将执行结果搬回程序端
4.处理程序端返回的ResultSet。
七、数据库的URL标识:


数据库url标识的存在主要是为了能够让DriverManager通过这个标示可以正确的识别使用的数据库,以及查找到正确的Driver对象,并且通过这个Driver可以和数据库之间建立起来连接。


这个url由数据库厂商提供。
基本格式:
jdbc:subprotocol:subname
oracle :jdbc:oracle:thin:@localhost:1521:xe
mysql : jdbc:mysql://localhost:3306/javademo?characterEncoding=UTF8
note:其中还可以包含用户名密码编码等信息,


----------------------------------------------------------------------------
Model 2   USing JDBC


一、JDBC编程步骤
  1.注册驱动/加载驱动
  2.获取连接
  3.创建Statement对象
  4.执行sql
  5.处理结果集
  6.关闭资源。


二、分步骤详解:
1.注册驱动(加载驱动):
注册的方式:
 1.使用类加载器(使用反射的方式)
Class.forName(driverName);
 2.实例化Driver
Driver driver =
new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(driver);
 3.System.setProperty("jdbc.drivers", "oracle.jdbc.driver.OracleDriver");
    或者运行程序时填加虚拟机参数jdbc.drivers
-Djdbc.drivers=oracle.jdbc.driver.OracleDriver


   2.建立连接
连接方式:
1.DriverManager的getConnection方法
 getConnection(url);//url中需要有用户名密码,比如mysql连接就可以
 getConnection(url,properties);//将用户名密码存放在java.util.Properties对象中
 getConnection(url,user,passwd);


 DriverManager中的getConnection其实也是调用的Driver.connect方法,因此可以直接使用。
2.直接调用Driver.connect方法执行
 Driver d = new DriverClass();
 d.connect(url,properties);
   3.创建Statement:
Statement:connection.createStatement();
 1.创建时不需要传递sql语句,但是执行时需要传递sql语句
 2.如果涉及到动态参数的传递,必须使用字符串拼接
PreparedStatement:connection.prepareStatement(String sql);
 1.创建时就需要传递sql语句,执行的时候不需要传递sql语句
 2.如果涉及到动态参数的传递,可以使用字符串拼接,也可以使用?占位的形式
给?号传值使用的是
pstmt.setType(index,value);
index从1开始
 3.提供预编译的功能,某种程度上可以避免sql注入的问题
 4.提前做语法检查,在给?赋值的过程中要求数据类型一定要匹配,这样在某种程度上可以避免因为数据类型不匹配而发生的异常




   4.执行sql语句:
execute:返回boolean类型的值,代表是否有结果集返回
executeUpdate:返回int类型的值,代表的是,操作执行完成后,受影响的数据库的行计数(针对于insert,update,delete)
executeQuery:返回的是ResultSet
ResultSet:类似于指针或者游标的东西,里边保存的不是所有的结果,而是指向结果集的正上方。所以如果一旦连接关闭那么ResultSet将取不到值。一个statement对象对应一个resultSet对象
   5.处理结果:有结果集,处理结果集
ResultSet
next(),每执行一次,向下移动一次,如果有值,返回true,如果没值返回false
while(rs.next()){
   rs.getType(index/columnName);
   如果传的是index,那么索引是从1开始的。
例如:
执行select id,last_name from s_emp;
那么1代表的就是id,依次类推
}
   6.关闭资源
先开的后关















































原创粉丝点击