过了一个中秋假期,休息了三天,今天又开始了学习工作!
学习内容
Java中的JDBC驱动
JDBC驱动(四种类型)
- JDBC-ODBC桥
- 本地API驱动
- 网络协议驱动
- 本地协议驱动
JDBC-ODBC桥
JDBC-ODBC 桥 是sun公司提供的,是jdk提供的的标准API. 这种类型的驱动实际是把所有 JDBC的调用传递给ODBC ,再由ODBC调用本地数据库驱动代码.( 本地数据库驱动代码是指 由数据库厂商提供的数据库操作二进制代码库,例如在oracle for windows中就是oci dll 文 件)
只要本地机装有相关的ODBC驱动那么采用JDBC-ODBC桥几乎可以访问所有的数据库,JDBC- ODBC方法对于客户端已经具备ODBC driver的应用还是可行的.
但是,由于JDBC-ODBC先调用 ODBC再由ODBC去调用本地数据库接口访问数据库.所以,执行效率比较低,对于那些大数据量 存取的应用是不适合的.而且,这种方法要求客户端必须安装ODBC 驱动,所以对于基于 internet ,intranet的应用也是不合适的.因为,你不可能要求所有客户都能找到ODBC driver.
本地API驱动
本地API驱动直接把JDBC调用转变为数据库的标准调用再去访问数据库.
这种方法需要本地 数据库驱动代码、本地API驱动、厂商DB代码。这种驱动比起JDBC-ODBC桥执行效率大大提高了.但是,它仍然需要在客户端加载数据库厂商 提供的代码库.这样就不适合基于internet的应用.并且,他的执行效率比起其他的JDBC驱动 还是不够高.
网络协议驱动
这种驱动实际上是根据我们熟悉的三层结构建立的. JDBC先把对数局库的访问请求传递给网 络上的中间件服务器. 中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用 传给数据库服务器.如果中间件服务器也是用java开法的,那么在在中间层也可以使用上面说的那俩种驱动类型 JDBC驱动程序作为访问数据库的方法.
网络协议驱动---------中间件服务器------------数据库Server
由于这种驱动是基于server的.所以,它不需要在客户端加载数据库厂商提供的代码库.而且 他在执行效率和可升级性方面是比较好的.因为大部分功能实现都在server端,所以这种驱动 可以设计的很小,可以非常快速的加载到内存中. 但是,这种驱动在中间件层仍然需要有配置 其它数据库驱动程序,并且由于多了一个中间层传递数据,它的执行效率还不是最好.
本地协议驱动 (我们现在使用的JDBC驱动一般都是这种类型)
这种驱动直接把JDBC调用转换为符合相关数据库系统规范的请求.这种驱动写的应用可以直接和数据库服务器通讯.这种类型的驱动完全由java实现,因此实现了平台独立性. 本地协议驱动---------数据库Server
由于这种驱动不需要先把JDBC的调用传给ODBC或本地数据库接口或者是中间层服务器.所 以它的执行效率是非常高的.而且,它根本不需要在客户端或服务器端装载任何的软件或驱动. 这种驱动程序可以动态的被下载.但是对于不同的数据库需要下载不同的驱动程序.
JDBC的连接类型( oci 和 thin)
连接类型:
- JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC 驱动。因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配 置。
- JDBC Thin: thin是for thin client的意思,这种驱动一般用在运行在WEB浏览器中的JAVA程序。它不是通过OCI or Net8,而是通过Java sockets进行通信,是纯java实现的驱动,因此不需要在使用JDBC Thin的客户端机器上安装orcale客户端软件,所以有很好的移植性,通常用在web开发中。
加载JDBC驱动
Class.forName
package com.briup.jdbc.driver;
public class DriverTest1 {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
new oracle.jdbc.driver.OracleDriver()
package com.briup.jdbc.driver;
import java.sql.Driver;
import java.sql.DriverManager;
public class DriverTest2 {
public static void main(String[] args) {
Driver driver = new oracle.jdbc.driver.OracleDriver();
try {
DriverManager.registerDriver(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
}
setProperty(“jdbc.drivers”,“oracle.jdbc.driver.OracleDriver”)
package com.briup.jdbc.driver;
public class DriverTest3 {
public static void main(String[] args) {
System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver");
System
.getProperties()
.forEach(
(k,v)-> System.out.println(k+"="+v)
);
}
}
getProperty(“jdbc.drivers”)
package com.briup.jdbc.driver;
public class DriverTest4 {
public static void main(String[] args) {
//-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
//java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver com.briup.jdbc.driver.DriverTest4
System.out.println(System.getProperty("jdbc.drivers"));
}
}
连接JDBC驱动
Class.forName(driverClass)和DriverManager.getConnection(url,pro)
package com.briup.jdbc.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class ConnectionTest1 {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Properties pro = new Properties();
pro.setProperty("user", user);
pro.setProperty("password", password);
Connection conn = null;
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url,pro);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
new oracle.jdbc.driver.OracleDriver()和DriverManager.getConnection(url,user,password)
package com.briup.jdbc.connection;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
@SuppressWarnings("all")
public class ConnectionTest2 {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Connection conn = null;
try {
Driver driver =
new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(driver);
conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
setProperty(“jdbc.drivers”, “oracle.jdbc.driver.OracleDriver”)和DriverManager.getConnection(url,user,password)
package com.briup.jdbc.connection;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
@SuppressWarnings("all")
public class ConnectionTest3 {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Connection conn = null;
try {
System.setProperty("jdbc.drivers", "oracle.jdbc.driver.OracleDriver");
//-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
new oracle.jdbc.driver.OracleDriver(),driver.connect(url,pro)
package com.briup.jdbc.connection;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import oracle.jdbc.driver.OracleDriver;
@SuppressWarnings("all")
public class ConnectionTest4 {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Properties pro = new Properties();
pro.setProperty("user", user);
pro.setProperty("password", password);
Connection conn = null;
try {
Driver driver =
new oracle.jdbc.driver.OracleDriver();
conn = driver.connect(url,pro);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
调用存储过程的实例:
- 建表
drop table t_user; create table t_user( id number primary key, name varchar2(100), salary number );
- 创建存储过程
注意:参数列表中的in代表输入参数,out代表返回值
注意:SQLERRM表示执行sql时候出现的错误信息
注意:sql中的字符串拼接使用||create or replace procedure insert_user_procedure (id in number,name in varchar2,salary in number,result out varchar2) is begin insert into t_user values(id,name,salary); result:='调用存储过程成功'; Exception when others then result:= '调用存储过程出错: ' || SQLERRM; end; /
3.java代码中调用方法
package com.briup.jdbc.statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class StatementTest {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Connection conn = null;
Statement stmt = null;
try {
//1 加载驱动类
Class.forName(driverClass);
//2 获得数据库连接对象
conn = DriverManager.getConnection(url, user, password);
//3 创建Statement类型对象
stmt = conn.createStatement();
int id = 1;
String name = "tom1";
int salary = 1000;
String sql = "insert into t_user(id,name,salary) values("+id+",'"+name+"',"+salary+")";
//4 执行sql语句
stmt.execute(sql);
//5 处理结果集合(query)
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(stmt!=null)stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- CallableStatement
- prepareStatement
- preparedStatement
使用CallableStatement进行调用
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
private String user = "briup";
private String password = "briup";
public void test(){
Connection conn = null;
CallableStatement cs = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, password);
cs = conn.prepareCall("{call insert_user_procedure(?,?,?,?)}");
cs.setObject(1, 1);
cs.setObject(2, "tom1");
cs.setObject(3, 4500);
cs.registerOutParameter(4, java.sql.Types.VARCHAR);
cs.execute();
//获取执行结果
Object val = cs.getObject(4);
System.out.println("val = "+val);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(cs!=null)cs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用prepareStatement进行调用
package com.briup.jdbc.statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PrepareStatementTest {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Connection conn = null;
PreparedStatement ps;
try {
// 1.加载驱动类
Class.forName(driverClass);
// 2.获得数据库连接对象
conn = DriverManager.getConnection(url, user, password);
//3.创建Statement类型对象
String sql = "insert into t_user(id,name,salary) values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(0, 1);
ps.setString(1, "Tom2");
ps.setInt(2, 1000);
/*int id = 1;
String name = "Tom1";
int salary = 1000;*/
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用preparedStatement进行调用
package com.briup.jdbc.statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementTest {
public static void main(String[] args) {
String driverClass = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "briup";
String password = "briup";
Connection conn = null;
PreparedStatement ps = null;
try {
//1 加载驱动类
Class.forName(driverClass);
//2 获得数据库连接对象
conn = DriverManager.getConnection(url, user, password);
//3 创建Statement类型对象
String sql = "insert into t_user(id,name,salary) values(?,?,?)";
ps = conn.prepareStatement(sql);
ps.setInt(1, 2);
ps.setString(2,"tom2");
ps.setInt(3, 2000);
//4 执行sql语句
ps.execute();
//5 处理结果集合(query)
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(ps!=null)ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
总结
补12日(周四)笔记。作业好几天都没写,助教上课方式我不太适应!