JDBC连接Oracle数据库
Java中的JDBC驱动可以分为四种类型,包括JDBC-ODBC桥、本地API驱动、网络协议驱动和本地协议驱动。
- JDBC驱动类型一、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.
- JDBC驱动类型二、本地API驱动
本地API驱动直接把JDBC调用转变为数据库的标准调用再去访问数据库.
这种方法需要本地 数据库驱动代码、本地API驱动、厂商DB代码。这种驱动比起JDBC-ODBC桥执行效率大大提高了.但是,它仍然需要在客户端加载数据库厂商 提供的代码库.这样就不适合基于internet的应用.并且,他的执行效率比起其他的JDBC驱动 还是不够高.
- JDBC驱动类型三、网络协议驱动
这种驱动实际上是根据我们熟悉的三层结构建立的. JDBC先把对数局库的访问请求传递给网 络上的中间件服务器. 中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用 传给数据库服务器.如果中间件服务器也是用java开法的,那么在在中间层也可以使用上面说的那俩种驱动类型 JDBC驱动程序作为访问数据库的方法. 网络协议驱动---------中间件服务器------------数据库Server
由于这种驱动是基于server的.所以,它不需要在客户端加载数据库厂商提供的代码库.而且 他在执行效率和可升级性方面是比较好的.因为大部分功能实现都在server端,所以这种驱动 可以设计的很小,可以非常快速的加载到内存中. 但是,这种驱动在中间件层仍然需要有配置 其它数据库驱动程序,并且由于多了一个中间层传递数据,它的执行效率还不是最好.
- JDBC驱动类型四、本地协议驱动 (我们先使用的JDBC驱动一般都是这种类型)
这种驱动直接把JDBC调用转换为符合相关数据库系统规范的请求.这种驱动写的应用可以直接和数据库服务器通讯.这种类型的驱动完全由java实现,因此实现了平台独立性. 本地协议驱动---------数据库Server
由于这种驱动不需要先把JDBC的调用传给ODBC或本地数据库接口或者是中间层服务器.所 以它的执行效率是非常高的.而且,它根本不需要在客户端或服务器端装载任何的软件或驱动. 这种驱动程序可以动态的被下载.但是对于不同的数据库需要下载不同的驱动程序.
步骤:
1 注册驱动
2 获得数据库连接对象
3 创建Statement对象
4 执行sql语句
5 处理结果集(如果有的话)
实验:
1.先把获得连接对象和关闭进行封装
jdbc.properties文件:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=briup
passwd=briup
package com.day1;
//import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class GetConnection {
private static String driver;
private static String url;
private static String username;
private static String passwd;
static {
Properties pro = new Properties();
// FileInputStream in;
try {
// in = new FileInputStream("src/jdbctwo/day2/jdbc.properties");
// pro.load(in);
pro.load(GetConnection.class.getResourceAsStream("jdbc.properties"));
driver=pro.getProperty("driver");
url=pro.getProperty("url");
username=pro.getProperty("username");
passwd=pro.getProperty("passwd");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn() {
Connection conn=null;
try {
Class.forName(driver);
conn= DriverManager.getConnection(url,username,passwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public static void close(ResultSet rs,Statement stmt,Connection conn) {
try {
if(rs!=null) rs.close();
if(stmt!=null) rs.close();
if(conn!=null) rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
}
}
public static void close(Statement stmt,Connection conn) {
close(null, stmt, conn);
}
}
进行建表测试:
package com.day1;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class JdbcTest1 {
@Test
public void createTable() {
// 注册驱动获取连接
Connection conn = null;
// 获取Statement对象
Statement stmt = null;
try {
conn = GetConnection.getConn();
stmt = conn.createStatement();
String sql = "create table stus(" + "id number primary key," + "name varchar2(50) not null," + "age number,"
+ "bod date)";
conn.setAutoCommit(false);
stmt.execute(sql);
conn.commit();
System.out.println("表格已经创建成功");
} catch (Exception e) {
// TODO Auto-generated catch block
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
GetConnection.close(stmt, conn);
}
}
}
c查询下表格是否创建成功:
进行增删改查测试:
package com.day1;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
import org.junit.Test;
public class JdbcTest2 {
@Test
public void Insert() {
Connection conn = null;
Statement stmt = null;
try {
conn = GetConnection.getConn();
stmt = conn.createStatement();
String sql = "insert into stus values(7,'zs',20,'11-11月-20')";
stmt.execute(sql);
System.out.println("插入成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
GetConnection.close(stmt, conn);
}
}
@Test
// 书写注册操作,将信息从控制台输入后直接保存在数据库中。
public void test2() throws Exception {
// 先从控制台获取数据
System.out.println("请输入用户名:");
@SuppressWarnings("resource")
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();
System.out.println("请输入年龄:");
int age = Integer.parseInt(scan.nextLine());
System.out.println("请按照日-月-年的形式输入:");
String dob = scan.nextLine();
// 获取数据库连接
Connection conn = GetConnection.getConn();
Statement stmt = conn.createStatement();
String sql = "insert into stus values(8,'" + name + "'," + age + ",'" + dob + "')";
System.out.println(sql);
stmt.execute(sql);
GetConnection.close(stmt, conn);
}
@Test
public void Update() throws Exception {
Connection conn = GetConnection.getConn();
Statement stmt = conn.createStatement();
String sql = "update stus set name='李思思' where id=7";
int exe = stmt.executeUpdate(sql);
System.out.println("更新了" + exe + "条");
GetConnection.close(stmt, conn);
}
@Test
public void Delete() throws Exception {
Connection conn = GetConnection.getConn();
Statement stmt = conn.createStatement();
String sql = "delete from stus where id=7";
int exe = stmt.executeUpdate(sql);
System.out.println("删除了" + exe + "条");
String sql1 = "delete from stus where id=8";
int exe1 = stmt.executeUpdate(sql1);
System.out.println("删除了" + exe1 + "条");
GetConnection.close(stmt, conn);
}
@Test
public void select() throws Exception {
// 注册驱动获取连接
Connection conn = GetConnection.getConn();
// 获取Statement对象
Statement stmt = conn.createStatement();
String sql = "select * from stus";
//处理结果集
ResultSet rt = stmt.executeQuery(sql);
while (rt.next()) {
int id = rt.getInt("id");
String name = rt.getString("name");
int age = rt.getInt("age");
Date date = rt.getDate("bod");
System.out.println("id=" + id + "," + "name=" + name + "," + "age=" + "," + age + "," + "date=" + date);
}
}
}
插入测试结果:
更新测试:
删除测试:
查询测试: