JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法,JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。
通常一个数据库厂商在推出自己的数据库产品的时候都会提供一套访问数据库的API,这些API可以用各种语言的形式提供,客户端应用程序调用这些API来访问数据库。每一个厂商提供的API都不相同,导致了使用某一个特定的数据库的程序不能移植到另一个数据库上。JDBC以Java类库来取代数据库厂商的专有API,客户端只需要调用JDBC API,由JDBC驱动程序(第三方数据库厂商实现Java JDBC标准而定义的特定于某一数据库操作的API)去处理与数据库的通信。
应用:
使用某种数据库持久化数据要导入相应的数据库驱动包。
主要数据库JDBC驱动的类名:
SQL Server:com.microsoft.jdbc.sqlserver.SQLServerDriver
MySQL:com.mysql.jdbc.Driver
Oracle:oracle.jdbc.driver.OracleDriver
1、首先我们一般要加载并注册数据库驱动,有以下三种方式可以做到这一点:
①、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类可以看到
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
它是任何数据库提供商的驱动类必须实现的接口,驱动类必须实现该接口中的所有方法!
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() } }
2、从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(); } } }
3、访问数据库进行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
方法,比如setAutoCommit
或setTransactionIsolation
。在有可用的 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
循环中使用它来迭代结果集。