一、JDBC概述
1. jdbc:1996年,sun公司提出,一般认为是java database connectivity;JDBC TM(trademark);
作用:规避数据库的不同,为程序开发人员访问数据库提供统一的编程接口,即为API;
2. odbc:open database connectivity 基于C语言的,由microsoft提出;
3. jdbc API:是java程序开发人员访问数据库的标准接口,实际上就是一组java语言编写的java类;
jdbc可以做什么? 答:和数据库建立连接,发送sql语句,处理数据库返回的结果集
jdbc API分为:
应用程序开发接口 这个接口是统一的....
驱动程序开发接口 数据库开发厂商提供,不同数据库是不同的,如:oracle实现等等....
4.jdbc driver的四种类型:
第一种:jdbc-odbc桥+odbc 将jdbc调用转换为odbc调用,性能低;
application->jdbc-odbc桥->odbc->datebase.
第二种:本地API部分用java编写的驱动,将jdbc调用转换为dbms的调用,
必须安装与数据库相关的客户 端程序;
application->jdbc driver(type2)->database client library->database.
第三种:jdbc网络纯java的驱动,将jdbc调用转换为与dbms无关的网络协议,
然后由相应服务器转换为dbms调用;
appliaction->jdbc driver(type3)->server->database.
第四种:本地协议纯java的驱动,将jdbc调用转换为dbms的调用
application->jabc driver(type4)->database.
现实中一般使用第四种;
5.JDBC的优点和缺点
JDBC API用于连接Java应用程序与各种关系数据库。这使得人们在建立客户/服务器应用程序时,通常把Java作为编程语言,把任何一种浏览器作为应用程序的友好界面,把Internet或Intranet作为网络主干,把有关的数据库作为数据库后端。以下是使用JDBC的优缺点。
优点如下:
1.JDBC API与ODBC十分相似,有利于用户理解。
2.JDBC使得编程人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。
3.JDBC支持不同的关系数据库,使得程序的可移植性大大加强。
4.用户可以使用JDBC-ODBC桥驱动器将JDBC函数调用转换为ODBC。
5.JDBC API是面向对象的,可以让用户把常用的方法封装为一个类,备后用。
缺点如下:
1.使用JDBC,访问数据记录的速度会受到一定程度的影响。
2.JDBC结构中包含了不同厂家的产品,这就给更改数据源带来了很大的麻烦。
1. JDBC编程的步骤:
1.注册驱动
a.通过类装载器
Class.forname(driverName)
b.直接实例化驱动
Driver driver = new DriverImpl();
DriverManager.registerDriver(driver);
c.通过jdbc.drivers属性
外部向java程序传递参数的两种方式:
1.program参数:
java Test a b c
程序中通过String[] args获取
2.jvm参数:
java -Dname=briup -Dage=20 Test
程序中通过
Properties props=System.getProperties();
String param=props.getProperty("XXXX");获取
java -Djdbc.drivers=driverName[:driverName2:...]
例如:-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
2.建立连接
a.通过DriverManager:
Connection con=DriverManager.getConnection(url,user,password);
b.通过java.sql.Driver
Driver driver = new DriverImpl();
Connection con=driver.connect(String url,Properties info);
知道properties的使用方法;
3.创建statement:statement用来发送要执行的sql语句
a.Statement:执行不带参数的sql语句,创建:connection.createStatement()
b.PreParedStatement:执行带参数或不带参数的预编译的SQL语句,
下次执行的时候就不要编译和优化了;
创建:connection.prepareStatement()
c.CallableStatement:调用数据库中的存储过程或函数等等,PL/SQL
创建:connection.parpareCall();
b和c称为同构的Statement,a称为异构的Statement.
4.执行sql语句
statement.executeQuery(); 返回类型ResultSet
statement.executeUpdate();返回类型int,执行此sql语句所影响的记录数。
statement.execute();返回类型boolean,代表执行此语句是否有resultset
返回,有就是ture。
5.处理结果集
只有select语句才会有结果集返回;
while(rs.next()){ //rs是一个游标,初始时在第一条记录的上面一行。
//每next一次,向下一行。
rs.getString(1);
rs.getInt(2);
}
可以使用位置标识,也可以使用列名来标识(当结果集字段比较多的时候用列名标识法,可以增强程序
的可读性)。
6.释放资源
一般写在finally语句块中。所释放的资源一般有ResultSet,Statement,Connection
2.建立连接的步骤:
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@192.168.1.200:1521:briupdb";
String user="briup";
String password="briup";
//建立几个以后关闭几个哦
Connection con=null;
Statement stm=null;
ResultSet rs=null;
try{
//1.注册驱动
Class.forName(driver);
//2.建立连接
con=DriverManager.getConnection(url,user,password);
//3.创建statement
stm=con.createStatement();
//4.执行sql语句
rs=stm.executeQuery("select * from student");
//5.处理结果集
while(rs.next()){
String name=rs.getString(1);
int age =rs.getInt(2);
System.out.println("name:"+name+"age:"+age);
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源,将其放在finally中
if(rs!=null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(stm!=null){
try{
stm.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(con!=null){
try{
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
3. Statement接口的比较
答: | Statement | PreparedStatement | CallableStatement
--------------------------------------------------------------------------------------------
写代码位置 | 客户端 | 客户端 | 服务器端
--------------------------------------------------------------------------------------------
存放代码的位置| 客户端 | 服务器端 | 服务器端
--------------------------------------------------------------------------------------------
编写代码技术 | Java,SQL操作 |Java,SQL操作 | 数据库的程序语言,如PL/SQL
--------------------------------------------------------------------------------------------
可配置性 | 高 |第一次高,以后低 | 低
--------------------------------------------------------------------------------------------
可移植性 | 高 |假设支持pstmt的话高 | 低
--------------------------------------------------------------------------------------------
传输效率 | 低 |第一次低,以后高 | 高
------------------------------------------------------------------------------------------------------------------------------------
java中的异常是对象,所有异常的父类是java.lang.Throwable。
java中异常采用冒泡处理机制。
Error:没有办法处理;
Exception:可以进行处理。
uncheck exception:不需要进行处理,如:空指针异常,数组越界等等。
check exception:所有实现了exception,必须对其进行处理,否则报错;
要么用try...catch捕获;要么继续向上抛出。