zoukankan      html  css  js  c++  java
  • 关于Java_Web连接Oracle数据库

    1.前提条件

    1>装有Oracle数据库(因为连接的时候需要开启两项服务)

    2>myeclipse或eclipse(支持WebProject的版本)开发环境,本机以myeclipse为例,二者没有什么大的区别

    3>装有Tomcat,Weblogic或其它任何服务器(本机装有Tomcat6.0)

    4>有Oracle数据库的厂商驱动(一般能够在Oracle安装目录下找到所需的jar包,例如本机的jar所在文件夹路径为D:oraclexeapporacleproduct11.2.0serverjdbclib)

    2.新建Web项目

    在myeclipse中新建一个WebProject,由于只是简单的尝试,那么就把所有代码都写在WebProject/WebRoot/index.jsp文件里好了,双击index.jsp打开编辑器

    3.编码

    <hr>
            <%="下面来演示Oracle数据库的增删改查操作<br>"%>
            <%
                //加载数据库的驱动类
                Connection conn = null;
                try {
                    Class.forName("oracle.jdbc.driver.OracleDriver");
                } catch (Exception e) {
                    out.print("<br>Error:加载驱动类失败");
                }
                try {
                    conn = DriverManager.getConnection(
                            "jdbc:oracle:thin:@localhost:1521:XE", "ay", "ayqy");
                    //特别说明:Oracle的URL格式为jdbc:oracle:thin:@[ip]:1521:[sid]
                    //这里的SID的值应该是数据库的Name,若是要连接到默认数据库,则SID的值为版本名,本机为XE
                    //数据库的Name在PLSQL Developer(一个GUI的Oracle数据库管理软件)登录时可以看到
                    
                    //*若要以管理员身份连接,应把第二个参数改为"sys as sysdba"
                    //*默认以普通用户身份连接
                } catch (Exception e) {
                    out.print("<br>Error:获取连接失败");
                    out.print("<br>" + e.getMessage());
                }
    
                Statement stat = conn.createStatement();
                String sql = null;
    
                ////先查询记录是否存在
                sql = "select * from tb_std where NUM = 1008";
                ResultSet rs = stat.executeQuery(sql);
                boolean exists = false;
                if (rs.next())
                    exists = true;
                if (!exists) {//若不存在则添加数据
                    out.print("不存在NUM为1008的记录,即将添加一条<br>");
                    String today = "to_date('2014-03-08 21:15:00','yyyy-mm-dd hh24:mi:ss')";
                    //注意Oracle中date类型数据带有时分秒,插入date型数据时必须带有时分秒一起转换,否则会出错
                    sql = "insert into tb_std(NUM,REGDATE,FEE,GRADE,CLASS,MAJOR,EXTRA,BIRTHPLACE,NAME) values(1008,"
                            + today
                            + ",2014,3,'A','Chinese',200,'England','SamStone')";
                    stat.executeUpdate(sql);
                }
                out.print("NUM为1008的记录添加完毕<br>");
    
                //
                sql = "delete from tb_std where NUM = 1007";
                stat.executeUpdate(sql);
                out.print("NUM为1007的记录被删掉了<br>");
                
                //
                sql = "update tb_std set num = 1009 where NUM = 1008";
                stat.executeUpdate(sql);
                out.print("NUM为1008的记录NUM被改为1009了<br>");
    
                //
                sql = "select * from tb_std";
                rs = stat.executeQuery(sql);
                //显示查询结果
                out
                        .print("num__name<br>");
                while (rs.next()) {
                    String num = rs.getString("num");
                    String name = rs.getString("name");
                    out.print(num + "__" + name + "<br>");
                }
                out.print("上面是查询结果<br>");
                
                //
                sql = "delete from tb_std where NUM = 1009";
                int num = stat.executeUpdate(sql);
                out.print("删除NUM值为1009的记录 " + num + " 条记录受到影响" + "<br>");
                
                //使用PreparedStatement
                out.print("下面演示PrepareStatement的用法<br>");
                String number = "2014";
                String stdName = "新世纪";
                sql = "insert into tb_std(num,name) values(?,?)";
                PreparedStatement ps = conn.prepareStatement(sql);
                ps.setString(1,number);//设置第N个参数的值
                ps.setString(2,stdName);
                int i = ps.executeUpdate();
                ps.close();
                out.print("成功添加了 " + i + " 行<br>");
                out.print("使用PreparedStatement的优点:<br>1.增强了程序的可维护性<br>2.增加了程序的安全性[防止SQL注入式攻击]<br>3.避免了动态创建字符串,提高了程序效率<br>");
                
                //调用存储过程
                CallableStatement cs = conn.prepareCall("{call delStd(?)}");
                //若存储过程由返回值,应该先注册out参数的JDBC类型,例如cs.registerOutParameter(index,Types.CHAR);
                cs.setString(1,"2014");
                cs.executeQuery();
                //若需要获取out参数返回值,用String result = cs.getString(index);
                out.print("调用存储过程成功,删掉了num为2014的所有记录<br>");
                cs.close();
                
                //演示事务的用法
                out.print("下面演示事务的用法<br>");
                try{
                conn.setAutoCommit(false);//设置不自动提交(默认自动提交)
                //声明sql1
                String sql1 = "insert into tb_std(num,name) values(?,?)";
                PreparedStatement ps1 = conn.prepareStatement(sql);
                ps1.setString(1,"2012");
                ps1.setString(2,"某某人");
                //声明sql2
                String sql2 = "update tb_std set num = ? where num = ?";
                PreparedStatement ps2 = conn.prepareStatement(sql2);
                ps2.setString(1,"1000");
                ps2.setString(2,"2012");
                //执行sql1和sql2
                ps1.executeUpdate();
                ps2.executeUpdate();
                //提交操作,事务完成
                conn.commit();
                }catch(Exception e){
                    out.print(e.getMessage());
                    conn.rollback();//回滚
                }
                out.print("使用事务的优点:保证系列操作的连续性,要么全做,要么不做<br>");
    
                try {
                    stat.close();
                    conn.close();
                } catch (Exception e) {
                    out.print("<br>Error:连接关闭失败");
                    out.print("<br>" + e.getMessage());
                }
            %>

    P.S:“查”操作相对比较麻烦(涉及到对查询结果的处理),而“增,删,改”都比较简单,与“查”唯一的区别是用的Statement对象的方法不同。“查”用stat.executeQuery(String sql);语句,返回一个ResultSet结果集对象,而其他三种操作都用stat.executeUpdate(String sql);语句,返回一个int类型的值,该值表示执行sql语句后受到影响的记录数(即表的行数)

    4.导入jar包

    本机装的Oracle数据库版本是11g,在上面提到的路径下有三个jar包,分别是ojdbc5.jar,ojdbc6.jar,ojdbc6_g.jar,5适用于较低版本的Oracle,这里为了简单起见把三个jar都导入,复制jar包到WebProject/WebRoot/WEB-INF/lib目录下。

    5.开启Oracle服务

    开始-所有程序-Oracle Database 11g Express Edition-启动数据库,弹出黑框,等待30秒左右即可(需要开启两个相关服务)

    6.开启Tomcat服务器

    7.可能遇到的异常

    1>严重: Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException

    分析:没有开启服务器,引起空指针异常

    解决方案:在myeclipse中找到Run/Stop/Restart MyEclipse Servers快捷图标,单击小箭头,找到需要开启的服务器(如Tomcat6.x),点击Start选项启动服务器

    2>有时候会发现Oracle服务和Tomcat服务不能共存(例如,启动Oracle服务后,继续启动Tomcat遇到异常,不能正常启动)

    分析:这是因为8080端口被占用了,因为Oracle和Tomcat安装时默认的端口号都是8080,需要修改Tomcat默认的端口号来解决冲突

    解决方案:开始-所有程序-Apache Tomcat 6.0 Tomcat6-Tomcat 6.0 Program Directory点击打开文件夹,用记事本打开conf/server.xml,Ctrl+F查找“Connector port”找到位置“<Connector port="8080" protocol="HTTP/1.1" ”把8080改为一个空闲的端口号即可(例如本机改为了9527)

    3>这是一个比较奇怪的问题,本机测试逐一删除已导入的jar包,初衷是想测试项目需要的是哪一个jar文件,却发现删掉所有jar包后,项目还是可以运行

    分析:可能是myeclipse自带连接Oracle数据库的jar(项目自动生成的jre中可能有所需的jar文件),因为Oracle收购的SUN,所以可能会对Oracle数据库提供特殊的支持

    解决方案:为了保险起见,建议把jar文件导入项目,没有太大坏处

  • 相关阅读:
    jQuery中的事件与动画
    jQuery选择器
    Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等
    Flask学习【第2篇】:Flask基础
    Flask学习【第1篇】:Flask介绍
    Python学习总目录
    Linux--安装Python3&虚拟环境
    Linux基础之vim
    Linux基础值Shell
    Linux文件系统结构
  • 原文地址:https://www.cnblogs.com/ayqy/p/3588550.html
Copyright © 2011-2022 走看看