JDBC是一种可用于执行SQL语句的Java API,是连接数据库和Java程序的纽带。JDBC全称是Java Database Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口。JDBC是一种底层的API,因此访问数据库时需要再逻辑层中嵌入SQL语句。
1.JDBC技术主要完成以下任务:
1.1.与数据库建立连接。
1.2.向数据库发送SQL语句。
1.3.处理从数据库返回的结果。
需要注意:JDBC并不能直接访问数据库,必须依赖数据库厂商提供的JDBC驱动程序。
2.JDBC驱动程序的类型
JDBC-ODBC桥
依靠ODBC驱动器和数据库通信。这种连接方式必须将ODBC二进制代码加载到使用该驱动程序的每台客户机上。
JDBC网络驱动
这种驱动程序将JDBC转换为与DBMS无关的网络协议,又被某个服务器转换为DBMS协议,是一种利用Java编写的JDBC驱动程序,也是最灵活的驱动程序。
本地协议驱动
这是一种纯Java驱动程序。这种驱动程序将JDBC调用直接转换为DBMS所使用的网络协议,允许从客户机上直接调用DBMS服务器,是一种很使用的访问Internet的解决方法。
3.JDBC中常用的类和接口
常用的JDBC类和接口都在java.sql包中。
3.1 Connection接口
Connection接口代表与特定的数据库的连接,在连接上下文中执行SQL语句并返回结果。
方法 | 功能描述 |
createStatement() | 创建Statement对象 |
createStatement(int resultSetType, int resultSetConcurrency) | 创建一个Statement对象,该对象将生成具有给定类型、并发性和可保存性的ResultSet对象 |
preparedStatement() | 创建预处理对象preparedStatement |
isReadOnly() | 查看当前Connection对象的 读取模式是否为只读模式 |
setReadOnly() | 设置当前Connection独享的读取模式为只读模式,默认为非只读模式 |
commit() | 使所有上一次提交/回滚后进行的更改成为持久更改,并释放此Connection对象所持有的所有数据库锁 |
roolback() | 取消当前事务中进行的所有更改,并释放此Connection对象所持有的所有数据库锁 |
close() | 立即释放此Connection对象所持有的数据库和JDBC资源 |
3.2 Statement接口
Statement接口用于在已经建立Connection连接的基础上向数据库发送SQL语句。
在JDBC中有3种Statement对象:
3.2.1 Statement接口
Statement对象用于执行不带参数的简单SQL语句;
方法 | 功能描述 |
execute(String sql) | 执行静态的SELECT语句,该语句可能返回多个结果集 |
executeQuery(String sql) | 执行给定的SQL语句,该语句返回单个resultSet对象 |
clearBatch() | 清空此Statement对象的当前SQL命令列表 |
executeBatch() | 将一组命令提交给数据库来执行,如果命令全部执行成功,则返回一个更新计数组成的数组,数组元素的排序与SQL语句的添加顺序对应 |
addBatch(String sql) | 将给定的SQL命令添加到此Statement对象的当前命令列表中,如果驱动程序不支持批量操作,将抛出异常 |
close() | 释放Statement对象占用的数据库和JDBC资源 |
3.2.2 PreparedStatement接口
PreparedStatement继承了Statement,用来执行动态的SQL语句;通过PreparedStatement实例执行的动态SQL语句,将被预编译并保存到PreparedStatement实例中,从而可以反复地执行该SQL语句。
方法 | 功能描述 |
setInt(int index, int k) | 将指定位置的参数设置为int值 |
setFloat(int index, float f) | |
setLong(int index, long l) | |
setDouble(int index, double d) | |
setBoolean(int index, boolean b) | |
setDate(int index, date date) | |
setString(int index, String s) | |
setNull(int index, intsqlType) | 将指定位置的参数设置为SQL NULL |
executeQuery() | 在此PreparedStatement对象中执行SQL查询,并返回该查询结果生成的ResultSet对象 |
executeUpdate() | 执行前面包含参数的动态INSERT,UPDATE,DELETE语句 |
clearParameters() | 清除当前所有参数的值 |
3.2.3 CallableStatement接口
CallableStatement继承了PreparedStatement,用于执行对数据库的存储过程的调用。
3.3 PreparedStatement接口
同3.2.2
3.4 DriverManager类
DriverManager类用来管理数据库中的所有驱动程序。它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。
方法 | 功能描述 |
getConnection(String url, String user, String password) | 指定3个入口参数,来获取与数据库的连接 |
setLoginTimeout() | 设置驱动程序试图登录某数据库的最长等待时间,单位为秒 |
println(String message) | 将一条消息打印到当前JDBC日志流中 |
3.5 ResultSet接口
ResultSet接口类似一个临时表,用来暂时存储数据库查询操作所获取的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移动。
方法 | 功能描述 |
getInt() | 以int的形式获取此ResultSet对象的当前行的指定列的值。如果列值是NULL,则返回值是0 |
getFloat() | |
getDate() | |
getBoolean() | |
getString() | |
getObject() | |
first() | 将指针移动到当前记录的第一行 |
last() | 将指针移动到当前记录的最后一行 |
next() | 将指针向下移动一行 |
beforeFirst() | 将指针移动到集合的开头(第一行位置) |
afterLast() | 将指针移动到集合的尾部(最后一行位置) |
absolute(int index) | 将指针移动到ResultSet给定编号的行 |
isFirst() | 判断指针是否位于当前记录的第一行 |
isLast() | |
updateInt() | 用int值更新指定列 |
updateFloat() | |
updateLong() | |
updateString() | |
updateObject() | |
updateNull() | |
updateDate() | |
updateDouble() | |
getrow() | 查看当前行的索引号 |
insertRow() | 将插入行的内容插入到数据库中 |
updateRow() | 将当前行的内容更新到数据库表 |
deleteRow() | 删除当前行,但不同步到数据库,而是执行close()方法后同步到数据库中 |
4.数据库操作
4.1 连接数据库步骤:
4.1.1 下载数据库驱动类,并加载到程序中
详见JDBC | mysql-connector jar包的加载_mysql-connector-java.jar-CSDN博客
4.1.2 通过java.lang包的静态方法forName()来加载JDBC驱动程序
4.1.3 通过java.lang包中类DriverManager的静态方法getConnection(String url, String user, String pwd)建立数据库连接
java">package db;
import java.sql.*; //导入java.sql包
public class Conn {
Connection con; //声明Connection对象
public Connection getConnection() { //建立返回值为Connection对象的方法
try {
// Class.forName("com.mysql.jdbc.Driver"); //deprecated
Class.forName("com.mysql.cj.jdbc.Driver"); //加载数据库驱动类
System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//通过访问数据库的url,获取数据库连接对象con
con = DriverManager.getConnection("jdbc:mysql:" + "//127.0.0.1:3306/debug", "root", "12345678");
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return con; //返回Connection对象
}
public static void main(String[] args) {
Conn c = new Conn(); //创建类对象
c.getConnection(); //调用连接数据库的方法
}
}
输出:
数据库驱动加载成功
数据库连接成功