黑马程序员-JDBC(第一讲)

JDBC:(java Data Base Connectivityjava数据库连接,由一些接口和类构成的API

J2SE的一部分,由java.sqljavax.sql包组成。


连接数据库的步骤:

1、注册驱动(只做一次)

2、建立连接(Connection

3、创建执行SQL的语句(Statement

4、执行语句

5、处理执行的结果(ResultSet

6、释放资源

 

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

import oracle.jdbc.driver.OracleDriver;

public class ConnectionOracle {

	/**
	 * @param args
	 */

	private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String user = "scott";
	private static final String pass = "tiger";

	public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub
		// 加载数据库驱动

		DriverManager.registerDriver(new OracleDriver());
		// 建立连接
		Connection conn = DriverManager.getConnection(url, user, pass);
		// 创建语句
		Statement sm = conn.createStatement();
		// 执行语句
		ResultSet rs = sm.executeQuery("select * from student");

		// 输出结果

		while (rs.next()) {

			System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t"
					+ rs.getObject(3));
		}

		// 释放资源
		rs.close();
		sm.close();
		conn.close();

	}

}

注意:

上面的代码并没有问题,但是运行会报错,我们修改一个配置文件即可:

listener.ora



//注意驱动可以注册多个

注册驱动的另一种方式:
System.setProperty(“jdbc.drivers”,”OracleDriver”);多个驱动之间用冒号隔开,列如要注册两个驱动,驱动a,驱动b,那么要这么写(“jdbc.drivers,”a:b”);

还有一种方式:

Class.forName(“OracleDriver”);//推荐使用这种方式。想想这种方式为什么也会加载驱动,其实原因很简单,在OracleDriver这个类里面,有个静态代码块,静态代码块中有注册驱动的代码,我们知道静态代码块的运行时机是最早的。所以他也可以注册驱动。

这就引入了另一个问题,在上面代码中写的利用DriverManager来注册驱动其实是注册了两次,注册了两个一模一样的驱动,而且这种方式不利于利用配置文件进行配置,以使程序动态加载何种驱动,所以推荐使用Class.forName()这种方式。

 

 

上面的代码只是个简单的演示,实际开发中这样写并不合理,我们要避免异常发生时,Connection不能关闭的问题。

修改代码:

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

import oracle.jdbc.driver.OracleDriver;

public class ConnectionOracle {

	/**
	 * @param args
	 */

	private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String user = "scott";
	private static final String pass = "tiger";

	public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub
		Connection conn = null;
		Statement sm = null;
		ResultSet rs = null;
		try {

			// 加载数据库驱动

			DriverManager.registerDriver(new OracleDriver());
			// 建立连接
			conn = DriverManager.getConnection(url, user, pass);
			// 创建语句
			sm = conn.createStatement();
			// 执行语句
			rs = sm.executeQuery("select * from student");

			// 输出结果

			while (rs.next()) {

				System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)
						+ "\t" + rs.getObject(3));
			}
		} finally {
			// 释放资源
			try {
				if (rs != null) {
					rs.close();
				}
			} finally {
				try {
					if (sm != null) {
						sm.close();
					}
				} finally {
					conn.close();
				}
			}
		}

	}

}

我们继续对上面的代码进行优化:

首先上面的代码只是对数据进行查询,我们可能要对数据进行增删改查,所以对上面的代码进行抽取,将注册数据库驱动、建立连接、释放连接都抽取到工具类JDBCUtils类中。

JDBCUtils


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

public final class JDBCUtils {
	private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String user = "scott";
	private static final String pass = "tiger";
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private JDBCUtils() {
	}

	public static Connection getConnection() throws SQLException {

		return DriverManager.getConnection(url, user, pass);

	}

	public static void free(ResultSet rs, Statement sm, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {

		} finally {
			try {
				if (sm != null) {
					sm.close();
				}
			} catch (SQLException e) {

			} finally {
				try {
					if (conn != null) {
						conn.close();
					}
				} catch (SQLException e) {

				}
			}
		}
	}

}

ConnectionOracle

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

public class ConnectionOracle {

	/**
	 * @param args
	 */

	public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub
		selectStatement();

	}

	static void selectStatement() throws SQLException {
		Connection conn = null;
		Statement sm = null;
		ResultSet rs = null;
		try {

			conn = JDBCUtils.getConnection();
			// 创建语句
			sm = conn.createStatement();
			// 执行语句
			rs = sm.executeQuery("select * from student");

			// 输出结果

			while (rs.next()) {

				System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)
						+ "\t" + rs.getObject(3));

			}
		} finally {
			JDBCUtils.free(rs, sm, conn);
		}
	}
}



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值