2020-11-29

此文转载自:https://blog.csdn.net/qq_42376937/article/details/110306966

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);
		}
	}
}

插入测试结果:
在这里插入图片描述
更新测试:
在这里插入图片描述
删除测试:
在这里插入图片描述
在这里插入图片描述
查询测试:
在这里插入图片描述

   

更多内容详见微信公众号:Python测试和开发

Python测试和开发

原文地址:https://www.cnblogs.com/phyger/p/14061042.html