## 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》