JDBC(一)获取数据库连接

时间:2020-12-06 11:49:29

1.JDBC简介

jdbc是sun公司为了简化,统一java操作不同的数据库而定义的一套标准java类库,jdbc独立于任何数据库管理系统,使用统一的方式开来访问数据库,屏蔽了很多细节,使用方便。

JAVA程序只需要使用jdbc来访问数据库,而不需要关心不同数据库的差异,这里jdbc其实是定义了一组接口,这组接口包含两个层次,一是面向应用到API,而是面向数据库的API,面向应用的API由java程序中使用,而面向数据库的API又具体数据库厂商实现(即JDBC驱动)。这里使用的时候主要是体会到了面向接口编程,我们面向JDBC这一组接口编程,而这些具体的实现是在各个数据库厂商的驱动中。

2.JDBC访问数据库

2.1 Driver接口

java.sql.Driver接口是所有JDBC驱动的都需要实现的,这个接口由各个厂商具体实现,我不关心。

在程序中可是使用实现了Driver接口的类,但是一种更为好的方式是使用驱动管理类(java.sql.DriverManager),让驱动管理区调用这些具实现类。

2.2 加载与注册JDBC驱动

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

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

2.3 建立连接

直接调用DriverManager的getConnection方法的到应用程序和数据的连接

这里会用到具体的三个字符串:

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

  • username:连接数据库的用户名。

  • password:连接数据库的密码。

使用Driver的具体实现类来连接数据库:

public void testDriver() throws Exception {

// 1.创建一个Driver实现类的对象
Driver driver = new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/testjdbc";
Properties properties = new Properties();
properties.put("user", "root");
properties.put("password", "root");
// 2.调用driver接口的connect方法
Connection connection = driver.connect(url, properties);
System.out.println(connection);
}

使用Driver的具体实现类来连接数据库,这里配置信息为了更加灵活,可以使用配置文件:

public void testDriverManager() throws Exception {
String driverClass = null;// driver实现驱动的全类名
String url = null;// 数据库服务器地址
String user = null;// 数据库用户名
String password = null;// 数据库密码

// 获取类路径下的jdbc.properties配置文件
InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro = new Properties();
pro.load(in);
driverClass = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");

// 加载驱动(注册驱动) 可以加载多个驱动,同时连接不同的数据库
/**
* DriverManager.registerDriver((Driver)
* Class.forName(driverClass).newInstance());
*
* 无须使用这种方法,因为Calss.forName(driverClass时候,具体的实现类有一个静态代码块执行的就是注册驱动在加载的时候
*/


Class.forName(driverClass);
// 连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}

这里可以写一个通用的方法来执行连接数据和释放资源,新建一个类JDBCTools,包含两个静态方法:getConnection和release,这样就能直接获取数据库连接和释放资源,而不用每次都去写,只需要JDBCTools.getConnection(),JDCBTools.release();

JDBCTools:

public class JDBCTools {

/**
* 关闭 Statement 和 Connection
*
* @param statement
* @param connection
*/


public static void release(Statement statement, Connection connection) {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

/**
*
* 获取连接的方法. 通过读取配置文件从数据库服务器获取一个连接.
*
* @return
* @throws Exception
*/


public static Connection getConnection() throws Exception {
// 1. 准备连接数据库的 4 个字符串.
String driverClass = null;
String url = null;
String user = null;
String password = null;

// 1). 创建 Properties 对象
Properties properties = new Properties();

// 2). 获取 jdbc.properties 对应的输入流
InputStream in = JDBCTools.class.getClassLoader().getResourceAsStream("jdbc.properties");

// 3). 加载 2) 对应的输入流
properties.load(in);

// 4). 具体决定 user, password 等4 个字符串.
driverClass = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");

// 2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)
Class.forName(driverClass);

// 3. 通过 DriverManager 的 getConnection() 方法获取数据库连接.
return DriverManager.getConnection(url, user, password);
}
}