Java基础15

Java基础15

目录

Java基础15    1

文件结构(java操作oracle数据库)    1

TestMyOracle/src/com.oracle/TestOra.java    1

TestMyOracle/src/com.oracle/TestOra2.java    2

TestMyOracle/src/com.test1/TestTrans.java    4

TestMyOracle/src/com.test2/TestOraclePro.java    6

TestMyOracle/src/com.test3/Test1.java    8

TestMyOracle/src/com.test3/Test2.java    9

TestMyOracle/src/com.test3/Test3.java    11

TestMyOracle/src/com.test3/Test4.java    13

TestOracleFenYe/src/com.test/test1.java    15

TestOracleFenYe/WebRoot/MyTest.jsp    18

文件结构(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>

原文地址:https://www.cnblogs.com/luowei010101/p/2168734.html