内容简介:JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。JDBC库中所包含的API通常与数据库使用于:在学习JDBC之前,需要对以下两个编程知识有一定的了解:
JDBC是什么?
JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表 Java 数据库连接。
JDBC库中所包含的API通常与数据库使用于:
使用JDBC前提条件
在学习JDBC之前,需要对以下两个编程知识有一定的了解:
- JAVA核心编程
- SQL语句或一种数据库系统(如:MySQL,Oracle数据库)
JDBC环境设置
请确认您已完成以下设置:
- JAVA(JDK)安装
- 数据库系统的安装(如:MySQL的安装)
除上述者外环境配置外,还需要建立一个数据库,为本程项目作为测试使用。假设创建一个数据库: test
,在这个数据库上创建一张表: employees
。
创建JDBC应用程序
建立一个JDBC应用程序,本教程中以Java连接MySQL为一个示例,分六个步骤进行:
1. 导入包
在程序中包含数据库编程所需的JDBC类。大多数情况下,使用 import java.sql.*
就足够了,如下所示:
//STEP 1. Import required packages import java.sql.*;
Java
2. 注册JDBC驱动程序
需要初始化驱动程序,这样就可以打开与数据库的通信。以下是代码片段实现这一目标:
//STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver");
Java
3. 打开一个连接
使用 DriverManager.getConnection()
方法来创建一个 Connection
对象,它代表一个数据库的物理连接,如下所示:
//STEP 3: Open a connection // Database credentials static final String USER = "root"; static final String PASS = "pwd123456"; System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS);
Java
4. 执行一个查询
需要使用一个类型为 Statement
或 PreparedStatement
的对象,并提交一个SQL语句到数据库执行查询。如下:
//STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql);
Java
如果要执行一个SQL语句: UPDATE
, INSERT
或 DELETE
语句,那么需要下面的代码片段:
//STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "DELETE FROM Employees"; ResultSet rs = stmt.executeUpdate(sql);
Java
5. 从结果集中提取数据
这一步中演示如何从数据库中获取查询结果的数据。可以使用适当的 ResultSet.getXXX()
方法来检索的数据结果如下:
//STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); }
Java
6. 清理环境资源
在使用JDBC与数据交互操作数据库中的数据后,应该明确地关闭所有的数据库资源以减少资源的浪费,对依赖于JVM的垃圾收集如下:
//STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close();
Java
第一个JDBC 程序实例
基于上面的步骤,我们可以综合示例代码,您可以使用以下代码作为模板来编写JDBC代码。
注意:此示例代码基于环境和数据库环境设置完成的前提下使用。
//STEP 1. Import required packages import java.sql.*; public class FirstExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/test"; // Database credentials -- 数据库名和密码自己修改 static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); //STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); }catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main }//end FirstExample - by www.yiibai.com
Java
如果使用IDE,可将上面代码可放在IDE(如:Eclipse/Netbeans)中加入 mysql-connector-java-5.1.37-bin.jar
库并执行。
如果手动编译,需要把上面代码存放到 F:\worksp\jdbc\FirstExample.java
文件中,并创建一个目录: F:\worksp\jdbc\libs
,把下载的 mysql-connector-java-5.1.40-bin.jar
库(下载地址: http://downloads.mysql.com/archives/c-j/)放入到
F:\worksp\jdbc\libs
目录中。
使用命令行编译Java程序并加载指定目录中的Jar包(mysql-connector-java-5.1.40-bin.jar),现在编译上面的例子如下:
F:\worksp\jdbc> javac -Djava.ext.dirs=F:\worksp\jdbc\libs FirstExample.java F:\worksp\jdbc>
Shell
当运行 FirstExample
后,它会产生类似以下结果:
F:\worksp\jdbc> java -Djava.ext.dirs=F:\worksp\jdbc\libs FirstExample Connecting to database... Creating statement... ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal F:\worksp\jdbc>
Java
SQLException中的方法
一个 SQLException
类既可以发生在驱动程序和数据库中。当这样的异常时,SQLException类型的对象将被传递到 catch
子句。
通过 SQLException
对象有以下几种方法可用于获取更多的关于异常的信息:
方法 | 描述 |
---|---|
getErrorCode() | 获取与异常关联的错误代码 |
getMessage() | 获取JDBC驱动程序的错误处理错误消息,或获取Oracle错误代码和数据库的错误消息。 |
getSQLState() |
获取 XOPEN SQLSTATE
字符串。对于JDBC驱动程序错误,从该方法返回的可能是无用的信息。对于一个数据库错误,返回一个五位的 XOPEN SQLSTATE
代码。这种方法可以返回 null
。 |
getNextException() |
获取异常链中的下一个 Exception
对象 |
printStackTrace() | 打印当前的异常,或也可以抛出,并回溯到标准错误流 |
printStackTrace(PrintStream s) | 打印此抛出对象及其回溯到指定的打印流 |
printStackTrace(PrintWriter w) | 打印此抛出对象及其回溯到指定打印写入流 |
通过利用从 Exception
对象提供的信息,可以捕获一个异常,并适当地继续运行程序。这是一个 try
块中的一般形式:
try { // Your risky code goes between these curly braces!!! } catch(Exception ex) { // Your exception handling code goes between these // curly braces, similar to the exception clause // in a PL/SQL block. } finally { // Your must-always-be-executed code goes between these // curly braces. Like closing database connection. }
Java
JDBC数据类型
下表列出了默认的JDBC数据类型与Java数据类型转换,当使用 PreparedStatement
或 CallableStatement
对象时可调用 setXXX()
方法或 ResultSet.updateXXX()
方法。
SQL | JDBC/Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
CHAR | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
BIT | boolean | setBoolean | updateBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | byte | setByte | updateByte |
SMALLINT | short | setShort | updateShort |
INTEGER | int | setInt | updateInt |
BIGINT | long | setLong | updateLong |
REAL | float | setFloat | updateFloat |
FLOAT | float | setFloat | updateFloat |
DOUBLE | double | setDouble | updateDouble |
VARBINARY | byte[ ] | setBytes | updateBytes |
BINARY | byte[ ] | setBytes | updateBytes |
DATE | java.sql.Date | setDate | updateDate |
TIME | java.sql.Time | setTime | updateTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
BLOB | java.sql.Blob | setBlob | updateBlob |
ARRAY | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
STRUCT | java.sql.Struct | SetStruct | updateStruct |
在 JDBC3.0
中增强支持 BLOB
, CLOB
, ARRAY
, REF
等数据类型。 ResultSet
对象可调用 UPDATEBLOB()
, updateCLOB()
, updateArray()
和 updateRef()
方法,使您可以在数据库服务器上直接操作相应的数据。
对于 setXXX()
和 updateXXX()
方法,可以转换成特定的Java类型到特定的JDBC数据类型。而使用 setObject()
和 updateObject()
方法,几乎所有的Java类型映射到JDBC数据类型。
ResultSet
对象提供相应的 getXXX()
方法为每个数据类型来检索列值。每一种类型方法,可以使用与列名或由列的序号位置来获取列的数据。
SQL | JDBC/Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
BIT | boolean | setBoolean | getBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | byte | setByte | getByte |
SMALLINT | short | setShort | getShort |
INTEGER | int | setInt | getInt |
BIGINT | long | setLong | getLong |
REAL | float | setFloat | getFloat |
FLOAT | float | setFloat | getFloat |
DOUBLE | double | setDouble | getDouble |
VARBINARY | byte[ ] | setBytes | getBytes |
BINARY | byte[ ] | setBytes | getBytes |
DATE | java.sql.Date | setDate | getDate |
TIME | java.sql.Time | setTime | getTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
BLOB | java.sql.Blob | setBlob | getBlob |
ARRAY | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
STRUCT | java.sql.Struct | SetStruct | getStruct |
JDBC批量处理
批处理允许执行一个批处理组相关的SQL语句,并将其一次提交到数据库中执行。当几个SQL语句一次发送到数据库中时,可以减少通信开销,从而提高性能。
-
JDBC驱动程序不支持此功能。您应该使用
DatabaseMetaData.supportsBatchUpdates()
方法来确定目标数据库支持批量更新处理。如果JDBC驱动程序支持此功能,则该方法返回true
。 -
addBatch()
方法是PreparedStatement
和CallableStatementis
类中用于添加单个语句的批处理的声明。executeBatch()
将开始将所有语句组合到一起并执行。 -
executeBatch()
将返回一个整数数组,每个数组元素的表示为相应的更新语句的更新计数。 -
添加语句进行批处理时,可以使用
clearBatch()
方法删除它们。此方法将删除addBatch()
方法添加的所有语句。但是不能有选择性地选择某个语句来删除。
JDBC数据流
PreparedStatement
对象有能力使用提供参数数据的输入和输出流。这使您可以将整个文件到数据库中,可容纳较大的值,如 CLOB
和 BLOB
数据类型的列。
有下列方法可用于流数据:
-
setAsciiStream()
: 此方法用于提供大的ASCII
数据值。 -
setCharacterStream()
: 此方法用于提供大的UNICODE
数据值。 -
setBinaryStream()
: 使用此方法用于提供大的二进制数据值。
setXXXStream()
方法需要一个额外的参数,文件大小(除了参数占位符)。此参数通知应发送多少数据到数据库来使用流的驱动程序。
对于一个详细的关于所有这些概念,这里只是一个简单的入门教程,还需要读者去学习完整的教程,有关JDBC的后续教程,可以从左侧文章中了解和学习。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cyberwar
Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96
The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!