首页 > 编程笔记 > MySQL笔记 阅读:2

Java连接MySQL数据库(附带实例)

对于 MySQL 数据库,只要安装 MySQL 驱动,JDBC 就可以不关心具体的连接过程,来对 MySQL 数据库进行操作;如果是 SQL Server,只需要安装 SQL Server 驱动,JDBC 就可以不关心具体的连接过程,来对 SQL Server 进行操作。

因此,要连接到不同厂商的数据库,应该首先安装相应厂商的数据库驱动。

加载JDBC数据库驱动

由于 Java 是一种纯面向对象的语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC 同样把数据库抽象成面向对象的结构。JDBC 将整个数据库驱动器在底层抽象成一个对象(即驱动器对象),所有对数据库的操作都可以通过该对象进行,只不过数据库驱动对象和普通的 Java 对象有所不同。

首先要了解,大多数普通的 Java 对象在运行该 Java 程序前并不存在,而是在运行时临时创建的,程序退出后这些对象也随之释放。但数据库不一样,数据库往往是不依赖程序运行的,通常是 24h 持续运行的,只不过应用程序可以访问它而已,因此数据库对象不能像普通对象那样从无到有地“创建”,也就是说它在应用程序运行之前就已经存在并且正常运行。

那么数据库实例如何在 Java 程序中访问呢?

加载数据库驱动其实就是将操作系统中正在运行的数据库进程(实例)转化成 Java 对象供 Java 程序使用(操作数据库)。在 Java 中,任何类(Object、String 等)想要正常运行,底层都要有相应的驱动器驱动它,但是我们平时看不出来这些类对象需要什么驱动器驱动,这是因为这些基础类的驱动器就是 JVM 本身,其驱动的加载是在底层伴随着 JVM 的启动进行的,都对用户隐藏,所以看不到。而那些不依赖虚拟机驱动的程序(比如非常典型的数据库程序、大多数图形程序)想在 Java 中被访问,就必须由用户自己编写加载驱动器的代码。

手动加载类的驱动器是使用 Class 类的 forName 静态方法,语法如下:
static Class<?>Class.forName(String className);
className 就是那个不依赖 JVM 驱动的外部进程的 Java 类名,这个类名必须符合 Java 命名规则,例如 it.com.cn.Student。

然而并不是任何外部进程都可以被 Java 访问,想要被 Java 访问,必须让那个程序自己准备好被 Java 调用的接口,并事先命名好 Java 类名才行,而程序准备好的 Java 接口就是该程序的 Java 驱动器(让 JVM 控制程序运行的东西就是 Java 驱动器)。因此数据库厂商必须自行写好数据库的 Java 驱动器(也称作数据库 Connector,即连接器,用于和 Java 程序连接),并准备好类名,好让 Class.forName 加载它。

那么 forName 的加载过程是如何的呢?

首先任意一个提供 Java 接口的程序都会拥有一个 Java 类名(加载到 JVM 中就是用该类名来访问该程序实例的),这样的程序运行后,这个 Java 类名就会被记录到该程序的进程信息中,而该程序的 Java 接口(驱动器)的句柄也会被记录到进程信息中。forName 传入该类名以后就会到操作系统的进程表中查找具有该 Java 类名的进程,找到对应的进程后就会找到该进程对应的 Java 驱动,然后将该驱动加载进 JVM。最后就可以在 Java 程序中通过这个类名(或者对象)来调用该进程,或者访问进程中的数据。

使用厂商驱动,有下列两个步骤:
1) 到相应的数据库厂商网站上下载厂商驱动,或者从数据库安装目录下找到相应的厂商驱动包,复制到 Web 项目的 WEB-INF/lib 下。

以 MySQL 为例,可以将“MySQL-connector java-x.x.x(版本号)-bin.jar”复制到 Web 项目的 WEB-INF/lib 下。右键单击 MySQL 的驱动 jar 包,将其加入项目。

2) 在 JDBC 代码中,设定特定的驱动程序名称和 URL。不同的驱动程序和不同的数据库可以采用不同的驱动程序名称和 URL。

连接MySQL数据库

JDBC 通过将特定数据库厂商的数据库操作的细节抽象,得到一组类和接口,这些类和接口包含在 java.sql 包中,这样,就可以为任何具有 JDBC 驱动的数据库所使用,从而实现数据库访问功能的通用化,如下图所示:


图 1 Java程序连接JDBC

DriverManager 类是 JDBC 的管理层,作用于用户和驱动程序之间,它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。该类负责加载、注册 JDBC 驱动程序,管理应用程序和已注册的驱动程序的连接。

DriverManager 类的常用方法如下表所示:

表:DriverManager 类的常用方法
方法 说明
static Connection getConnection(String url, String user, String password) 用于建立到指定数据库 URL 的连接。其中,url 为指定的连接数据库的地址和端口;user 为数据库用户名;password 为用户的密码。
static Driver getDriver(String url) 用于返回能够打开 url 所指定的数据库的驱动程序。

对于简单的应用程序,只需要直接使用该类的方法 DriverManager.getConnection() 进行连接即可。通过调用方法 Class.forName(),可显式地加载驱动程序类。

使用 JDBC 驱动程序建立连接的语句如下:
String dbName = "test";
String userName = "root";
String userPasswd = "123456";
String url = "jdbc:MySQL://localhost/" + dbName + "?user=" + userName + "&password=" + userPasswd;
Class.forName("com.MySQL.jdbc.Driver");
Connection conn = DriverManager.getConnection(url);

Connection 接口代表与特定的数据库的连接。要对数据表中的数据进行操作,首先要获取数据库连接。Connection 实现就像在应用程序与数据库之间开通了一条渠道。通过 DriverManager 类的 getConnection() 方法可获取 Connection。

Connection 接口代表 Java 程序和数据的连接,只有获取该连接对象,才能访问数据库来操作数据表,该接口的常用方法如下表所示。

表:Connection接口的常用方法
方法 说明
createStatement() 创建并返回一个 Statement 实例,通常在执行无参数 SQL 语句时创建该实例
prepareStatement() 创建并返回一个 PreparedStatement 实例,通常在执行包含参数的 SQL 语句中创建该实例,并对 SQL 语句进行预编译处理
prepareCall() 创建并返回一个 CallableStatement 实例,通常在调用数据库存储过程中创建该实例
commit() 从上一次或者回滚开始以来所有的变更都提交到数据库,并释放 Connection 实例当前拥有的所有数据库锁
rollback() 取消当前事务中的所有更改,并释放当前 Connection 实例拥有的所有数据库锁。该方法只能在非自动提交模式下使用,否则会抛出异常
close() 立即释放 Connection 实例所占用数据库和 JDBC 资源,即关闭数据库连接

相关文章