欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java连接Oracle数据库及封装JDBC

程序员文章站 2024-01-26 15:26:10
...

Java连接Oracle数据库及封装JDBC

如果你点开看到了这篇文章,说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法。但是实际在开发程序的时候,我们是不可能手动地去操作sql语句的,而是由程序去调用。这个时候,就需要使用上编程语言了。本文主要介绍的是Java连接数据库的技术 —— JDBC。

一、JDBC???

JDBC的全称是Java Data Base Connectivity, Java与各大数据库相连接都是使用这门技术。各种数据库的API各不相同,Java是如何实现统一的呢?这是因为sun公司制定了一套标准,各大数据库厂商依据这个标准开发出数据库驱动程序。我们只需要使用这些驱动即可操作数据库。

在oracle安装目录之下可以找到这些驱动程序
Java连接Oracle数据库及封装JDBC
那么多个驱动程序,该选择哪个?

Oracle版本 jdk版本 推荐jar包 备注
Oracle 8i JDK 1.1.x classes111.zip
Oracle 8i JDK 1.1.x classes12.zip
Oracle 9i JDK 1.1.x classes111.jar或者 classes111.zip
Oracle 9i JDK 1.2 and JDK 1.3 classes12.jar 或者 classes12.zip
Oracle 9i JDK 1.4 ojdbc14.jar
Oracle 9i JDK 1.5 ojdbc5.jar
Oracle 9i JDK 1.6 ojdbc6.jar
Oracle 10g JDK 1.2 and JDK 1.3. classes12.jar
Oracle 10g JDK 1.4 and 5.0 ojdbc14.jar
Oracle 11g jdk5 ojdbc5.jar
Oracle 11g jdk6 ojdbc6.jar

按照oracle版本和jdk版本选择,这里的表格仅作参考。

二、连接!!!

说的太多也没用,直接上一段程序体验一下。只需要准备一个IDE(eclipse、IDEA等)和上面所说的驱动程序即可。

创建项目

首先,创建一个普通的Java项目,引入jar包。(我这里是放在了jbdc_oracle目录下)最后把鼠标移到ojdbc.jar,右键,bulild path,add to build path

Java连接Oracle数据库及封装JDBC

IDEA创建的项目同理(Add to libary),会使用Maven的也可以创建Maven项目,在pom文件引入依赖即可。

编写代码

import java.sql.*;

public class Main {

    public static void main(String[] args) {
        try {
            // 1.加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 2.获取连接
            Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
            System.out.println(connection.getMetaData());
            // 3.创建Statement对象(可以执行sql的对象)
            PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
            // 4.获取结果集
            ResultSet resultSet = preparedStatement.executeQuery();
            // 5.对数据进行处理
            while(resultSet.next()) {
                Integer id = resultSet.getInt("DEPTNO");
                String dname = resultSet.getString("DNAME");
                String location = resultSet.getString("LOC");
                System.out.println(id+" "+dname+" "+location);
            }
            // 6.关闭连接 先调用的最后关闭 关闭前判断是否存在
           if(resultSet != null) {
                resultSet.close();
            }
            if(preparedStatement != null) {
                preparedStatement.close();
            }
            if(connection != null) {
                connection.close();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

接下来对以上代码进行一一说明

  • 加载驱动,这里是固定写法,包名不要写错

     Class.forName("oracle.jdbc.driver.OracleDriver");
    

    其实写法不止这一种,只是比较推荐这种。感兴趣的可以看看官方的写法:

    官方JDBC的连接

  • 获取连接

     Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
    

    getConnection()里面的三个参数分别是url地址,用户名和密码

    jdbc:oracle:thin:固定写法,其中thin表示连接数据库的一种方式,想进一步了解的话,文末有参考地址

    127.0.0.1:ip地址,这里表示本机

    1521:oracle的端口地址,一般安装后默认为1521

    orcl:数据库的实例名称,一般安装后默认有一个orcl

Java连接Oracle数据库及封装JDBC

JDBC常见的对象

注:以下方法都省略了函数的参数

Connection

意如其名,就是表示数据库和Java之间的一个连接,所有的数据库操作都与其密切相关。

prepareStatement();//PreparedStatement对象
createStatement();//Statement对象
commit();        //提交
rollback();      //回滚
prepareCall();   //存储过程

Statement

executeQuery(); //查询,返回ResultSet
executeUpdate(); //增加、删除、更新,返回受影响的行数
/* @return  <code>true</code> if the first result is a <code>ResultSet</code>
 *         object; <code>false</code> if it is an update count or there are
 *         no results
 */ 
execute();//增删改查都可以进行,不建议使用

PreparedStatement

PreparedStatement是Statement的子类,PreparedStatement对象可以对sql语句进行预编译,并且可以通过占位符的方式方便我们进行参数的拼接:

PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int对应deptno的类型,1代表第1个问号,

ResultSet

查询后获得的结果集

getXXX(数据库的列名/第几列)  //其中XXX可以是Int,Array,Boolean等
 /*
 第几列对应的是sql中的第几列,
 如select deptno,loc,dname from dept;
 写法:getInt(1) / getInt("deptno")
 select loc,dname,deptno from dept;
 写法:getInt(3) / getInt("deptno");

这几个对象多调用几次就知道如何使用了,总的使用流程是

连接数据库(获取Connection对象) -> 创建Statement对象(Statement/PreparedStatement) -> 用Statement对象执行语句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影响行数,executeQuery返回ResultSet)判断执行的结果 -> 关闭对象

多多使用就对了!

三、封装

仅供参考,建议先熟悉以上操作后再根据实际情况使用。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	
	private final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private final static String URL = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
	private final static String USERNAME = "scott";
	private final static String PWD = "tiger";
	
	public static Connection connection = null;
    static Statement stmt = null;
	public static PreparedStatement pstmt = null;
	private static ResultSet rs;
	
    static {
    	try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }
    
  //单例模式返回数据库连接对象
  	public static Connection getConnection() throws Exception
  	{
  		if(connection==null)
  		{
  			connection = DriverManager.getConnection(URL, USERNAME,PWD);
  			return connection;
  		}
  		return connection;
  	}
  	
  	public static Statement getStatement() throws Exception {
  		Connection conn = getConnection();
  		try {
  			if(conn!=null) {
  				stmt = conn.createStatement();
  			}
  		}catch(Exception e) {
  			e.printStackTrace();
  		}
  		return stmt;
  	}
	
	//查询总数
	public static int getTotalCount(String sql) { //select count(1) from student
		int count = -1 ;
		try {
			 pstmt = createPreParedStatement(sql, null );
			 rs = pstmt.executeQuery()  ;//88
			if(rs.next()) {
				count = rs.getInt(1) ;
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			closeAll(rs, pstmt, connection);
		}
		return count;
	}
	
	//通用的增删改
	public static boolean executeUpdate(String sql,Object[] params) {//{"zs",1}
		try {  
			  pstmt = createPreParedStatement(sql,params);
			  int count = pstmt.executeUpdate() ;
			  if(count>0)
				  return true ;
			  else 
				  return false ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			  return false ;
		} catch (SQLException e) {
			e.printStackTrace();
			  return false ;
		}catch (Exception e) {
			e.printStackTrace();
			return false ;
		}
		finally {
			closeAll(null,pstmt,connection);
		}
	}
	
	//Statement
	public static void closeAll(ResultSet rs,Statement stmt,Connection connection)
	{
		try {
			if(rs!=null)rs.close();
			if(pstmt!=null)pstmt.close();
			if(connection!=null)connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
		
	public static PreparedStatement createPreParedStatement(String sql,Object[] params) throws Exception {
		  pstmt = getConnection() .prepareStatement(sql) ;
		  if(params!=null ) {
			  for(int i=0;i<params.length;i++) {
				  pstmt.setObject(i+1, params[i]);
			  }
		  }
		  return pstmt;
	}
	
	//通用的查:通用表示适合于 任何查询
	public static ResultSet executeQuery(String sql,Object[] params) {
		try {
			pstmt = createPreParedStatement(sql,params);
			rs =  pstmt.executeQuery() ;
			return rs ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null ; 
		} catch (SQLException e) {
			e.printStackTrace();
			return null ; 
		}catch (Exception e) {
			e.printStackTrace();
			return null ; 
		}
	}
}

使用示例

public class Main {
	public static void main(String[] args) throws SQLException {
		// 查询示例1
		ResultSet rs1 = DBUtil.executeQuery("select * from dept where deptno = ?", new Object[] {10});
		if(rs1.next()) {
			System.out.println(rs1.getInt(1)+" "+rs1.getString(2)+" "+rs1.getString(3));
		}
		// 更新示例1
		boolean rs2 = DBUtil.executeUpdate("update dept set loc = ? where deptno = ?", new Object[] {"Japan",10});
		if(rs2) {
			System.out.println("更新成功!");
		}
	}
}

参考资料:

oracle jdbc选择

JDBC连接数据库三种url方式

相关标签: Java