1、什么是JDBC


使用java代码(程序)发送sql语句的技术

使用jdbc发送sql前提需要知道:数据库的IP地址、端口、数据名、用户名和密码。


JDBC的URL=协议名+子协议名+数据源名。
a 协议名总是“jdbc”。
b 子协议名由JDBC驱动程序的编写者决定。
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。
几种常见的数据库连接


-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是1521

-------------------------------mysql-------------------
驱动:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认3306    

---------------------------SQL Server------------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是1433

--------------------------DB2--------------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是5000
-------------------------------------------------------


2、JDBC连接数据库的三种方式




2.1、第一种实现方式


package com.rk.db.a_jdbc;

import java.sql.Driver;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;


/**
 * jdbc连接数据库
 * 第一种方法:通过创建JDBC实现类的驱动类对象建立数据库连接
 * @author RK
 * 
 */
public class Demo01
{
	public static void main(String[] args) throws SQLException
	{
			// jdbc协议:数据库子协议:主机:端口/连接的数据库   //
			String url = "jdbc:mysql://localhost:3306/testdb";
			String username = "root";
			String password = "root";
			
			//1.创建驱动程序类对象
			Driver driver = new com.mysql.jdbc.Driver();
			
			//设置用户名和密码
			Properties props = new Properties();
			props.setProperty("user", username);
			props.setProperty("password", password);
			
			//2.连接数据库,返回连接对象
			Connection conn = driver.connect(url, props);
			
			System.out.println(conn);
	}
}

2.2、第二种实现方式


package com.rk.db.a_jdbc;

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * jdbc连接数据库
 * 第二种方法:使用驱动管理器类连接数据库(注册了两次,没必要)
 * @author RK
 *
 */
public class Demo02
{
	public static void main(String[] args) throws SQLException
	{
		String url = "jdbc:mysql://localhost:3306/testdb";
		String username = "root";
		String password = "root";
		
		Driver driver = new com.mysql.jdbc.Driver();
		//1.注册驱动程序(可以注册多个驱动程序)
		DriverManager.registerDriver(driver);
		
		//2.连接到具体的数据库
		Connection conn = DriverManager.getConnection(url, username, password);
		System.out.println(conn);
	}
}

2.3、第三种实现方式


package com.rk.db.a_jdbc;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
/**
  * jdbc连接数据库
 * 第三种方法:使用加载驱动程序类  来 注册驱动程序(推荐使用这种方式连接数据库)
 * @author RK
 *
 */
public class Demo03
{
	public static void main(String[] args) throws ClassNotFoundException, SQLException
	{
		String url = "jdbc:mysql://localhost:3306/testdb";
		String user = "root";
		String password = "root";
		
		//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
		Class.forName("com.mysql.jdbc.Driver");
		
		//连接到具体的数据库
		Connection conn = DriverManager.getConnection(url,user,password);
		System.out.println(conn);
	}

}

3、com.mysql.jdbc.Driver的内部实现



在这里主要解释一个问题,也就是在2.3中,并没有写代码用DriverManager对com.mysql.jdbc.Driver的实例进行注册,原因就在于com.mysql.jdbc.Driver的源码当中。

在com.mysql.jdbc.Driver类中提供了一个static(静态)代码段,如下:

java.sql.DriverManager.registerDriver(new Driver());

完整代码如下:


------com.mysql.jdbc.Driver类中提供了static代码段,主动向DriverManager进行注册
java.sql.DriverManager.registerDriver(new Driver());

package com.mysql.jdbc;

import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // 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()
    }
}