Java-Java基础15之操作Oracle数据库
主要内容有: 使用Java操作Oracle数据库、处理事务以及存储过程等
文件结构(java操作oracle数据库)
TestMyOracle/src/com.oracle/TestOra.java
/**
* 演示如何使用Jdbc_obdb桥接方式操作oracle
*/
package com.oracle;
import java.sql.*;
public class TestOra {
/**
* @param args
*/
public static void main(String[] args) {
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
try {
//1.加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.加载驱动
ct=DriverManager.getConnection("jdbc:odbc:orcl","scott","luowei");
//以下和sql server 一样
sm=ct.createStatement();
rs=sm.executeQuery("select * from emp");
while(rs.next())
{
//用户名
System.out.println("用户名:"+rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try
{
//关闭打开的资源
rs.close();
sm.close();
ct.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TestMyOracle/src/com.oracle/TestOra2.java
/**
* 使用jdbc连接oracle
*/
package com.oracle;
import java.sql.*;
public class TestOra2 {
/**
* @param args
*/
public static void main(String[] args) {
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","luowei");
//以下和sql server 一样
sm=ct.createStatement();
rs=sm.executeQuery("select * from emp");
while(rs.next())
{
//用户名
System.out.println("用户名:"+rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try
{
//关闭打开的资源
rs.close();
sm.close();
ct.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test1/TestTrans.java
/**
* 测试事务的案例
*/
package com.test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestTrans
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
try {
//1.加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.加载驱动
ct=DriverManager.getConnection("jdbc:odbc:orcl","scott","luowei");
//以下和sql server 一样
sm=ct.createStatement();
//加入事务处理
ct.setAutoCommit(false);
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
//int i=7/0;
sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");
ct.commit();
rs=sm.executeQuery("select ename,sal from emp");
while(rs.next())
{
//用户名
System.out.print("用户名:"+rs.getString(1));
System.out.println(" sal:"+rs.getString(2));
}
} catch (Exception e) {
//如果发生异常就回滚
try
{
ct.rollback(); //回滚
} catch (SQLException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try
{
//关闭打开的资源
rs.close();
sm.close();
ct.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test2/TestOraclePro.java
/**
* 测试Oracle的存储过程
* 演示java程序去调用oracle的存储过程
*
* 存储过程:
* 1/写一个过程,可以输入雇员名,新工资 可修改雇员名的工资
* 2/如何调用过程有两种方法:
* 3/如何在java程序中调用一个存储过程
create or replace procedure my_pro(myName varchar2,newSal number) is
--在这里可以定义变量
begin
--执行部分,根据用户名去修改工资
update emp set sal=newSal where ename=myName;
end;
/
*/
package com.test2;
import java.sql.*;
public class TestOraclePro
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call my_pro(?,?)}");
//4.给?赋值
cs.setString(1, "SMITH");
cs.setInt(2, 2088);
//加入事务处理
ct.setAutoCommit(false);
//5.执行
cs.execute();
ct.commit();
} catch (Exception e)
{
//如果发生异常就回滚
try
{
ct.rollback(); //回滚
} catch (SQLException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}finally
{
try
{
//关闭资源
cs.close();
ct.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test3/Test1.java
/**
* 调用一个无返回值的过程
* 存储过程:
--建book表
create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50));
--编写过程
--in:表示函数的输入参数,不写默认是in
--out:表示一个输出参数
create or replace procedure my_pro(myBookId in number,
mybookName in varchar2,mypublishHouse in varchar2) is
begin
insert into book values(myBookId,mybookName,mypublishHouse);
end;
/
*/
package com.test3;
import java.sql.*;
public class Test1
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call my_pro(?,?,?)}");
//4.给?赋值
cs.setInt(1, 10);
cs.setString(2, "三国演义");
cs.setString(3, "人民出版社");
//5.执行
cs.execute();
} catch (Exception e)
{
e.printStackTrace();
}finally
{
try
{
//关闭各种打开的资源
cs.close();
ct.close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test3/Test2.java
/**
* 调用一个有返回值的过程
* 存储过程:
--建book表
create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50));
--有返回值的存储过程---------------------------------------------------
--1.编写一个过程,可以输入书的编号,并返回该书的名字
--有输入和输出的存储过程
create or replace procedure my_pro(myno in number,myName out varchar2) is
begin
select ename into myName from emp where empno=myno;
end;
/
*/
package com.test3;
import java.sql.*;
public class Test2
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call my_pro(?,?)}");
//4.给?赋值
cs.setInt(1, 7788);
//给第二个?赋值(从第二个问号取出值)
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
//5.执行(不要忘记执行,否则会出现 NullPointException)
cs.execute();
//取出返回值(从第二个?取返回值)
String name=cs.getString(2);
System.out.println("7788的名字是:"+name);
//5.执行
cs.execute();
} catch (Exception e)
{
e.printStackTrace();
}finally
{
try
{
//关闭各种打开的资源
cs.close();
ct.close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test3/Test3.java
/**
* 调用一个有多个返回值的过程(非列表)
* 存储过程:
--建book表
--2.r返回多个值(非列表)-------------
create or replace procedure my_pro
(myno in number,myName out varchar2,
mySal out number,myJob out varchar2) is
begin
select ename,sal,job into myName,mySal,myJob from emp where empno=myno;
end;
/
*/
package com.test3;
import java.sql.*;
public class Test3
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call my_pro(?,?,?,?)}");
//4.给?赋值
cs.setInt(1, 7369);
//给后面的?赋值(从第二个问号取出值)
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
cs.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
//5.执行(不要忘记执行,否则会出现 NullPointException)
cs.execute();
//取出返回值(从第二个?取返回值)
String name=cs.getString(2);
String job=cs.getString(4);
System.out.println("7369的名字是:"+name);
System.out.println("7369的工作是:"+job);
} catch (Exception e)
{
e.printStackTrace();
}finally
{
try
{
//关闭各种打开的资源
cs.close();
ct.close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
TestMyOracle/src/com.test3/Test4.java
/**
* 调用一个有多个返回值的过程(列表)
* 存储过程:
--建book表
--3.返回多个值(列表[结果集])--------------
--编写一个过程,输入部门号,返回该部门所有雇员信息
--oracle存储过程没有返回值,它的所有的返回值都是通过out参数来替代的,
--列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package,所以要分两部分
----第1步,创建一个包,在该包中,定义了类型test_cursor,是个游标类型
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
----第2步,创建过程
create or replace procedure my_pro
(myNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=myNo;
end;
/
*/
package com.test3;
import java.sql.*;
public class Test4
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
ResultSet rs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call my_pro(?,?)}");
//4.给?赋值
cs.setInt(1, 10);
//给后面的?赋值(从第二个问号取出值)
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
//5.执行(不要忘记执行,否则会出现 NullPointException)
cs.execute();
//得到结果集(从第二个?取返回值)
rs=(ResultSet)cs.getObject(2);
while(rs.next())
{
System.out.println(rs.getInt(1)+" "+rs.getString(2));
}
} catch (Exception e)
{
e.printStackTrace();
}finally
{
try
{
//关闭各种打开的资源
rs.close();
cs.close();
ct.close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
TestOracleFenYe/src/com.test/test1.java
/**
* 调用一个有多个返回值的过程(列表)
* 存储过程:
--分页-----
select * from (select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)where rn>=6;
----------------------------------------------------------------------------
--首先创建一个包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--开始编写分布过程--------------------------------
create or replace procedure fenye
(tableName in varchar2,
pageSize in number, --每页显示的记录数
pageNow in number, --要显示的哪一页
myrows out number,--总记录数
myPageCount out number, --总页数
p_cursor out testpackage.test_cursor --返回的记录
) is
--定义部分
--定义sql语句,字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSize;
begin
--执行部分
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||' order by sal) t1 where rownum<='||v_end||')where rn>='||v_begin; --将分页的字符串送给变量v_sql
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql
v_sql:='select count(*) from '||tableName;
--执行sql,并把返回的值,赋给myrows
execute immediate v_sql into myrows;
--计算myPageCount
if mod(myrows,pageSize)=0 then
myPageCount:=myrows/pageSize;
else
myPageCount:=myrows/pageSize+1;
end if;
--关闭游标
--close p_cursor;
end;
/
*/
package com.test;
import java.sql.*;
public class Test1
{
/**
* @param args
*/
public static void main(String[] args)
{
Connection ct=null;
CallableStatement cs=null;
ResultSet rs=null;
try
{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","luowei");
//3.创建CallableStatement
cs=ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
//4.给?赋值
cs.setString(1,"emp");
cs.setInt(2, 5); //pageSize
cs.setInt(3, 1); //pageNow
//
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER); //myrows(总记录数)
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); //pageCount
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR); //结果集
cs.execute();
//取出总记录数,注意getInt(4)是由该参数的位置决定的
int rowNum=cs.getInt(4);
int pageCount=cs.getInt(5);
rs=(ResultSet)cs.getObject(6);
//显示取出的参数与结果集
System.out.println("rowNum:="+rowNum);
System.out.println("pagaeCount:="+pageCount);
while(rs.next())
{
System.out.println("编号:"+rs.getInt(1)+" 姓名:"+rs.getString(2)+" 工资"+rs.getFloat(6));
}
} catch (Exception e)
{
e.printStackTrace();
}finally
{
try
{
//关闭各种打开的资源
rs.close();
cs.close();
ct.close();
} catch (SQLException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
TestOracleFenYe/WebRoot/MyTest.jsp
<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'MyTest.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h2>oracle分页案例</h2>
<table>
<tr><td>用户名</td><td>薪水</td></tr>
<%
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","luowei");
//以下和sql server 一样
sm=ct.createStatement();
//接收pageNow
String s_pageNow=(String)request.getParameter("pageNow");
int pageNow=1;
if(s_pageNow!=null)
{
pageNow=Integer.parseInt(s_pageNow);
}
//查询总页数
int pageCount=0;
int rowCount=0; //共有多少记录
int pageSize=3; //每页显示几条记录
rs=sm.executeQuery("select count(*) from emp");
if(rs.next())
{
rowCount=rs.getInt(1);
if(rowCount%pageSize==0)
{
pageCount=rowCount/pageSize;
}
else
{
pageCount=rowCount/pageSize+1;
}
}
//分页,每页显示3个人
rs=sm.executeQuery("select * from (select a1.*,rownum rn from"
+" (select * from emp) a1 where rownum<"+pageNow*pageSize+") where rn>="+(pageNow-1)*pageSize);
while(rs.next())
{
out.println("<tr>");
//用户名
out.println("<td>"+rs.getString(2)+"</td>");
out.println("<td>"+rs.getString(6)+"</td>");
out.println("</tr>");
}
//打印总页数
for(int i=1;i<=pageCount;i++)
{
out.println("<a href=MyTest.jsp?pageNow="+i+"> "+i+" </a>");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try
{
//关闭打开的资源
rs.close();
sm.close();
ct.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
%>
</table>
</body>
</html>