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+">&nbsp;"+i+"&nbsp;</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>

版权所有,转载请注明出处 luowei.github.io.