Java连接MySQL数据库

在PHP中连接MySQL是最简单的,PHP的发行包里通常带有MySQL驱动模块,只要简单修改一下PHP配置文件就可以加载MySQL驱动,而且PHP提供了很多专用于操作MySQL数据库的函数,用起来的确很爽。在Java、Ruby和Perl中连接MySQL也是比较简单的,这些语言都提供了某种抽象接口用于管理数据库驱动,无论用哪家的数据库,程序代码都几乎一样。

本文简单总结了Java连接MySQL数据库的一些基础问题,包括JDBC概述、四类JDBC驱动、Connector/J的安装、JDBC API的使用等。使用的软件版本是JDK 1.6.0.2 和 MySQL 5.1。

一、JDBC概述

Java通过JDBC连接数据库,JDBC是Java Database Connectivity的缩写。JDBC属于Java核心API,它包含一组丰富的类和接口,支持ANSI SQL-92标准,为Java程序连接数据库提供了简单便捷的途径。

JDBC是一种与平台无关的设计,它能够管理不同的数据库驱动程序,并为用户程序提供统一的接口。当用户需要连接几个不同的数据库时,只需通知JDBC加载相应的驱动程序,而不需要修改任何访问数据库的代码。

基于JDBC的应用程序系统具有如下所示的结构:
   Java Application  <--->
                         JDBC API  <---> 
                                   JDBC DriverManager  <--->
                                                             JDBC Database Driver  <--->
                                                                                                 Database

使用JDBC可以简化如下三种编程任务:
   1. 连接到数据源,比如一个数据库
   2. 发送查询和更新到数据库
   3. 检索并处理从数据库接收到了结果

一个典型的连接-查询-解析的过程如下所示:
    Connection con = DriverManager.getConnection
             ( "jdbc:myDriver:wombat", "myLogin","myPassword");
                  
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
    while (rs.next()) {
          int x = rs.getInt("a");
          String s = rs.getString("b");
          float f = rs.getFloat("c");
    }

这段代码建立一个DriverManager实例连接并登录数据库,一个Statement实例把SQL查询提交到数据库,一个ResultSet实例接收从数据库返回的查询结果,最后用一个简单的while循环从ResultSet中解析出感兴趣的数据。就是这么简单!

二、四类JDBC驱动程序

由于JDBC是独立于数据库实现的,而每个数据库实现均有自己的通信协议,因此JDBC驱动程序通常由数据库软件商和第三方软件商提供,也就是说在使用JDBC前,用户必须自己安装数据库驱动程序。

实际存在四种类型的JDBC驱动:

  类型1:JDBC-ODBC Bridge。这类JDBC驱动实际上是通过ODBC访问数据库的,因此需要首先安装ODBC驱动,在程序运行时也要首先加载ODBC驱动。一般只用于系统开发和测试。

  类型2:JDBC-Native API Bridge。同类型1一样,这类JDBC驱动也需要安装额外的Native驱动支持程序。

  类型3:JDBC-Middleware。所谓的Middleware其实是一种代理,它全权负责数据库的管理和使用,因此本地计算机上不需要安装任何数据库驱动程序,只要确保应用程序可以和Middleware通信即可。这种结构模型多用于Java Applet和Client/Server环境中,所有访问数据库的任务都在Server端完成。

  类型4:Pure JDBC Driver。此类驱动程序使用纯Java语言开发,能够直接连接数据库,通常是最好的选择。本文讲述的Java程序连接MySQL数据库的方法就是采用这种驱动程序。

三、安装Connector/J

MySQL官方发布的JDBC驱动程序称为MySQL Connector/J。这是一个JDBC-3.0“类型4”的驱动,它是纯Java开发的,实现了JDBC-3.0的全部要求,使用MySQL协议与MySQL服务器直接通信。

官方下载页面:http://dev.mysql.com/downloads/connector/j/5.1.html

Connector/J是以.zip或.tar.gz存档形式发布的,其中包括源代码、说明文档、以及编译好的二进制文件的JAR存档,.jar的名字就像"mysql-connector-java-[version]-bin-g.jar"。

Connector/J可以安装到任何位置,只需要把包含所有class的JAR加入系统环境变量CLASSPATH,就可以在Java程序中使用它了。

如果想在Tomcat、JBoss等服务器中使用Connector/J,安装前请参考相关文档。


四、在Java程序中连接MySQL

假设Connector/J已经安装好了,在Java程序中访问MySQL需要遵循以下步骤:

(1) 在程序的首部引入java.sql包,通常可以简单地将其全部引入:
    import java.sql.*;

    注意:不要引入com.mysql.jdbc.*,否则会出错!

(2) 使用Class.forName()方法加载Connector/J中的驱动类:
    Class.forName("com.mysql.jdbc.Driver");

    其中,com.mysql.jdbc.Driver类是对java.sql.Driver接口的实现,它就在Connector/J提供的 .jar 包里。

    有的文章里要求这样:
    Class.forName("com.mysql.jdbc.Driver").newInstance();

    实际上这是没有必要的,调用Class.forName()自动创建一个驱动实例并把它注册到DriverManager,所以你不需要再创建一个驱动实例,如果你这么做了,就会创建一个多余的重复,但这也没有什么损害。

(3) 如果第二步没有抛出异常,表明加载Connector/J驱动程序成功,下面连接数据库:
    Connection con = DriverManager.getConnection(conURL, user, password);

    String conURL指明了要连接的数据库的URL,还可以在conURL中包含数据库名,用户名和密码等。

    conURL一般遵循如下格式:jdbc:subprotocol://host.domain/database,对于Connector/J而言,subprotocal就是mysql。
    例如访问本地计算机上的名为Company的数据库,conURL = "jdbc:mysql://localhost/Company";

(4) 如果一切正常,现在可以对数据库进行查询或修改了。

    取得一个Statement实例(也只需要一个):
    Statement s = con.createStatement();

    可以使用Statement类的executeQuery、executeUpdate、execute方法向MySQL服务器提交SQL语句。
    e.g.
    ResultSet rs = s.executeQuery("SELECT * FROM Emplyee;");

    ResultSet类保存了查询操作返回的表格。

(5) 释放资源,关闭Java程序到MySQL服务器的连接:
    s.close();
    con.close();

五、一个完整的例子

//----------------------------------------------------------
import java.sql.*;

public class test {
    public static void main(int Argc, String[] Argv) {

        String JDriver = "com.mysql.jdbc.Driver";  // MySQL提供的JDBC驱动,要保证它在CLASSPATH里可见

        String conURL = "jdbc:mysql://localhost/Company";  // 本地计算机上的MySQL数据库Company的URL

        try {
            Class.forName(JDriver);
        }
        catch(ClassNotFoundException cnf_e) {  // 如果找不到驱动类
            System.out.println("Driver Not Found: " + cnf_e);
        }

        try {
            Connection con = DriverManager.getConnection(conURL, "root", "123456");  // 连接数据库

            Statement s = con.createStatement();  // Statement类用来提交SQL语句

            ResultSet rs = s.executeQuery("select * from Employee;");  // 提交查询,返回的表格保存在rs中

            while(rs.next()) {  // ResultSet指针指向下一个“行”
                System.out.println(rs.getInt("No") +   // 获取员工号
                        "\t" + rs.getString("Name") +  // 获取员工名字
                        "\t" + rs.getInt("Age"));      // 获取员工年龄
            }
            s.close();     // 释放Statement对象
            con.close();   // 关闭到MySQL服务器的连接
        }
        catch(SQLException sql_e) {     // 都是SQLException
            System.out.println(sql_e);
        }
    } // main()
}
//----------------------------------------------------------

六、进一步的问题

1 prefer DataSource rather than DriverManager
2 Using <CallableStatements> to Execute [Stored Procedures]
3 Transactions
4 Metadata
5 ...

你可能感兴趣的:(java,数据库)