Java数据库编程之JDBC配置

阅读目录

  • 前言
  • JDBC设计
  • JDBC配置
  • 小结

前言

  如今任何应用程序的开发几乎都离不开数据库,JDBC是为Java提供的一个平台无关的数据库标准API,它提供了一个通用的SQL(Structured Query Language)数据库存储机制,该机制为多数关系型DBMS提供统一接口。现在业界有很多优秀的ORM(Object Relational Mapping)框架,例如全自动化的Hibernate和半自动化的MyBatis。这些框架是对JDBC的进一步封装,在企业级应用开发中提高开发效率。

  本系列文章主要讲述Java数据库编程基础JDBC的相关知识,本文为系列开篇---Java数据库编程之JDBC配置。

JDBC设计

  业界存在许多不同的数据库,且它们所使用的协议也各不相同。为了使Java能够与任何数据库进行通信,Sun公司(已被Oracle收购)指定了两套接口。应用程序开发者使用JDBC API,而数据库供应商和工具开发商则使用JDBC驱动APIJDBC APISQL访问提供一套“纯”Java APIJDBC驱动API允许第三方驱动程序可以连接到特定的数据库。Sun公司还指定一套简单的机制,以使得第三方驱动程序可以向驱动管理器注册。这样,数据库供应商就可以提供自己的驱动程序,并插入到驱动管理器中。

  这种接口组织方式遵循了微软公司非常成功的ODBC模式(JDBC的命名体现了对ODBC的致敬),ODBCC语言访问数据库提供了一套编程接口。JDBCODBC都基于同一个思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际数据库进行通信。

             Java数据库编程之JDBC配置

                   JDBC到数据库的通信路径

JDBC配置

编写一个数据库程序之前,需要收集大量的信息和文件,下面将讨论这些内容。

数据库URL

在连接数据库时,开发者必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名。JDBC使用了一种与普通URL相类似的语法来描述数据源。数据库URL语法:协议名 + IP地址(域名) + 端口号 + 数据库名。下文以常用的两种数据库OracleMySql举例。例如:

MySql:jdbc:mysql://localhost:3306/db_name

Oracle:jdbc:oracle:thin:@loaclhost:1521:orcl

驱动程序JAR文件

开发数据库程序时,需要获得包含了所使用的数据库的驱动程序程序的JAR文件,并导入到项目工程中。

Mysql:MySQL Connector/J

Oracle:Oracle Database 11g Release 2 JDBC Drivers

注册驱动器类

某些JDBCJAR文件(例如包含在Java SE中的Derby驱动程序)将自动注册驱动器类。如果驱动程序JAR不支持自动注册,那就需要找出数据库提供商使用的JDBC驱动器类的名字,常用的做法是使用Class类的静态方法forName强制加载驱动器类。例如:

MySql:Class.forName("com.mysql.jdbc.Driver")

Oracle:Class.forName("oracle.jdbc.driver.OracleDriver")

连接到数据库

Java程序中,开发者可以在代码中打开一个数据库连接,例如:

1
2
3
4
5
String url = "jdbc:mysql//localhost:3306/db_name";
String user = "root";
String password = "root";
 
Connection conn = DriverManager.getConnection(url, user, password);

驱动管理器遍历所有注册过的驱动程序,以便找到一个能够使用数据库URL中指定的子协议的驱动程序。getConnection方法返回一个Connection对象,开发者使用Connection对象来执行SQL语句。

小结

开发者一般将JDBC配置写到配置文件中,便于管理修改,当然也可以写在Java类里。下面的程序清单(以Mysql为例)从名为jdbc.properties的文件中加载连接参数,并连接到数据库。要想获得数据库连接,只需要调用DBConnection类的静态方法getConnection

jdbc.properties配置文件

1
2
3
4
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=root

 DBConnection.java

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
 
public class DBConnection {
 
    private static String config = "src/jdbc.properties";
    private static String driver;
    private static String url;
    private static String user;
    private static String password;
 
    /**
     * 静态代码块 注册驱动器类
     */
    static {
        Properties props = new Properties();
        try {
            FileInputStream fis = new FileInputStream(config);
            props.load(fis);
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            Class.forName(driver);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
 
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
 
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if(rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if(conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
 
    }
     
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);
    }
     
}

当使用完ResultSet、Statement或Connection对象时,应立即调用close方法。这些对象都使用了规模较大的数据结构,所以我们不应该等待垃圾回收器来处理它们。

相关推荐