您的位置:首页 > 数据库 > Oracle

Java操作Oracle

2015-11-22 15:09 639 查看

Java操作Oracle

PS:之前写的关于Java操作SQLserver数据库的博客和数据库基础的博客/article/3623957.html

/article/3623956.html



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》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: