JDBC 概述
为了使 Java 编写的程序不依赖于具体的数据库,Java 提供了专门用于操作数据库的API,即JDBC(Java Data Base Connectivity)。使用 JDBC 的应用程序一旦和数据库建立连接,就可以使用 JDBC 提供的API操作数据库。
JDBC 的生命周期如下:
- 加载数据库驱动
- 与指定数据库建立连接
- 向已连接的数据库发送 SQL 语句
- 处理 SQL 语句返回的结果
- 关闭数据库连接
加载 JDBC-数据库驱动
JDBC 统一了操作API,连接仍需调用本地的 JDBC-数据库驱动与相应的数据库建立连接,不同的数据库需要下载相应的 .jar 扩展驱动。
以MySQL为例,加载 JDBC-MySQL 数据库驱动的代码如下:
1 | try{ |
MySQL 数据库驱动被封装在Driver类中,该类的包名是com.mysql.jdvc,该类不是Java运行环境类库中的类,所以需要放置在 jre 的扩展中。
连接数据库
java.sql 包中的 DriverManager 类有两个用于建立连接的类方法(static 方法):
- Connection getConnection(java.lang.String)
- Connection getConnection(java.lang.String,java.lang.String,java.lang.String)
这两个方法都可能抛出 SQLException 异常,DriverManager 类调用上述方法可以和数据库建立连接,返回一个 Connection 对象。
例如:连接数据库students、用户名root、密码为空。
使用Connection getConnection(java.lang.String)方法建立连接的代码如下:
1 | Connection con; |
使用Connection getConnection(java.lang.String,java.lang.String,java.lang.String)方法建立连接的代码如下:
1 | Connection con; |
MySQL5.7版本开始,建议程序和数据库服务器建立连接时,明确设置 useSSL 参数为true 或 false。
如果不设置,程序运行时总会提示用户程序进行明确设置(但不影响程序的运行),对于早期的 MySQL 版本,不必设置该项。
需要特别注意的是,如果数据库表中的记录有汉字,那么在建立连接时,需要额外多传递一个参数 characterEncoding,并取值 gb2312 或 utf-8。
数据库操作
向数据库发送SQL语句,首先使用 Statement 声明一个 SQL 语句对象,然后让已创建的连接对象 con 调用方法 createStatement()创建这个 SQL 语句对象,代码如下:
1 | try{ |
处理查询结果,创建了 SQL 语句对象后,这个对象就可以调用相应的方法实现对数据库中表的查询和修改。SQL 语句对数据库的操作会返回一个 ResultSet 类声明的对象,该对象按“列”(字段)组织的“行”(记录)构成,例如:
1 | ResultSet rs = sql.executeQuery("SELECT name,height FROM student"); |
查询返回的结果集对象 rs 的列数只有两列,第1列是 name 列,第2列是 height 列。
ResuleSet 对象 rs 一次只能获取到一条数据行(记录),使用 next()方法移动游标到下一条数据行。
获取到一行数据后,ResultSet 对象可以使用 getXxx 方法获得字段值(列值),将位置索引(如第1列为1)或列名传递给 getXxx 方法的参数即可。更多 ResultSet 对象方法,请查阅文档
控制结果集游标
结果集的游标(指针)初始位置在结果集第一行的前面,结果集调用 next() 方法向下(后)移动游标,移动成功返回 true,否则返回 false。如需结果集可上下(前后)移动,需在创建 Statement 对象时,对 Connection 连接对象调用的 createStatement()方法传递参数。
1 | Statement sql = con.createStatement(int type,int concurrency); |
type 的取值决定滚动方式,Concurrency 的取值决定是否可以用结果集更新数据库。
根据参数 type、concurrency 的取值(查阅文档)情况,Statement 对象返回相应类型的结果集。
关闭数据库连接
需要特别注意的是,ResultSet 结果集对象和数据库连接 Connection 对象实现了紧密绑定,一旦连接对象被关闭,ResultSet 对象中的数据对象将立刻消失,无法再被获取到。
关闭连接,应等到 程序 将 结果集 中的数据查看(获取)完毕再执行。
关闭连接,代码如下:
1 | con.close(); |
实例
1 | import java.sql.*; |
参考有风险,阅读需谨慎,转载请注明出处。