Java程序与数据库连接

    |     2016年5月11日   |   数据库   |     0 条评论   |    1693

一个网络关系数据库应用系统是三层次结构:客户机与服务器用网络连接,客户端按通信协议与服务器端数据库程序通信;数据库服务程序通过 SQL 命令与数据库管理系统通信。

Java 程序连库有两种:JDBC-ODBC 桥,以及纯 Java 的 JDBC 驱动。JDBC(Java DataBase Connectivity)由一组 Java 类和接口组成,能做三件事:建立连接、发送 SQL、处理返回结果。

一、JDBC-ODBC 桥

通信过程:应用程序向 ODBC 驱动管理器发 API 调用 → 转成对 DBMS 的 ODBC 驱动调用 → DBMS 再转成操作系统的数据 I/O → 数据逐级返回。

编程前要设数据源。在 ODBC 中:打开控制面板管理工具。Windows XP:性能维护 → 管理工具 → 数据源(ODBC);Windows 2000:管理工具 → 数据源。打开后显示现有数据源名。选“用户 DSN”,点“添加”,选 Access(*.mdb) 点完成,键入数据源名并选一个数据库表。点数据库区域的“选择”。需要授权时点“高级”,设登录名和密码后确定。若还没有表,先建表。

数据源就是数据库。设好后还要建立 JDBC-ODBC 桥,程序才能发 SQL、处理结果。调用 Class.forName(String s) 加载驱动:

try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (Exception e) {}

【例 13-7】方法 connectByJdbcOdbc() 按给定数据库 URL、用户名和密码连接,成功返回连接对象,失败返回空。

注意:JDK 8 已移除 JDBC-ODBC 桥(sun.jdbc.odbc.JdbcOdbcDriver),新项目请用纯 JDBC 驱动。

二、纯 Java JDBC 驱动

应用更广,但要下载对应驱动包,不同库加载的类名也不同。连接 SQL Server 可从 www.msdn.com 下载 msbase.jar、mssqlserver.jar、msutil.jar,放到 jdk\jre\lib\ext\ 或写入 CLASSPATH。连接 MySQL 用一个包:mysql-connector-java-3.1.11-bin.jar。

加载驱动有两种:把驱动类名加到 java.lang.System 属性 jdbc.drivers(冒号分隔的列表);或下载后在程序里 Class.forName():

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Class.forName("com.mysql.jdbc.Driver"); // 加载特定的驱动程序

数据库 URL 类似网络定位符,格式 subprotocol:subName://hostName:port/DatabaseName。subprotocol 是驱动支持的连接机制,subName 是该机制下的具体名称。例如(原文 Microsoft 大小写不统一,这里按常见写法):

jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=ksinfo
jdbc:mysql://localhost:3306/数据库名

该 URL 表示用 Microsoft 机制、SQL Server 驱动、1433 端口访问本机 ksinfo 库。建立连接用 DriverManager.getConnection()。

连接步骤

  • 下载驱动包,如 mysql-connector-java-3.1.11-bin.jar
  • Class.forName("com.mysql.jdbc.Driver")
  • Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名", username, password)

【例 13-8】静态方法按 URL、用户名、密码连接,成功返回 Connection(原文方法名 conectByJdbc、DriverManage 为笔误,下面按正确 API 写出):

public static Connection connectByJdbc(String url, String username, String password) {
    String url = "jdbc:mysql://localhost:3306/scxh";
    Connection con = null;
    try {
        Class.forName("com.mysql.jdbc.Driver"); // 加载特定的驱动程序
    } catch (Exception e) {
        e.printStackTrace();
        return null; // 连接失败
    }
    try {
        con = DriverManager.getConnection(url, username, password);
    } catch (SQLException e) {
        e.printStackTrace();
        return null; // 连接失败
    }
    return con; // 连接成功
}

三、DriverManager 与 Connection

DriverManager 负责加载驱动、建立新连接。应用程序通常只用静态方法 getConnection(String url, String username, String password)。桥接下 url 形如 jdbc:<连接机制>:<ODBC 数据源名>。

Connection 表示与特定数据库的连接,对库的操作都在这个对象上进行。主要方法:

Statement createStatement()
Statement createStatement(int resultSetType, int resultSetConcurrency)
void commit()       // 提交改动并释放当前持有的锁
void rollback()     // 回滚当前事务中的所有改动
String getCatalog() // 获得连接对象的当前目录
boolean isClosed()  // 判断连接是否已关闭
boolean isReadOnly()
void setReadOnly()
void close()        // 释放连接对象的数据库和 JDBC 资源

四、Statement 与 ResultSet

数据库编程要点是嵌入 SQL。先拿到 Connection,再用 createStatement() 创建语句对象:

Statement sql = null;
try {
    sql = con.createStatement();
} catch (SQLException e) {}

调用 executeQuery() 执行查询,结果放进 ResultSet,例如 ResultSet rs = sql.executeQuery("SELECT * FROM ksInfo")。ResultSet 实际是查询结果表,一行一条记录。隐含游标,一次只能看到当前行,next() 取下一行。用列名或从 1 开始的位置索引调用 getXXX():

byte getByte(int columnIndex)
Date getDate(int columnIndex)
float getFloat(int columnIndex)
int getInt(int columnIndex)
String getString(int columnIndex)
double getDouble(String columnName)
long getLong(String columnName)
boolean next()  // 是否还有下一行

五、可滚动结果集

要前后移动或定位到指定记录,创建 Statement 时增加两个参数:

Statement stmt = con.createStatement(type, concurrency);
ResultSet rs = stmt.executeQuery(SQL语句);
// type 决定滚动方式:
// ResultSet.TYPE_FORWARD_ONLY  游标只能向下
// ResultSet.TYPE_SCROLL_INSENSITIVE  可上下移动,库变了当前结果集不变
// ResultSet.TYPE_SCROLL_SENSITIVE    可上下移动,库变了结果集同步变
// concurrency 决定能否用结果集更新表:
// ResultSet.CONCUR_READ_ONLY
// ResultSet.CONCUR_UPDATABLE

例如只读、可滚动:

stmt = connect.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_READ_ONLY);

可滚动集上常用导航:

boolean previous()          // 游标向上,到第一行之前返回 false
void beforeFirst()          // 移到第一行之前
void afterLast()            // 移到最后一行之后
void first()
void last()
boolean isAfterLast()
boolean isBeforeFirst()
boolean isLast()
boolean isFirst()
int getRow()                // 当前行号自 1 起,空结果集返回 0
boolean absolute(int row)   // 移到第 row 行
类 / 接口 职责
DriverManager 加载驱动,getConnection 得到连接
Connection 代表一次会话:建 Statement、提交/回滚、关闭
Statement 在指定连接上执行 SQL
ResultSet 查询结果表 + 游标,getXXX / next / 滚动定位

一句话总结:连库先加载驱动再 getConnection;发 SQL 用 Statement,读结果用 ResultSet 游标。桥接已过时,生产环境用各库自己的 JDBC 驱动。

转载请注明来源:Java程序与数据库连接
本文链接地址:https://ai.zhousir.top/?p=1579
回复 取消