(一)JDBC驱动、连接类型和调用存储过程

过了一个中秋假期,休息了三天,今天又开始了学习工作!

学习内容

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)

连接类型:

  1. JDBC OCI: oci是oracle call interface的缩写,此驱动类似于传统的ODBC 驱动。因为它需要Oracle Call Interface and Net8,所以它需要在运行使用此驱动的JAVA程序的机器上安装客户端软件,其实主要是用到orcale客户端里以dll方式提供的oci和服务器配 置。
  2. 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();
				}
		}
	}
}

调用存储过程的实例:

  1. 建表
    drop table t_user;
    
    create table t_user(
    	id number primary key,
    	name varchar2(100),
    	salary number
    );
    
  2. 创建存储过程
    注意:参数列表中的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日(周四)笔记。作业好几天都没写,助教上课方式我不太适应!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值