`
fehly
  • 浏览: 248673 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDBC编程

    博客分类:
  • java
阅读更多

数据库简介

数据库(DB,Data Base)

数据库管理系统(DBMS,Data Base Management Systenm)

关系型数据库(RDB)
关系型数据库管理系统(RDBMS)
SQL语言(Structured Query Language)

  • 使用关系模型的数据库语言,用于和各类数据库的交互,提供通用的数据管理和查询功能。
  • 常用SQL指令:SELECT  、INSERT、DELETE、UPDATE、CREATE、DROP

ODBC(Open DataBase Connectivity开放式数据库互连)

  • 数据库系统应用程序接口规范。
  • 支持应用程序以标准的ODBC函数和sql语句操作各种不同类型的数据库
    操作各种不同类型的数据库。

JDBC

JDBC(Java DataBase Connectivity)
JDBC功能:

  • 支持基本SQL语句,在Java程序中实现数据库操作功能并简化操作过程
  • 提供多样化的数据库连接方法
  • 为各种不同的数据库提供统一的操作界面

JDBC API

  • java.sql. DriverManager类
  • java.sql.Driver接口
  • java.sql.Connection接口
  • java.sql.Statement接口
  • java.sql.ResultSet接口

JDBC工作原理

JDBC驱动程序
数据库驱动程序(DataBase Driver)
JDBC驱动程序分类:

  • 第一类:JDBC-OCBC桥
  • 第二类:Java到本地API
  • 第三类:Java到网络协议
  • 第四类:Java到数据库协议

数据库URL

JDBC技术中使用数据库URL来标识目标数据库
数据库URL格式:

jdbc:<子协议名>:<子名称>
  • "jdbc"为协议名,确定不变;
  • <子协议名>指定目标数据库的种类和具体连接方式;
  • <子名称>指定具体的数据库/数据源连接信息(如数据库服务器的IP地址/通信端口号、ODBC数据源名称、连接用户名/密码等)。
  • 子名称的格式和内容随子协议的不同而改变。

举例:

jdbc:oracle:thin:@222.212.32.14:1521:dbrbh
jdbc:microsoft:sqlserver://127.0.0.1:1433
jdbc:microsoft:sqlserver://127.0.0.1:1433,databasename=pubs
jdbc:mysql://127.0.0.1/db_rbh

JDBC编程

JDBC编程基本步骤

1. 加载驱动程序(向系统注册所需的JDBC驱动程序);
2. 建立到指定数据库的连接;
3. 提交数据库查询;
4. 取得查询结果

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCExample{
    public static void main(String args[]){
		try{		    
			Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@127.0.0.1:1521:dbrbh";
		    Connection conn = DriverManager.getConnection(url,"scott","tiger");
		    Statement stmt = conn.createStatement();
		    ResultSet rs = stmt.executeQuery("select * from dept");
		    while(rs.next()){
				System.out.print("DeptNo: " + rs.getInt(1));
				System.out.print("\tDeptName: " + rs.getString(2));
				System.out.println("\tLOC: " + rs.getString(3));						    
			}
			rs.close();
			stmt.close();
			conn.close();
		}catch(ClassNotFoundException e){
		    System.out.println("找不到指定的驱动程序类!");
		}catch(SQLException e){
		    e.printStackTrace();
		}
    }
}

ResultSet常用get...()方法                   SQL-Java类型对应关系

   

执行DML语句

create table student(
  sid  char(10),
  name char(20),
  age number(3));

insert into student values('J001','张三',18);
insert into student values('J002','李四',20);
insert into student values('J003','王五',19);  
import java.sql.*;

public class TestDML{
    public static void main(String args[]){
		try{		   
			Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@127.0.0.1:1521:dbrbh";
		    Connection conn = DriverManager.getConnection(url,"scott","tiger");
		    Statement stmt = conn.createStatement();
		    stmt.executeUpdate("insert into student values('J001','张三',18)");
		    stmt.executeUpdate("insert into student values('J002','李四',20)");
		    stmt.executeUpdate("insert into student values('J003','王五',19)");
		    ResultSet rs = stmt.executeQuery("select * from student");
		    while(rs.next()){
				System.out.print("学号: " + rs.getString(1));
				System.out.print("\t姓名: " + rs.getString(2));
				System.out.println("\t年龄: " + rs.getInt(3));						    
			}
			rs.close();
			stmt.executeUpdate("update student set age=age+10");
			stmt.executeUpdate("delete from student where sid='J002'");
			System.out.println("--------------更新/删除数据后---------------");
			rs = stmt.executeQuery("select * from student");
		    while(rs.next()){
				System.out.print("学号: " + rs.getString("sid"));
				System.out.print("\t姓名: " + rs.getString("name"));
				System.out.println("\t年龄: " + rs.getInt("age"));						    
			}
			rs.close();
			stmt.close();
			conn.close();
		}catch(Exception e){
		    e.printStackTrace();
		}
    }
}

执行DDL语句

import java.sql.*;

public class TestDDL{
    public static void main(String args[]){
    	Connection conn = null;
    	Statement stmt = null;
    	ResultSet rs = null;
		try{		   
			System.setProperty("jdbc.drivers","oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@127.0.0.1:1521:dbrbh";
		    conn = DriverManager.getConnection(url,"scott","tiger");
		    stmt = conn.createStatement();
			
			stmt.execute("create table mytable(id number, name char(10), phone char(10))");		    
		    stmt.executeUpdate("insert into mytable values(55,'Tom','67666939')");
		    rs = stmt.executeQuery("select * from mytable");
		    while(rs.next()){
		    	System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3));	
		    }
		    stmt.execute("drop table mytable");
		}catch(Exception e){
		    e.printStackTrace();
		}finally{
			try{
				if(rs != null){
					rs.close();
				}
			}catch(Exception e){
		    	e.printStackTrace();
			}	
			
			try{
				if(stmt != null){
					stmt.close();
				}
			}catch(Exception e){
		    	e.printStackTrace();
			}	
			try{
				if(conn != null){
					conn.close();
				}
			}catch(Exception e){
		    	e.printStackTrace();
			}	
		}
    }
}

获取数据库元数据

import java.sql.*;
public class TestMetaData{
    public static void main(String args[]){
		Connection conn = null;
		try{
		    Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";
		    conn = DriverManager.getConnection(url,"scott","tiger");
		    ResultSet rs = null;		
			DatabaseMetaData dmd = conn.getMetaData(); 
			if (dmd == null) { 
				System.out.println ("No Meta available"); 
			} else { 
				System.out.println ("数据库名称:" + dmd.getDatabaseProductName()); 
				System.out.println ("数据库版本:" + dmd.getDatabaseProductVersion()); 
				System.out.println ("数据库驱动程序:" + dmd.getDriverName()); 
				System.out.println ("驱动程序版本号:" + dmd.getDriverVersion()); 
				System.out.println ("并发访问的用户个数" + dmd.getMaxConnections()); 
				System.out.println ("数据类型列表:" ); 
				rs = dmd.getTypeInfo();
				while(rs.next()){
					System.out.println("\t" + rs.getString(1));	
				}
				rs.close();
			} 					    
		    Statement stmt = conn.createStatement();
		    String s = "select * from dept";
		    rs = stmt.executeQuery(s);						
		    System.out.println("数据表dept结构信息:");
		    ResultSetMetaData  rsm = rs.getMetaData();
		    int columnCount = rsm.getColumnCount();
			System.out.println("列序号\t列名\t数据类型");
		    for(int i=1;i<=columnCount;i++){
				System.out.println(" " + i + " \t" + 
				rsm.getColumnName(i) + "\t" + 
				rsm.getColumnTypeName(i));			    
		    }
		    rs.close();
		    stmt.close();
		}catch(Exception e){
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null && !conn.isClosed()){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
    }
}

访问SQL Server数据库
准备SQL Server数据库JDBC驱动程序
1. 从微软网站下载JDBC驱动程序安装文件
2. 本地安装该驱动程序包
3. 重新设置CLASSPATH环境变量 

import java.sql.*;

public class TestSQLServer{
	public static void main(String[] args) {
		try{
			Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");  
			Connection con = DriverManager.getConnection 
			  ("jdbc:microsoft:sqlserver://127.0.0.1:1433","sc","admin"); 			 
			Statement stmt = con.createStatement();
			ResultSet rs   = stmt.executeQuery("select * from mytable1");
			    
			while(rs.next()){
					System.out.print("sid:" + rs.getInt(1));
					System.out.print("\tname:" + rs.getString(2).trim());
					System.out.print("\tsex:" + rs.getString(3).trim());
					System.out.println();
			}
			rs.close();
			stmt.close();
			con.close();
		}catch(Exception e){
		    e.printStackTrace();
		}
	}
}

JDBC-ODBC编程

工作原理:
JDBC驱动程序管理器并不直接操纵数据库驱动程序,而是调用JDBC-ODBC桥驱动程序操纵,ODBC驱动程序,进而连接各种类型的数据库。

编程步骤:
创建ODBC数据源
在程序中连接并操作ODBC数据源

访问Excel文件

import java.sql.*;
public class JDBC_ODBC{
    public static void main(String args[]){
    	String drv = "sun.jdbc.odbc.JdbcOdbcDriver";
		try{
			Class.forName(drv); 
			Connection con = DriverManager.getConnection("jdbc:odbc:ExcelODBC1", "", ""); 

			DatabaseMetaData dmd = con.getMetaData(); 
			if (dmd == null) { 
				System.out.println ("No DBMeta available"); 
			} else { 
				System.out.println ("DB Name:\t" + dmd.getDatabaseProductName()); 
				System.out.println ("DB Version:\t" + dmd.getDatabaseProductVersion()); 
				System.out.println ("DB Driver Name:\t" + dmd.getDriverName()); 
				System.out.println ("Driver Version:\t" + dmd.getDriverVersion()); 
			} 
	    
		    Statement stmt=con.createStatement();
		    ResultSet rs=stmt.executeQuery("select * from [Sheet1$]");
			System.out.println("记录内容:");
			System.out.println("\t姓  名\t年龄\t月  薪\t职  务" );
		    while(rs.next()){
				System.out.print("\t" + rs.getString(1));
				System.out.print("\t" + rs.getInt(2));	
				System.out.print("\t" + rs.getString(3));
				System.out.println();
		    }
		    rs.close();
		    stmt.close();
		    con.close();		    
		}catch(Exception e){
		    e.printStackTrace();
		}
    }
}

访问Access数据库

import java.sql.*;

public class TestAccess{
	public static void main(String[] args) {
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
			Connection con = DriverManager.getConnection("jdbc:odbc:test", "", ""); 
			Statement stmt = con.createStatement();
			ResultSet rs   = stmt.executeQuery("select * from table1");			    
			while(rs.next()){
					System.out.print("编号:" + rs.getString(1));
					System.out.print("\t姓名:" + rs.getString(2));
					System.out.print("\t性别:" + rs.getString(3));
					System.out.println();
			}
			rs.close();
			stmt.close();
			con.close();		    
		}catch(Exception e){
		    e.printStackTrace();
		}
	}
}

访问SQL Server数据库

import java.sql.*;

public class TestSQLServer{
	public static void main(String[] args) {
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
			Connection con = DriverManager.getConnection("jdbc:odbc:mydb1", "", ""); 
			//Connection con = DriverManager.getConnection("jdbc:odbc:mydb1;database=pubs", "", ""); 
			Statement stmt = con.createStatement();
			ResultSet rs   = stmt.executeQuery("select * from mytable1");
			while(rs.next()){
					System.out.print("编号:" + rs.getInt(1));
					System.out.print("\t姓名:" + rs.getString(2).trim());
					System.out.print("\t性别:" + rs.getString(3).trim());
					System.out.println();
			}
			rs.close();
			stmt.close();
			con.close();
		}catch(Exception e){
		    e.printStackTrace();
		}
	}
}

使用属性文件配置环境

将数据库连接信息(URL、用户名/密码等)保存到专门的属性文件中,而不在程序中直接给出

#Oracle db info
db_url = jdbc:oracle:thin:@127.0.0.1:1521:dbrbh
username = scott
password = tiger
import java.io.*;
import java.util.*;
import java.sql.*;

public class JDBCExample{
	public static Connection getConnection()throws SQLException,IOException{
		Properties ps = new Properties();
		FileInputStream fis = new FileInputStream("mydb.properties");
		ps.load(fis);
		fis.close();
		
		String url = ps.getProperty("db_url");
		String username = ps.getProperty("username");	
		String psw = ps.getProperty("password");
		
		Connection conn = DriverManager.getConnection(url,username,psw);
		return  conn;		
	}
	
    public static void main(String args[]){
		try{		    
			Class.forName("oracle.jdbc.driver.OracleDriver");
		    Connection conn = JDBCExample.getConnection();
		    Statement stmt = conn.createStatement();
		    ResultSet rs = stmt.executeQuery("select * from dept");
		    while(rs.next()){
				System.out.print("DeptNo: " + rs.getInt(1));
				System.out.print("\tDeptName: " + rs.getString(2));
				System.out.println("\tLOC: " + rs.getString(3));						    
			}
			rs.close();
			stmt.close();
			conn.close();
		}catch(Exception e){
		    e.printStackTrace();
		}
    }    
}

OCI方式访问Oracle数据库

OCI方式连接时Oracle客户端配置
使用Net Configuration Assistant
使用Net Manager图形化工具
直接修改数据库配置文件"tnsnames.ora"

import java.sql.*;

public class TestOCI{
    public static void main(String args[]){
		try{		    
			Class.forName("oracle.jdbc.driver.OracleDriver");
		    //Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@mdb1","scott","tiger");
		   	Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@(description=(address=(host=127.0.0.1)(protocol=tcp)(port=1521))(connect_data=(sid=ora9)))","scott", "tiger");
		    Statement stmt = conn.createStatement();
		    ResultSet rs = stmt.executeQuery("select * from dept");
		    while(rs.next()){
				System.out.print("DeptNo: " + rs.getInt(1));
				System.out.print("\tDeptName: " + rs.getString(2));
				System.out.println("\tLOC: " + rs.getString(3));						    
			}
			rs.close();
			stmt.close();
			conn.close();
		}catch(Exception e){
		    e.printStackTrace();
		}
    }
}

可滚动/可更新结果集

结果集类型

不可滚动(FORWARD_ONLY)

滚动不敏感(SCROLL_INSENSITIVE)

滚动敏感(SCROLL_SENSITIVE

结果集的并发模式
只读的(READ_ONLY)
可更新的(UPDATABLE)

Connection 接口中提供的重载方法createStatement()用于获取可滚动/可更新结果集。
方法格式:

Statement createStatement(int type,int concurrency)

检测结果集类型

结果集类型与并发模式常量

ResultSet.TYPE_FORWARD_ONLY    不可滚到结果集
ResultSet.TYPE_SCROLL_INSENSITIVE   滚到不敏感结果集
ResultSet.TYPE_SCROLL_SENSITIVE     滚到敏感结果集
ResultSet.CONCUR_READ_ONLY   只读结果集

ResultSet.CONCUR_UPDATABLE    可更新结果集

使用JDBC元数据API进行检测

import java.sql.*;
public class TestMetaData{
    public static void main(String args[]){
		Connection conn = null;
		try{
		    Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";
		    conn = DriverManager.getConnection(url,"scott","tiger");
		    ResultSet rs = null;		
			DatabaseMetaData dmd = conn.getMetaData(); 
			if (dmd == null) { 
				System.out.println ("No Meta available"); 
			} else { 
				System.out.println ("数据库名称:" + dmd.getDatabaseProductName()); 
				System.out.println ("数据库版本:" + dmd.getDatabaseProductVersion()); 
				System.out.println ("数据库驱动程序:" + dmd.getDriverName()); 
				System.out.println ("驱动程序版本号:" + dmd.getDriverVersion());
				System.out.println ("--------------------------------------------");

				System.out.println ("结果集类型及支持情况(true-支持,false-不支持)");
				System.out.println ("TYPE_FORWARD_ONLY: " + 
					dmd.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY)); 
				System.out.println ("TYPE_SCROLL_INSENSITIVE: " + 
					dmd.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE)); 
				System.out.println ("TYPE_SCROLL_SENSITIVE: " + 
					dmd.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE)); 
				System.out.println ("CONCUR_READ_ONLY: " + 
					dmd.supportsResultSetType(ResultSet.CONCUR_READ_ONLY)); 
				System.out.println ("CONCUR_UPDATABLE: " + 
					dmd.supportsResultSetType(ResultSet.CONCUR_UPDATABLE)); 
			} 					    
		}catch(Exception e){
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
    }
}

使用可滚动结果集

对于可滚动结果集,可以使用ResultSet接口中定义的下述方法进行遍历:

   boolean next()
ƒ boolean previous()
ƒ boolean first()
ƒ boolean last()
ƒ void beforeFirst()
ƒ void afterLast()
ƒ boolean relative(int rows)
ƒ boolean absolute(int row)
ƒ int getRow()

import java.sql.*;
public class TestScrollResultSet{
    public static void main(String args[]){
		Connection conn = null;
		try{
		    Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";
		    conn = DriverManager.getConnection(url,"scott","tiger");
		    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = stmt.executeQuery("select * from student");
			
			while(rs.next()){
				showOneRow(rs);
			}
			System.out.println("-----------");
			rs.last();
			showOneRow(rs);
			rs.first();
			showOneRow(rs);
			rs.beforeFirst();
			rs.next();
			showOneRow(rs);
			rs.absolute(2);
			showOneRow(rs);
		}catch(Exception e){
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
    }
    
    public static void showOneRow(ResultSet rs) throws SQLException{
    	System.out.print("第" + rs.getRow() + "行: ");
		System.out.print(rs.getString(1));
		System.out.print("\t" + rs.getString(2));
		System.out.print("\t" + rs.getString(3));
		System.out.println();
    }
}

使用可更新结果集

对于可更新结果集,可以使用ResultSet接口中定义的下述方法进行更新操作:

ƒ void updateXXX(String columnName, XXX x)
ƒ void updateXXX(int columnIndex, XXX x)
ƒ void updateRow()
ƒ void moveToInsertRow()
ƒ void insertRow()
ƒ void moveToCurrentRow()

ƒ void deleteRow()
ƒ void cancelRowUpdates()

import java.sql.*;
public class TestUpdatableResultSet{
    public static void main(String args[]){
		Connection conn = null;
		try{
		    Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";
		    conn = DriverManager.getConnection(url,"scott","tiger");
		    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			ResultSet rs = stmt.executeQuery("select tid,name,salary from teacher");
			//ResultSet rs = stmt.executeQuery("select teacher.* from teacher");
			
			//更新前结果集中数据
			while(rs.next()){
				showOneRow(rs);		
			}
			
			//更新和删除记录
			rs.beforeFirst();
			while(rs.next()){
				String name = rs.getString("name").trim();
				if(name.equals("李四")){
					double sal = rs.getDouble("salary");
					rs.updateDouble("salary", sal + 8888);
					rs.updateRow();	
				}else if(name.equals("张三")){
					rs.deleteRow();	
				}	
			}
			//插入新记录
			rs.moveToInsertRow();
			rs.updateInt("tid",1005);
			rs.updateString("name","张三峰");
			rs.updateDouble("salary",2840);
			rs.insertRow();
			rs.close();
			
			//结果集更新后后数据库中数据
			System.out.println("--------------------------------------------");
			rs = stmt.executeQuery("select * from teacher");
			while(rs.next()){
				showOneRow(rs);		
			}
			rs.close();
		}catch(Exception e){
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
    }
    
    public static void showOneRow(ResultSet rs) throws SQLException{
    	System.out.print("第" + rs.getRow() + "行: ");
		System.out.print(rs.getInt(1));
		System.out.print("\t" + rs.getString(2));
		System.out.print("\t" + rs.getDouble(3));
		System.out.println();
    }
}

预处理语句

java.sql.PreparedStatement接口提供了执行预编译SQL语句的功能,它继承了java.sql.Statement接口。
Connection 对象的prepareStatement(String sql)方法可创建并返回PreparedStatement对象。
PreparedStatement接口主要方法:

void setXXX(int parameterIndex, XXX x)
ResultSet executeQuery()
int executeUpdate()

drop table mytable2;
create table mytable2(tid  number(6), name char(20), salary number(7,2));
import java.sql.*;
public class PrepStmt{
	public static void main(String[] args){
		Connection con = null;
		PreparedStatement pst = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";		
			con = DriverManager.getConnection(url,"scott","tiger");
			String sql = "insert into mytable2 values(?,?,?)";		
			pst = con.prepareStatement(sql);			
			for(int i = 101;i<200;i++){
				pst.setInt(1,i);
				pst.setString(2,"Tom" + i); 
				pst.setDouble(3,(100+i)*10);								
				pst.executeUpdate();
			}

			System.out.println("id:\tname:\tsalary:");	
			pst = con.prepareStatement("select * from mytable2 where id = ?");
			pst.setInt(1,157);
			ResultSet rs = pst.executeQuery();
			if(rs.next()){
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3));	
			}
			int[] ids = {160,171,182};
			for(int i:ids){
				pst.setInt(1,i);
				rs = pst.executeQuery();
				if(rs.next()){
					System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3));	
				}
			}
		}catch(Exception e){
			System.err.println(e);
		}finally{
			try{
				if(pst != null){
					pst.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
			
			try{
				if(con != null){
					con.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
	}
}

调用存储过程

ava.sql.CallableStatement接口提供了调用数据库服务器端存储过程(Procedure)的功能,它继承了 java.sql. PreparedStatement接口。
Connection对象的prepareCall(String sql)方法可创建并返回CallableStatement对象。
CallableStatement接口主要方法:

void setXXX(int parameterIndex, XXX x)
boolean execute()

drop procedure MyProcedure;
drop table person;
create table person(id  number primary key, name char(20), age number);
create or replace procedure MyProcedure (pid in number,name in char,age in char) 
as 
	begin 
		insert into person values(pid,name,age); 
	end;
/
import java.sql.*;
public class CallStmt{
	public static void main(String[] args){
		Connection con = null;
		CallableStatement cst = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";		
			con = DriverManager.getConnection(url,"scott","tiger");
			cst = con.prepareCall("{call MyProcedure(?,?,?)}");			
			cst.setInt(1,1001);
			cst.setString(2,"Jenny");
			cst.setInt(3,48);
			cst.execute();
			cst.close();
		}catch(Exception e){
			System.err.println(e);
		}finally{
			try{
				if(con != null){
					con.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
	}
}

事务处理

和数据库中的事务管理模式相对应,JDBC中的Connection对象也可分为自动提交和非自动提交两种模式。
JDBC驱动程序的默认事务管理模式为"自动提交"。
Connection接口提供的事务处理相关方法:

ƒ void setAutoCommit(boolean autoCommit)
ƒ boolean getAutoCommit()
ƒ void commit()
ƒ void rollback()

import java.sql.*;

public class TestCommit{
    public static void main(String args[]){
		Connection conn = null;
		try{
		    Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url="jdbc:oracle:thin:@127.0.0.1:1521:dbrbh";
		    conn=DriverManager.getConnection(url,"scott","tiger");
			boolean autoCommit = conn.getAutoCommit();
			
		    // 关闭自动提交功能
		    conn.setAutoCommit(false);
		    Statement stmt=conn.createStatement();
		    stmt.executeUpdate("insert into dept values (77,'Market','Beijing')");
		    stmt.executeUpdate("insert into dept values (88,'R&D','Shanghai')");
		    ResultSet rs=stmt.executeQuery("select * from dept");
		    while(rs.next()){
				System.out.print("DeptNo: "+rs.getInt(1));
				System.out.print("\tDeptName: "+rs.getString(2));
				System.out.println("\tLOC: "+rs.getString(3));						    
			}
			// 提交事务
			conn.commit();      
			// 恢复原来的提交模式
			conn.setAutoCommit(autoCommit);
			stmt.close();
		}catch(Exception e){
			System.out.println("操作失败、任务撤消!");
		    try{
		    	// 回滚、取消前述操作
		    	conn.rollback();   
		    }catch(Exception e1){
		    	e.printStackTrace();	
		    }		    
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
    }
}

事务处理之部分回滚

JDBC3.0开始支持在事务中使用保存点(Savepoint),以实现对数据库事务的进一步控制、即支持部分回滚功能。
java.sql.Savepoint接口表示数据库事务中的保存点。
在Connection对象的rollback()方法中可以对当前事务中的保存点进行引用,从而将事务回滚到该保存点。

drop table teacher;
create table teacher(tid  number(6), name char(20), salary number(7,2));
import java.sql.*;
public class TestSavepoint{
	public static void main(String[] args){
		Connection conn = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";		
			conn = DriverManager.getConnection(url,"scott","tiger");
			conn.setAutoCommit(false);
			Statement stmt = conn.createStatement();
			stmt.executeUpdate("insert into teacher values(11,'Tom',2500)");
			stmt.executeUpdate("insert into teacher values(12,'John',3400)");
			Savepoint sp1 = conn.setSavepoint("p1");
			stmt.executeUpdate("insert into teacher values(13,'Billy',3150)");
			Savepoint sp2 = conn.setSavepoint("p2");
			stmt.executeUpdate("update teacher set salary = salary+8888 where tid = 12");
			ResultSet rs = stmt.executeQuery("select avg(salary) from teacher");
			rs.next();
			double avg_sal = rs.getDouble(1);
			if(avg_sal > 4000){
				conn.rollback(sp1);	
			}else if(avg_sal >= 3000){
				conn.rollback(sp2);	
			}
			conn.commit();
			
			rs = stmt.executeQuery("select * from teacher");
			while(rs.next()){
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3));	
			}
			rs.close();
			stmt.close();
		}catch(Exception e){
			System.out.println("Failure,rollback!");
		    try{
		    	conn.rollback();   
		    }catch(Exception e1){
		    	e.printStackTrace();	
		    }		    
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
	}
}
 

批处理

JDBC2.0开始提供了对数据库操作的批处理(Batch Processing)功能,使用批处理功能避免了向数据库进行一连串的调用,从而可以显著提高程序的运行效率。
Statement接口提供的批处理相关方法:

void addBatch(String sql)
int[] executeBatch()
void clearBatch()

drop table teacher;
create table teacher(tid  number(6), name char(20), salary number(7,2));
import java.sql.*;
public class TestBatch{
	public static void main(String[] args){
		Connection conn = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";		
			conn = DriverManager.getConnection(url,"scott","tiger");
			conn.setAutoCommit(false);
			Statement stmt = conn.createStatement();
			stmt.addBatch("insert into teacher values(11,'Tom',2500)");
			stmt.addBatch("insert into teacher values(12,'John',3400)");
			stmt.addBatch("insert into teacher values(13,'Billy',3150)");
			stmt.addBatch("update teacher set salary = salary + 88");
			stmt.executeBatch();
			conn.commit();
			
			ResultSet rs = stmt.executeQuery("select * from teacher");
			while(rs.next()){
				System.out.println(rs.getInt(1) + "\t" + rs.getString(2).trim() + "\t" + rs.getDouble(3));	
			}
			rs.close();
			stmt.close();
		}catch(Exception e){
			System.out.println("Failure,rollback!");
		    try{
		    	conn.rollback();   
		    }catch(Exception e1){
		    	e.printStackTrace();	
		    }		    
		    e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}
		}
	}
}

高级SQL类型BLOB/CLOB

高级SQL类型BLOB/CLOB
BLOB(Binary Large OBject,二进制大对象类型用于保存大规模的二进制数据
CLOB(Character Large OBject,文本大对象)类型则用于保存大规模的文本数据

JDBC2.0开始引入了对应于SQL99标准的多种高级数据类型,其中最重要的是两种大对象类型BLOB和CLOB。

使用BLOB类型

drop table Student_List;
create table Student_List(
    Student_ID varchar2(20) primary key,
    Student_Name varchar2(20) not null,
    Student_Pic BLOB
);
import java.sql.*;
import java.io.*;

public class SavePicture{
	public static void main(String[] args){	
		Connection conn = null;	
	    PreparedStatement stmt = null;
	    FileInputStream fis = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521dbrbh";
			conn = DriverManager.getConnection(url, "scott","tiger");
			String sql = "insert into Student_List values(?,?,?)";
			stmt=conn.prepareStatement(sql);
			stmt.setString(1,"s01");
			stmt.setString(2,"Youyou");
			File file = new File("girl.jpg");
           	fis = new FileInputStream(file);
           	stmt.setBinaryStream(3, fis, (int)file.length());
			stmt.executeUpdate();
			stmt.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
		    try{
		        if(fis!=null){
		        	fis.close();
		        }
		    }catch(IOException ioe){
		        ioe.printStackTrace();
		    }
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}		
		}		
	}
}
import java.sql.*;
import java.io.*;

public class GetPicture{
	public static void main(String[] args){
	    PreparedStatement stmt = null;
	    ResultSet rs =  null;
		Connection conn = null;
	    FileOutputStream fos = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url=   "jdbc:oracle:thin:@localhost:1521:dbrbh";
			conn = DriverManager.getConnection(url,"scott","tiger");
			String sql="select * from Student_List where Student_ID='s01'";
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
            rs.next();
			File file = new File("d:\\kk.jpg");
            fos = new FileOutputStream(file);  
            InputStream is = rs.getBinaryStream(3);
            int len = 0;
            byte b[] = new byte[4*1024];
            while((len=is.read(b))!=-1)
            {
                fos.write(b,0,len);
            }
            fos.flush();
			fos.close();
            is.close();
            rs.close();
			stmt.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
		    try{
		        if(fos!=null){
		        	fos.close();
		        }
		    }catch(IOException ioe){
		        ioe.printStackTrace();
		    }
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}		
		}	
	}
}

使用CLOB类型 

drop table book_list;
create table book_list(
    bid varchar2(20) primary key,
    name varchar2(40) not null,
    content CLOB
);
import java.sql.*;
import java.io.*;

public class SaveClob{
	public static void main(String[] args){	
		Connection conn = null;	
	    PreparedStatement stmt = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:dbrbh";
			conn = DriverManager.getConnection(url, "scott","tiger");
			String sql = "insert into book_list values(?,?,?)";
			stmt=conn.prepareStatement(sql);
			stmt.setString(1,"b001");
			stmt.setString(2,"99个简单法则");
			BufferedReader br = new BufferedReader(new FileReader("a.txt"));
			StringBuffer sb = new StringBuffer();
			String s;
			while((s=br.readLine()) != null){
				sb.append(s + "\n"); 
			}
			br.close();
			String content = sb.toString();           	
			StringReader sr = new StringReader(content);
			stmt.setCharacterStream(3, sr, content.length());
			stmt.executeUpdate();
			sr.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}		
		}		
	}
}
import java.sql.*;
import java.io.*;

public class GetClob{
	public static void main(String[] args){
		Connection conn = null;
	    PreparedStatement stmt = null;
	    ResultSet rs =  null;
	    FileOutputStream fos = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url=   "jdbc:oracle:thin:@localhost:1521:dbrbh";
			conn = DriverManager.getConnection(url,"scott","tiger");
			String sql="select * from book_list where bid='b001'";
			stmt = conn.prepareStatement(sql);			
			rs = stmt.executeQuery();
            rs.next();            			
			
			StringBuffer sb = new StringBuffer();
            Reader rd = rs.getCharacterStream(3);
            BufferedReader br = new BufferedReader(rd);
			String s;
            while((s=br.readLine())!=null)
            {
                sb.append(s + "\n");
            }
            System.out.println(sb.toString());
            
            rs.close();
            br.close();
			stmt.close();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(conn != null){
					conn.close();	
				}	
			}catch(Exception e){
		    	e.printStackTrace();
			}		
		}
	}
}

 

分享到:
评论

相关推荐

    JDBC编程!java中的数据库连接!源代码!适合初学者!

    此外,JDBC编程也有一些高级特性,比如连接池、事务处理、批处理等,这些都可以在JDBC编程中使用,以提高程序的性能和效率。 在实际开发中,由于JDBC编程较为繁琐,通常会使用一些框架来简化JDBC编程,比如...

    Java JDBC编程总结

    ### Java JDBC编程总结 #### 一、JDBC基本原理 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,这使得Java应用程序无需依赖于底层数据库的具体实现就...

    实验九:JDBC编程

    JDBC编程实验报告 本实验报告总结了使用Java数据库连接(JDBC)编程的实验过程和结果。通过本实验,我掌握了JDBC的概念与使用场景,理解了JDBC的工作原理,掌握了使用JDBC操作数据库的基本步骤,掌握了JDBC中几个...

    高性能 Oracle JDBC 编程

    ### 高性能Oracle JDBC编程详解 #### 一、引言 在现代企业级应用中,数据库性能是系统响应速度和用户满意度的关键因素之一。Oracle作为全球领先的数据库管理系统,其高效性和稳定性得到了广泛认可。为了充分利用...

    数据库基础与JDBC编程技术.

    数据库基础与JDBC编程技术是IT领域中至关重要的部分,主要涉及如何管理和操作数据以及如何通过Java语言与数据库进行交互。下面将详细讲解这两个主题。 首先,我们来探讨数据库基础。数据库是一个组织和存储数据的...

    《老罗Android开发视频教程》服务器端JDBC编程(源码&PPT)

    《老罗Android开发视频教程》中的“服务器端JDBC编程”部分主要讲解了如何在Android应用中与远程数据库进行交互,使用Java Database Connectivity (JDBC) 技术来实现这一目标。JDBC是Java中用于访问数据库的标准接口...

    JDBC编程技术.rar_JDBC编程例子_JDBC编程技术_brownmxh_java

    本资料"JDBC编程技术.rar"提供了关于JDBC编程的详细指南和实例,作者brownmxh是一名Java领域的专家。 在JDBC编程中,首先需要理解的是JDBC驱动程序的四个主要类型:Type 1、Type 2、Type 3和Type 4。Type 1是纯Java...

    jdbc 编程实例

    **JDBC编程实例详解** Java Database Connectivity(JDBC)是Java平台中用于访问数据库的标准Java API,它允许Java应用程序与各种数据库进行交互。本篇将深入讲解JDBC编程实例,帮助开发者更好地理解和运用JDBC技术...

    JDBC学习资料 jdbc编程

    事件模型是Java图形用户界面(GUI)编程的一部分,与JDBC关系不大,但在构建用户交互应用时很重要。在AWT(Abstract Window Toolkit)中,事件模型包括: 1. Event:用户在用户界面上的操作,如点击按钮、移动鼠标等...

    基于Java的网吧管理系统,MySQL数据库,JDBC编程!

    基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java的网吧管理系统,MySQL数据库,JDBC编程! 基于Java...

    JDBC编程范例

    在JDBC编程中,通常包含以下几个核心步骤: 1. **加载驱动**:首先需要在程序中加载数据库驱动,这通常是通过`Class.forName()`方法完成的。例如,对于Apache Derby数据库,驱动类名是`org.apache.derby.jdbc....

    jsp网页编程JDBC编程

    5. **JDBC编程设计**:在JSP中,使用JDBC通常涉及加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL语句、处理结果集,以及关闭资源。PreparedStatement能防止SQL注入攻击,性能也更好,因为它...

    JDBC编程 J275练习题、Java基础知识

    **JDBC编程与Java基础知识详解** 在IT领域,Java数据库连接(JDBC)是Java程序访问数据库的关键技术,它提供了一组标准API,使得开发者能够用Java语言与各种类型的数据库进行交互。本篇将深入探讨JDBC编程的核心...

    JDBC编程技术_jdbc

    **JDBC编程技术详解** Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准应用程序接口,它由Java SE的java.sql和javax.sql包提供。JDBC允许Java开发者执行SQL语句并处理从数据库返回的结果。这...

    JDBC编程技术JDBC编程技术

    JDBC编程技术JDBC编程技术JDBC编程技术JDBC编程技术JDBC编程技术JDBC编程技术JDBC编程技术

    jdbc编程[归纳].pdf

    本文档是关于 JDBC 编程的总结,涵盖了 JDBC 的基础知识、JDBC API 介绍、JDBC 驱动程序的类型、JDBC 连接到 Oracle、JDBC 程序优化、JDBC 分页、JDBC 封装、JDBC 与 Swing 的集成开发等内容。 作为一名软件开发者...

    Impala的JDBC编程驱动

    标题中的“Impala的JDBC编程驱动”指的是Impala(一个开源的、高性能的SQL查询引擎,用于处理存储在Hadoop集群中的数据)与Java应用程序之间的桥梁,即JDBC(Java Database Connectivity)驱动。JDBC驱动是Java...

    javaJDBC编程.ppt

    javaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.pptjavaJDBC编程.ppt

Global site tag (gtag.js) - Google Analytics