CRainyDay

JDBC——通过DriverManger获取数据库连接

一.驱动管理类

  之前使用的是原始的方法即 Driver 接口获取数据库连接, 但是我们在开发中一般都用 DriverManger即驱动管理类来实现不同数据库的连接.

1.建立连接

  • 可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接

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

  • JDBC URL的标准由三部分组成, 各部分间用冒号分隔.
    ——jdbc: <子协议>:<子名称>
    ——协议: JDBC URL中的协议总是jdbc
    ——子协议: 子协议用于标识一个数据库驱动程序
    ——子名称: 一种标识数据库的方法. 子名称可以依不同的子协议而变化, 用子名称的目的是为了定位数据库提供足够的信息

JDBC_09

2.加载与注册JDBC驱动

  • 加载 JDBC 驱动需调用 Class 类的静态方法 forName(), 向其传递要加载的 JDBC 驱动的类名.

  • DriverManager 类是驱动程序管理器类, 负责管理驱动程序.

  • 通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例, 因为 Driver 接口的驱动程序类都包含了静态代码块, 在这个静态代码块中, 会调用DriverManager.registerDriver() 方法来注册自身的一个实例.

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
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import org.junit.Test;

public class Test {
@Test
public void TestDriverManger() throws Exception {
//1.准备连接数据库的4个string
String driverClass = null;
String url = null;
String user = null;
String password = null;
//读取类路径下的 jdbc.properties 文件
InputStream in =
getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(in);
driverClass = properties.getProperty("driver");
url = properties.getProperty("jdbc");
user = properties.getProperty("user");
password = properties.getProperty("password");
//2.加载驱动程序(实际上对应的Driver实现类中有注册驱动的静态代码块)
Class.forName(driverClass);
//3.通过 DriverManger的getConnection方法获取数据库的连接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
connection.close();
}
}

使用DriverManger的好处:

  1. 可以通过重载的 getConnection() 方法获取数据库连接, 较为方便
  2. 可以同时管理多个驱动程序: 若注册了多个数据库连接, 根据调用 getConnection() 方法时传入的参数来连接不同的数据库, 并返回不同的数据库连接.
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
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;

public class Test {
@Test
public void TestDriverManger() throws Exception {
String driver1 = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String driver2 = "com.mysql.cj.jdbc.Driver";
String url1 = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SPJDB";
String url2 = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false";
String user1 = "root";
String user2 = "root";
String password1 = "root";
String password2 = "root";

Class.forName(driver1);
Connection conn1 = DriverManager.getConnection(url1, user1, password1);
System.out.println(conn1);

Class.forName(driver2);
Connection conn2 = DriverManager.getConnection(url2, user2, password2);
System.out.println(conn2);
conn1.close();
conn2.close();
}
}

二.访问数据库

  • 数据库连接被用于向数据库服务器发送命令和 SQL 语句,在连接建立后,需要对数据库进行访问,执行 sql 语句

  • 在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:

 –Statement

  –PrepatedStatement

   –CallableStatement

1.Statement

  • 通过调用 Connection 对象的 createStatement() 方法获取该对象

  • 该对象用于执行静态的 SQL 语句, 并且返回执行结果

  • Statement 接口中定义了下列方法用于执行 SQL 语句:

  –ResultSet excuteQuery(String sql): 传入的sql可以是 select

  –int excuteUpdate(String sql): 传入的sql可以是 insert update delete, 不能是 select

更新数据库

数据库的更新操作一般指: Insert Delete Update SQL操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import org.junit.Test;
public class Test {
@Test
public void TestDriverManger() throws Exception {
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=SPJDB";
String user = "root";
String password = "root";
String sql = "Insert into SPJ values(1,1,2,1000);";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
Statement statement = conn.createStatement();
statement.executeUpdate(sql);
statement.close();
conn.close();
}
}

  在这里, 我们想写一个通用的方法, 该方法可以执行 INSERT UPDATE DELETE 语句. 同时, 我们还想将一些常用的 JDBC 操作封装在一起, 方便管理与使用.

JDBCTools类:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

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

/*
* 操作 JDBC 的工具类,封装了一些常用的方法
*/
public class JDBCTools {
/**
* 获取数据库连接:
* 通过读取配置文件,根据配置信息从数据库服务器获取一个连接
* 现在这个方法每执行一次都会获取和释放一次数据库连接,这样不太好,之后会修改
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
InputStream is = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(is);
String url = pro.getProperty("jdbc");
String user = pro.getProperty("user");
String password = pro.getProperty("password");
Class.forName(pro.getProperty("driver"));
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/**
* 关闭 Statement 和 Connection
* @param state
* @param conn
*/
public static void release(Statement state,Connection conn) {
if(state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

TestJDBCTools类:

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

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import org.junit.Test;

public class TestJDBCTools {
@Test
public void test01() {
String sql = "DELETE from SPJ where S_num=1 and P_num=1 and J_num=2;";
update(sql);
}
/**
* 通用的更新方法,包括: Insert Delete Update
* @param sql
*/
public void update(String sql) {
Connection conn = null;
Statement state = null;
try {
conn = JDBCTools.getConnection();
state = conn.createStatement();
state.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCTools.release(state, conn);
}
}
}

查询数据库

我在这里说的查询数据库, 指的是 Select SQL操作

通过 ResultSet 对象来操作查询的结果集

  • 通过调用 Statement 对象的 excuteQuery() 方法创建该对象

  • ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集, ResultSet 接口由数据库厂商实现

  • ResultSet 对象维护了一个指向当前数据行的游标, 初始的时候, 游标在第一行之前, 可以通过 ResultSet 对象的 next() 方法移动到下一行

  • ResultSet 接口的常用方法:

   –boolean next()

   –getXxx() , Xxx 可以是: String Int Time Date …

   ……

JDBC_10

JDBC_11

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
37

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;

public class TestJDBCTools {
@Test
public void test02() {
Connection conn = null;
Statement state = null;
ResultSet rs = null;
String sql = "select * from Student";
try {
conn = JDBCTools.getConnection();
state = conn.createStatement();
rs = state.executeQuery(sql);
while(rs.next()) {
int id = rs.getInt(1);
String name = rs.getString("name");
String eamil = rs.getString(3);
Date date = rs.getDate(4);
System.out.print(id+";");
System.out.print(name+";");
System.out.print(eamil+";");
System.out.println(date);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//在这里, 别忘了去修改一下 JDBCTools 类里的 release() 方法
JDBCTools.release(rs, state, conn);
}
}
}

 评论



本博客所有文章除特别声明外,均采用[(CC BY-NC-SA 4.0)]许可协议。转载请注明出处!

本站使用 Material X 作为主题 , 总访问量为 次 。
Copyright © 2019 CRainyDay's Blog 版权所有