获取数据库连接

2.1要素一:Driver接口的实现类

2.1.1Driver接口介绍

  • java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现,也就是说要调用jdbc的jar,必须需要实现driver接口
  • 在程序中不需要直接去访问实现了Driver接口的类,而是由驱动程序管理类(java.sql.DriverManager)去调用这些Driver实现
    1.Oracle的驱动:oracle.jdbc.driver.OracleDriver
    2.mySql的驱动:com.mysql.jdbc.Driver

将jdbc的jar包导入工程

jdbc6

注意:如果是Dynamic Web Project(动态的web项目),则是把驱动jar放到WEB目录下的WEB-INF目录下中lib目录中即可

jdbc7

2.1.2加载与注册JDBC驱动

  • 加载驱动:加载jdbc驱动(jdbc的jar包)需要调用Class类的静态forName(),向其传递要加载的JDBC驱动的类名
    class.forName(“com.mysql.jdbc.Driver”)
  • 注册驱动:DriverManager类是驱动程序类,负责管理驱动程序
    1.使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
    2.通常不用显示调用DriverManager类的registerDriver()方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例

2.2要素二:URL

JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接

JDBC URL的标准由三部分组成,各部分间用冒号分隔

  • jdbc:子协议:子名称
  • 协议:JDBC URL中的协议总是jdbc
  • 子协议:子协议用于标识一个数据库或驱动程序
  • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库,提供足够的信息,包含主机名(对应服务端的ip地址),端口号,数据库名
  • 举例:
    jdbc8

2.3要素三:用户名和密码

  • user,password可以用”属性名=属性值”方式告诉数据库
  • 可以调用DriverManager类的getConnection()方法建立到数据库的连接

2.4数据库连接方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class testConnection1 {

//方式五(final版本),将数据库连接需要的4个基本信息声明在配置文件中,通过读取配置文件的方式,获取连接
@Test
public void getconnection5() throws IOException, ClassNotFoundException, SQLException {
//1.读取和加载class目录下的配置文件(类加载器)
InputStream is =testConnection1.class.getClassLoader().getResourceAsStream("jdbc.properties");//调用系统类加载器读取字节流,读取class目录下的jdbc.properties文件为字节
Properties properties = new Properties();//Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载的数据。属性列表中每个键及其对应值都是一个字符串。
properties.load(is);//加载读取的流文件,此时对象中就拥有数据集

//2.读取配置信息
String user = properties.getProperty("user");//user为键,获取其值,封装在字符串类型对象中
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driverClass = properties.getProperty("driverClass");

//3.加载驱动
Class.forName(driverClass);//f

//4.获取连接
Connection conn = DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
}


其中对第三步的加载驱动的说明,Driver.class在背后做了手脚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//3.加载驱动
Class.forName(driverClass);//获取到接口实现类的此运行时类
//省略了如下的操作
//创建此运行时类的实例
Driver driver = (Driver) clazz.newInstance();
//注册驱动
DriverManager.registerDriver(driver)

/*为什么只需要写前面的一句话就可以加载数据库的驱动
因为在Driver.class(Driver实现类)中写了静态方法,当加载驱动的时候,静态方法随着类的加载而加载自动帮我们创建实例然后注册驱动
*/
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.mysql.cj.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}

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

其中,配置文件声明在工程的src目录下:【jdbc.properties】

1
2
3
4
user=root
password=admin
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.jdbc.Driver//指明驱动类型

说明:使用配置文件的方式保存配置信息,在代码中加载配置文件

使用配置文件的好处

  1. 实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
  2. 如果修改了配置信息,省去重新编译的过程

2.5补充:加载properties文件的两种方式

1
2
3
4
5
6
7
8
9
10
11
//创建Properties对象
Properties properties=new Properties();//Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载的数据。属性列表中每个键及其对应值都是一个字符串。其中的load()方法对起字节流进行加载

//用字节读取流加载
1、获取class目录下的配置文件
InputStream is = classLoader.getResourceAsStream("re.properties");
properties.load(is);


2//直接用文件读取流加载
properties.load(new FileInputStream("src\\re.properties"));