4.4 连接Oracle数据库

实例084 通过JDBC连接Oracle数据库

本实例是一个典型的、连接数据库的程序

实例位置:光盘\mingrisoft\04\084

实例说明

由于Oracle数据库的数据管理功能比较强大,对计算机的要求比较高,初学者很少使用它,但是由于它在IT行业所占的地位比较重要,又必须学会使用它,在程序中使用的前提是成功连接数据库,本例将通过JDBC连接Oracle数据库,运行本实例,将查询“家庭住址”为“长春”的员工信息,如图4.39所示。

图4.39 通过JDBC连接数据库

技术要点

要通过JDBC方式连接数据库,首先是加载数据库驱动程序,加载方式如下:

        Class.forName(String driverClass).newInstance();

参数说明:

参数driverClass用来指定数据库驱动,Oracle数据库的驱动为oracle.jdbc.driver.Oracle Driver。

注意:数据库驱动只需在该类第一次被调用时执行一次,所以通常将加载数据库驱动放在静态方法中。

然后是建立数据库连接,建立方式如下:

        Connection con = DriverManager.getConnection(url, username, password);
        Statement stat stat = con.createStatement();

参数说明:

● url是数据库的访问路径。

例如本例的url为jdbc:oracle:thin:@localhost:1521:MRSOFT。

● username为连接数据库的用户名。

● password为用户密码。

在完成对数据库的操作后,关闭数据库连接,关闭方式如下:

        stat.close();
        con.close();

注意:在每次操作数据库之前,都要重新建立数据库连接,并且在操作结束后及时关闭数据库连接,释放数据库连接所占用的资源。

实现过程

(1)创建数据表。本例将用到TB_RECORD表,表结构如图4.40所示。

图4.40 数据表结构图

(2)编写操作数据库的JavaBean(JdbcDriver.java),代码如下:

        public class JdbcDriver {
            static String driverClass = "oracle.jdbc.driver.OracleDriver";
            String url = "jdbc:oracle:thin:@localhost:1521:MRSOFT";
            String username = "SYSTEM";
            String password = "SYSTEM";
            static{                              //加载数据库驱动类,放在静态块中
                try {
                    Class.forName(driverClass).newInstance();
                } catch (Exception e) {
                    System.out.println("在加载驱动类时抛出异常,内容如下:");
                    e.printStackTrace();
                }
            }
            Connection con = null;
            Statement stat = null;
            ResultSet rs = null;
            public void openCon(){                 //开启数据库连接的方法
                try {
                    con = DriverManager.getConnection(url, username, password);
                    stat = con.createStatement();
                } catch (Exception e) {}
            }
            public void closeCon(){                //关闭数据库连接的方法
                try {
                    if (rs != null) {
                        rs.close();
                    }
                    if (stat != null) {
                        stat.close();
                    }
                    if (con != null) {
                        con.close();
                    }
                } catch (Exception e) {}
            }
            public ResultSet query(String sql){     //查询数据的方法
                try {
                    rs = stat.executeQuery(sql);
            } catch (Exception e) {}
            return rs;
        }
        }

(3)编写JSP页,查询所有数据,并遍历查询结果。关键代码如下:

        <%
            JdbcDriver jdbc=new JdbcDriver();
            jdbc.openCon();                       //建立连接
            ResultSet rs=jdbc.query("select*from TB_RECORD”+where+”order by id");  // 查询数据
            try{
                while(rs.next()){                 //遍历查询结果
        %>
            <tr align="center">
                <td><%=rs.getInt("ID") %></td>
                <td><%=rs.getString("NAME") %></td>
                <td><%=rs.getDate("BIRTHDAY") %></td>
            </tr>
        <%
                }
            }catch(Exception e){
            }finally{
                jdbc.closeCon();                  // 关闭连接
            }
        %>

注意:一定要在数据库操作完全结束之后关闭数据库,否则会发生连接已关闭的异常,例如不可以在查询数据之后,遍历查询结果之前关闭数据库连接。

举一反三

根据本实例,读者可以:

通过JDBC实现数据的插入、修改和删除;

通过JDBC连接其他数据库。

实例085 应用Hibernate连接Oracle数据库

本实例是一个典型的、连接数据库的程序

实例位置:光盘\mingrisoft\04\085

实例说明

Oracle数据库以它强大的数据管理功能,成为较完整的Internet数据库之一,受到所有大客户的青睐。在IT行业,也以能否熟练运用Oracle数据库作为软件工程师的衡量标准之一。本例将通过Hibernate连接Oracle数据库,并实现数据插入和数据检索的功能。运行本实例,输入相应的员工信息(见图4.41(A))后,单击“提交”按钮,即可将数据保存到数据表中,在插入成功的页面中,你会看到新插入的记录(见图4.41(B))。

图4.41 新建员工档案

技术要点

连接Oracle数据库时hibernate.cfg.xml的配置方式如下:

        <session-factory>
          <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
          <property name="connection.url">jdbc:oracle:thin:@localhost:1521:MRSOFT</property>
          <property name="connection.username">SYSTEM</property>
          <property name="connection.password"> SYSTEM </property>
          <property name="dialect">org.hibernate.dialect.OracleDialect</property>
          <property name="show_sql">true</property>
          <mapping resource="mrgf/HibernateJoin.hbm.xml"/>
        </session-factory>

Oracle数据库的驱动为oracle.jdbc.driver.OracleDriver,即包classes12.jar(在Oracle安装根目录的jdbc/lib文件夹下),将它复制到Web工程的WEB-INF/lib文件夹下,其中localhost代表连接本机的数据库,1521代表Oracle数据库的端口号,MRSOFT代表数据库的名称。

实现过程

(1)创建Hibernate配置文件,代码可参见本例的“技术要点”。

(2)创建数据表。本例将用到TB_RECORD表,表结构如图4.42所示。

图4.42 数据表结构图

注意:在这里将ID定义为Number类型,持久化类对应的属性仍可以定义为int类型,在映射文件中通过Hibernate提供的int映射类型进行映射。

(3)创建持久化类及映射文件。

(4)编写基于持久化的业务逻辑类。在本例中添加了一个持久化对象的方法,代码如下:

        public void saveObject(HibernateJoin join) {
          try{
              session=sessionFactory.openSession();     //打开Session
              tx=session.beginTransaction();            //开启事务
              session.save(join);                       //持久化对象
              tx.commit();                              //提交事务
              session.close();                          //关闭Session
          }catch(Exception e){
              e.printStackTrace();
          }
        }

注意:saveObject()方法的入口参数不能定义为Object类型,虽然默认情况下所有类都继承Object类,如果定义为Object类型,在调用Session类的save()方法对join对象进行持久化时,Hibernate会抛出异常。

(5)创建index.jsp页面,实例化持久化对象,检索所有数据。代码如下:

            <%
                Hibernate hibernate=new Hibernate();
                HibernateJoin h=new HibernateJoin();
                h.setName(hibernate.toChinese(request.getParameter("name")));
                h.setBirthday(Date.valueOf(request.getParameter("birthday")));
                …  //此处省略了部分为属性赋值的代码
                hibernate.saveObject(h);
                List result=hibernate.query("from HibernateJoin");
            for(int i=0;i<result.size();i++){
                HibernateJoin join=(HibernateJoin)result.get(i);
        %>
            <tr align="center">
                <td><%=join.getName() %></td>
                <td><%=join.getBirthday() %></td>
            </tr>
        <%  }   %>

举一反三

根据本实例,读者可以:

通过Hibernate实现修改和删除Oracle数据库中的记录;

运用Hibernate持久层技术和Oracle数据库开发一个家庭成员留言软件。