JDBC(Java Data Base Connectivity,java数据库链接)

JDBC是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。java

Java数据库链接体系结构是用于Java应用程序链接数据库的标准方法,JDBC对Java程序员而言是API,对实现与数据库链接的服务提供商而言是接口模型。做为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的链接提供了标准方法。mysql

一般一个数据库厂商在推出本身的数据库产品的时候都会提供一套访问数据库的API,这些API能够用各类语言的形式提供,客户端应用程序调用这些API来访问数据库。每个厂商提供的API都不相同,致使了使用某一个特定的数据库的程序不能移植到另外一个数据库上。JDBC以Java类库来取代数据库厂商的专有API,客户端只须要调用JDBC API,由JDBC驱动程序(第三方数据库厂商实现Java JDBC标准而定义的特定于某一数据库操做的API)去处理与数据库的通讯。程序员

应用:spring

使用某种数据库持久化数据要导入相应的数据库驱动包。
主要数据库JDBC驱动的类名:
SQL Server:com.microsoft.jdbc.sqlserver.SQLServerDriver
MySQL:com.mysql.jdbc.Driver
Oracle:oracle.jdbc.driver.OracleDriversql

一、首先咱们通常要加载并注册数据库驱动,有如下三种方式能够作到这一点:
     ①、Class.forName("JDBC驱动类名") //经过反射机制加载注册驱动,经常使用
     ②、System.setProperty("jdbc.driver","JDBC驱动类名");//设置系统属性指定数据库驱动
     ③、DriverManager.registerDriver(new com.mysql.jdbc.Driver());
数据库

     总结:推荐①,和②两种方式。
     缘由:③在编译时须要导入对应的lib。①,②不须要。
     第②种方式的话,能够同时导入多个jdbc驱动,中间用冒号“:”分开
     好比System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");
     这样就一次注册了三个数据库驱动服务器

     在调用Class.forName(“XXXDriver”)时,完成了将具体的驱动程序向JDBC API中驱动管理器DriverManager
     的注册,该 注册方法在类构造完成前完成,通常使用静态语句块,
     经过查看MySQL的驱动实现com.mysql.jdbc.Driver类能够看到oracle

static {
  	try {
		java.sql.DriverManager.registerDriver(new Driver());
	} catch (SQLException E) {
		throw new RuntimeException("Can't register driver!");
	}
}

     在调用DriverManager的getConnection方法时,通常先在已注册的驱动中查找能够了解此URL的驱动,
     而后调用该驱动的connect方法,从而创建链接,返回的链接都是一个实现java.sql.Connection接口的具体类。

     JDBC标准中的Driver接口:
     JDBCDriverInterfaceapp

     它是任何数据库提供商的驱动类必须实现的接口,驱动类必须实现该接口中的全部方法!sqlserver

     MySQL驱动类Driver源码: 

package com.mysql.jdbc;

import java.sql.SQLException;

/**
 * The Java SQL framework allows for multiple database drivers. Each driver
 * should supply a class that implements the Driver interface
 * 
 * <p>
 * The DriverManager will try to load as many drivers as it can find and then
 * for any given connection request, it will ask each driver in turn to try to
 * connect to the target URL.
 * 
 * <p>
 * It is strongly recommended that each Driver class should be small and
 * standalone so that the Driver class can be loaded and queried without
 * bringing in vast quantities of supporting code.
 * 
 * <p>
 * When a Driver class is loaded, it should create an instance of itself and
 * register it with the DriverManager. This means that a user can load and
 * register a driver by doing Class.forName("foo.bah.Driver")
 */
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	// ~ Static fields/initializers
	// ---------------------------------------------

	//
	// Register ourselves with the DriverManager
	//
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
	
	/**
	 * Construct a new driver and register it with DriverManager
	 */
	public Driver() throws SQLException {
		// Required for Class.forName().newInstance()
	}
}

二、从DriverManager中的到一个DBMS链接,DriverManager类是整个JDBC的起点!利用它能够建立链接,
     从而完成后续的操做。调用DriverManager类的getConnection(String url, String user, String pwd)创建到
     数据库的链接,返回一个链接对象。

     常见的url:
     SQL Server :jdbc:microsoft:sqlserver://localhost:1443;databasename=数据库名
     Oracle :jdbc:oracle:thin:@localhost:1521:ORCL(数据库实例名)
     MySQL :jdbc:mysql://localhost:3306:/databasename
     Jdbc-odbc桥 :jdbc:odbc:test(test为odbc数据源名称)

public class DBUtil {
	
	private static String url = "jdbc:mysql://localhost:3306/spring";
	private static String user = "root";
	private static String pwd = "mysql5";
	private static Connection conn = null;
	
	static {
		try {
			//使用Class.forName()加载并注册JDBC驱动程序
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		try {
			//加载 Driver 类并在 DriverManager 类中注册后,它们便可用来与数据库创建链接。
			//当调用 DriverManager.getConnection 方法发出链接请求时,
			//DriverManager 将检查每一个驱动程序,查看它是否能够创建链接。
			conn = DriverManager.getConnection(url, user, pwd);
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		
		return conn;
	}
	
	public static void closeConn() {
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

三、访问数据库进行CRUD操做,对数据库操做的接口类通常都位于java.sql包和javax.sql包下。
     数据库链接被用于向数据库服务器发送命令和SQL语句。

经常使用的数据库操做接口类:

DriverManager:

public class DriverManager extends Object

管理一组 JDBC 驱动程序的基本服务。
在调用 getConnection 方法时,DriverManager 会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。

Connection:

public interface Connection extends Wrapper

与特定数据库的链接(会话)。在链接上下文中执行 SQL 语句并返回结果。
注:在配置 Connection 时,JDBC 应用程序应该使用适当的 Connection 方法,好比 setAutoCommitsetTransactionIsolation。在有可用的 JDBC 方法时,应用程序不能直接调用 SQL 命令更改链接的配置。默认状况下,Connection 对象处于自动提交模式下,这意味着它在执行每一个语句后都会自动提交更改。若是禁用了自动提交模式,那么要提交更改就必须显式调用 commit 方法;不然没法保存数据库更改。

Statement:

public interface Statement extends Wrapper

用于执行静态 SQL 语句并返回它所生成结果的对象。
Statement 对象用来将 SQL 语句发送到数据库。不带参数的 SQL 语句一般使用 Statement 对象执行。若是屡次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。

PreparedStatement:

public interface PreparedStatement extends Statement

表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。而后可使用此对象屡次高效地执行该语句。所以屡次执行的 SQL 语句常常建立为 PreparedStatement 对象,以提升效率。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
resultset rs = pstmt.executequery();

ResultSet:

public interface ResultSet extends Wrapper

表示数据库结果集的数据表,一般经过执行查询数据库的语句生成。
ResultSet 对象具备指向其当前数据行的光标。最初,光标被置于第一行以前next 方法将光标移动到下一行;由于该方法在 ResultSet 对象没有下一行时返回 false,因此能够在 while 循环中使用它来迭代结果集。

相关文章
相关标签/搜索