1.获取数据库连接
1.1 要素一:Driver接口实现类
1.1.1 Driver接口介绍
- java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
- 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
Oracle的驱动:oracle.jdbc.driver.OracleDriver
mySql的驱动: com.mysql.jdbc.Driver
1.1.2 加载与注册JDBC驱动
加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名 Class.forName(“com.mysql.jdbc.Driver”);
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
1.2 要素二:URL
- JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
- JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:子协议:子名称
(1)协议:JDBC URL中的协议总是jdbc
(2)子协议:子协议用于标识一个数据库驱动程序
(3)子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
举例:
几种常用数据库的 JDBC URL
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/atguigu
jdbc:mysql://localhost:3306/atguigu?useUnicode=true&characterEncoding=utf8(如果JDBC
程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
jdbc:mysql://localhost:3306/atguigu?user=root&password=123456
Oracle 9i的连接URL编写方式:
jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称
jdbc:oracle:thin:@localhost:1521:atguigu
SQLServer的连接URL编写方式:
jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称
jdbc:sqlserver://localhost:1433:DatabaseName=atguigu
1.3 要素三:用户名和密码
- user,password可以用“属性名=属性值”方式告诉数据库 (将数据库连接所需要的基本信息封装到配置文件中)
- 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
数据库连接方式举例(推荐使用方式五,其它作为参考)
package com.lty.connection;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties;
import org.junit.Test;
public class ConnectionTest {
// 方式一
@Test
public void testConnection1() throws Exception {
// 获取Driver的实现类对象
Driver driver = new com.mysql.jdbc.Driver();
// jdbc:mysql: 协议
// localhost: IP地址
// 3306 mysql默认端口号
// test 要进行连接的数据库名称
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
// 将用户名和密码封装在Properties中
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root");
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
// 方式二 :对方式一的迭代 :在如下的程序中不出现第三方的api,使得程序具有更好的可移植性
@Test
public void testConnection2() throws Exception {
// 1.获取Driver的实现类对象,使用反射
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
// 2.提供要连接的数据库
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
// 3.提供连接数据库需要的用户名和密码
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root");
// 4.获取连接
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
// 方式三: 使用DriverManager替换Driver
@Test
public void testConnection3() throws Exception {
// 1.获取Driver的实现类对象
Class clazz = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
// 2.提供另外三个连接的基本信息
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "root";
// 注册驱动
DriverManager.registerDriver(driver);
// 获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
// 方式四:可以只是加载驱动
@Test
public void testConnection4() throws Exception {
// 1.提供三个连接的基本信息
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "root";
// 2.加载Driver
Class.forName("com.mysql.jdbc.Driver"); // static 静态代码块随着类的加载而执行
// Driver driver = (Driver) clazz.newInstance();
// // 注册驱动
// DriverManager.registerDriver(driver);
// 3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
// 方式五: 最终版 将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
/**
* 此种方式的好处? 1.实现了数据与代码的分离。 实现了解耦
* 2.如果需要修改配置文件信息,可以避免程序重新打包
*/
@Test
public void testConnection5() throws Exception {
// 1.读取配置文件中的4个基本信息 配置文件一般建立在src目录下,新建file即可
// 通过当前类加载器 读取配置文件 jdbc.properties 中的基本信息 默认识别路径就是src下
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties"); // 配置文件中的注释是 : #
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
// 2.加载驱动
Class.forName(driverClass);
// 3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
}