阅读目录前言
如今任何应用程序的开发几乎都离不开数据库,
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驱动
API。
JDBC API为
SQL访问提供一套“纯”
Java API,
JDBC驱动
API允许第三方驱动程序可以连接到特定的数据库。
Sun公司还指定一套简单的机制,以使得第三方驱动程序可以向驱动管理器注册。这样,数据库供应商就可以提供自己的驱动程序,并插入到驱动管理器中。 这种接口组织方式遵循了微软公司非常成功的
ODBC模式(
JDBC的命名体现了对
ODBC的致敬),
ODBC为
C语言访问数据库提供了一套编程接口。
JDBC和
ODBC都基于同一个思想:根据
API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际数据库进行通信。 JDBC到数据库的通信路径
JDBC配置
编写一个数据库程序之前,需要收集大量的信息和文件,下面将讨论这些内容。
数据库URL
在连接数据库时,开发者必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名。
JDBC使用了一种与普通URL相类似的语法来描述数据源。数据库
URL语法:协议名 +
IP地址(域名) + 端口号 + 数据库名。下文以常用的两种数据库
Oracle和
MySql举例。例如:MySql:jdbc:mysql://localhost:3306/db_nameOracle:jdbc:oracle:thin:@loaclhost:1521:orcl
驱动程序JAR文件
开发数据库程序时,需要获得包含了所使用的数据库的驱动程序程序的
JAR文件,并导入到项目工程中。Mysql:MySQL Connector/JOracle:Oracle Database 11
g Release 2 JDBC Drivers
注册驱动器类
某些
JDBC的
JAR文件(例如包含在
Java SE中的
Derby驱动程序)将自动注册驱动器类。如果驱动程序
JAR不支持自动注册,那就需要找出数据库提供商使用的
JDBC驱动器类的名字,常用的做法是使用
Class类的静态方法
forName强制加载驱动器类。例如:MySql:Class.forName("com.mysql.jdbc.Driver")Oracle:Class.forName("oracle.jdbc.driver.OracleDriver")
连接到数据库
在
Java程序中,开发者可以在代码中打开一个数据库连接,例如:
| 12345 | 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类的静态方法
getConnectionjdbc.properties配置文件
| 1234 | driver=com.mysql.jdbc.Driverurl=jdbc:mysql:user=rootpassword=root |
DBConnection.java类
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | 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方法。这些对象都使用了规模较大的数据结构,所以我们不应该等待垃圾回收器来处理它们。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-10/123776.htm