ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## Java操作Oracle PS:之前写的关于Java操作SQLserver数据库的博客和数据库基础的博客[http://blog.csdn.net/q547550831/article/details/49930537](http://blog.csdn.net/q547550831/article/details/49930537) [http://blog.csdn.net/q547550831/article/details/49925137](http://blog.csdn.net/q547550831/article/details/49925137) ![](https://box.kancloud.cn/2016-02-25_56ceb3e436c1e.jpg) ### JDBC-ODBC桥连(此方式连接无需打开监听服务) ~~~ // 关键代码,这里是和操作SQLServer不同的 // 加载驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 获得连接 Connection ct=DriverManager.getConnection("jdbc:odbc:myoracledb","scott","123456"); ~~~ JDBC-ODBC说明: sun.jdbc.odbc.JdbcOdbcDriver此驱动由原sun公司提供 "jdbc:odbc:myoracledb","scott","123456" Jdbc:odbc:数据源名称,"用户名","密码" PS:关于数据源的配置,可以百度。 ~~~ /** * jdbc_odbc桥连接Oracle */ package com.oracle.db; import java.sql.*; public class db1 { Connection ct = null; PreparedStatement ps = null; ResultSet rs = null; public db1() { try { // 1.加载驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 2.得到连接 ct = DriverManager.getConnection("jdbc:odbc:myoracledb", "scott", "123456"); // 3.创建PreparedStatement ps = ct.prepareStatement("select * from emp"); // 4.执行SQL rs = ps.executeQuery(); // 5.对获取的数据进行操作 while (rs.next()) { System.out.println("员工名:" + rs.getString("ename")); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (ct != null) { ct.close(); } } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { db1 d1 = new db1(); } } ~~~ ### JDBC直连(此方式连接需要打开服务中的监听服务) ~~~ // 关键代码,这里是和操作SQLServer不同的 // 加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 获得连接 ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:Switch","scott","123456"); ~~~ JDBC说明: oracle.jdbc.driver.OracleDriver此驱动由oracle提供。 "jdbc:oracle:thin:@127.0.0.1:1521:Switch","scott","123456" Jdbc:oracle:thin:@ip地址:端口号默认1521:实例名,"用户名","密码" ~~~ /** * 使用jdbc直连Oracle */ package com.oracle.db; import java.sql.*; public class db2 { Connection ct = null; PreparedStatement ps = null; ResultSet rs = null; public db2() { try { // 1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2.得到连接 ct = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:Switch", "scott", "123456"); // 3.创建PreparedStatement ps = ct.prepareStatement("select * from emp"); // 4.执行SQL rs = ps.executeQuery(); // 5.对获取的数据进行操作 while (rs.next()) { System.out.println("员工名:" + rs.getString("ename")); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (ct != null) { ct.close(); } } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { db2 d1 = new db2(); } } ~~~ ### 什么时候使用jdbc,jdbc-odbc? 原则: 如果java程序和数据库不在同一台机器上,我们一般使用jdbc,如果java程序和数据库在同一台机器上,则两个都可以使用。 数据库服务器使用的系统不同使用的连接方式也不同,如果是linux或unix服务器,则使用jdbc。如果是windows server服务器则使两个都可以使用。   ### 扩展: 对CRUD操作的代码重构,如果直接将CRUD写入业务逻辑代码中会造成业务逻辑不清晰,甚至是混乱。在稍大型一点的软件开发中,都会选择将CRUD封装到一个类中,这样逻辑层和控制层就分离开了。这里以SQLHelpter类为例。 ~~~ package com.oracle.test; import java.io.FileInputStream; import java.sql.*; import java.util.Properties; public class SQLHelper { //定义三个变量 private static Connection ct=null; private static PreparedStatement ps=null; private static ResultSet rs=null; //连接数据库的用户名,密码,url,驱动 //说明:在实际开发中,我们往往把这些变量写到一个外部文件中 //当程序启动时,我们读入这些配置信息。java.util.Properites private static String username; private static String password; private static String driver; private static String url; //使用静态块加载驱动(驱动只需要加载一次) static{ //使用Properties类,来读取配置文件 Properties pp=new Properties(); FileInputStream fis=null; try { fis=new FileInputStream("dbinfo.properties"); //让pp与dbinfo.properties文件关联起来 pp.load(fis); //获取dbinfo.properties文件内信息 username=(String) pp.getProperty("username"); password=(String) pp.getProperty("password"); driver=(String) pp.getProperty("driver"); url=(String) pp.getProperty("url"); //获得驱动 Class.forName(driver); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fis!=null){ fis.close(); } } catch (Exception e) { e.printStackTrace(); } fis=null; } } //统一的curd操作 public static void executeUpdate(String sql,String[] parameters){ try { ct=DriverManager.getConnection(url,username,password); ps=ct.prepareStatement(sql); if(parameters!=null){ for(int i=0;i<parameters.length;i++){ ps.setString(i+1, parameters[i]); } } //执行 ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); }finally{ close(rs,ps,ct); } } //写一个方法,完成查询任务 //sql表示要执行的sql语句 //sql select * from emp where ename=? public static ResultSet executeQuery(String sql,String[] parameters){ try { //根据实际情况我们对sql语句?赋值 //得到连接 ct=DriverManager.getConnection(url,username,password); //创建ps对象,得到sql语句对象 ps=ct.prepareStatement(sql); //如果parameters不为null,才赋值 if(parameters!=null){ for(int i=0;i<parameters.length;i++){ ps.setString(i+1, parameters[i]); } } rs=ps.executeQuery(); } catch (SQLException e) { e.printStackTrace(); //抛出运行异常 throw new RuntimeException(e.getMessage()); } finally{ //close(rs,ps,ct); } return rs; } //把关闭资源写成函数 public static void close(ResultSet rs,Statement ps,Connection ct){ //关闭资源 if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs=null; } if(ps!=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } ps=null; } if(ct!=null){ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } ct=null; } } public static Connection getCt() { return ct; } public static PreparedStatement getPs() { return ps; } } ~~~ [dbinfo.properties]文件,数据库连接相关信息 username=scott password=123456 driver=oracle.jdbc.driver.OracleDriver url=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:Switch PS:像以上这么将CRUD分离就会方便很多,用起来直接调用就行了。这里的数据库连接信息做成了一个文件,从文件中读取连接信息,这样方便调用也方便修改。连接信息是通过Properties类和输入文件流来进行读取的。 ### 实例:实现分页功能的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 'index.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> <br> <table> <tr><td>用户名</td><td>薪水</td></tr> <% try { // 1.加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); // 2.得到连接 Connection ct = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:Switch", "scott", "123456"); // 3.创建PreparedStatement //接收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 = 5; //每页显示几条 //通过查询总记录计算出总页数 PreparedStatement ps = ct.prepareStatement("select count(*) from emp"); ResultSet rs = ps.executeQuery(); if(rs.next()){ rowCount = rs.getInt(1); if(rowCount % pageSize == 0){ pageCount = rowCount / pageSize; } else { pageCount = rowCount / pageSize + 1; } } //分页查询-可以参考我的博客Oracle表管理 ps = ct.prepareStatement("select * from (select e1.*,rownum rn from (select * from emp) e1 where rownum <= " + (pageNow*pageSize) +") where rn >=" + ((pageNow-1)*pageSize+1) +""); // 4.执行SQL rs = ps.executeQuery(); // 5.对获取的数据进行操作 while (rs.next()) { out.println("<tr>"); out.println("<td>" + rs.getString("ename") + "</td>"); out.println("<td>" + rs.getString("sal") + "</td>"); out.println("</tr>"); } out.println(“</table>”); //打印总页数 for(int i = 1; i <= pageCount; i++){ out.print("<a href=index.jsp?pageNow="+i+ "> [" + i + "] </a>"); } rs.close(); ps.close(); ct.close(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } %> </body> </html> ~~~ ----------参考《韩顺平玩转Oracle》