1.什么是JDBC
- 定义:
JDBC
(Java Database Connectivity
,Java
数据库连接),它是一套用于执行SQL
语句的Java API
- 作用:应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作
- 应用程序使用JDBC访问数据库的方式:
2.JDBC常用API
2.1.Driver接口
2.2.DriverManager类
2.2.1.作用
DriverManager
类用于加载JDBC
驱动并且创建与数据库的连接
2.2.2.主要方法
方法声明 | 功能描述 |
---|
static synchronized void registerDriver(Driver driver) | 该方法用于向DriverManager中注册给定的JDBC驱动程序 |
static Connection getConnection(String url,String user,String pwd) | 该方法用于建立和数据库的连接,并返回表示连接的Connection对象 |
- 注意 :在实际开发中,通常不使用
registerDriver(Driver driver)
注册驱动。因为JDBC
驱动类Driver
中有一段静态代码块,是向DriverManager
注册一个Driver
实例,当再次执行registerDriver(new Driver())
,相当于实例化了两个Driver
对象,因此在加载数据库驱动时通常使用Class
类的静态方法forName()
来实现。
2.3.Connection接口
2.3.1.作用
Connection
接口代表Java
程序和数据库的连接对象,只有获得该连接对象后,才能访问数据库,并操作数据表
2.3.2.常用方法
方法声明 | 功能描述 |
---|
Statement createStatement() | 该方法用于返回一个向数据库发送语句的Statement对象 |
PreparedStatement prepareStatement(String sql) | 该方法用于返回一个PreparedStatement对象,该对象用于向数据库发送参数化的SQL语句 |
CallableStatement prepareCall(String sql) | 该方法用于返回一个CallableStatement对象,该对象用于调用数据库中的存储过程 |
2.4.Statement接口
2.4.1.定义
Statement
是Java
执行数据库操作的一个重要接口,它用于执行静态的SQL
语句,并返回一个结果对象
2.4.2.基本使用
Statement
接口对象可以通过Connection
实例的createStatement()
方法获得,然后返回数据库的处理结果
2.4.3.常用方法
方法声明 | 功能描述 |
---|
boolean execute(String sql) | 用于执行各种SQL语句,返回一个boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可通过Statement的getResultSet()方法获得查询结果 |
int executeUpdate(String sql) | 用于执行SQL中的insert、update和delete语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数 |
ResultSet executeQuery(String sql) | 用于执行SQL中的select语句,该方法返回一个表示查询结果的ResultSet对象 |
2.5.PreparedStatement接口
2.5.1.定义
PreparedStatement
是Statement
的子接口,用于执行预编译的SQL语句
2.5.2.作用
PreparedStatement
接口扩展了带有参数SQL
语句的执行操作,应用接口中的SQL
语句可以使用占位符“?”来代替其参数,然后通过**setXxx()
方法为SQL
语句的参数赋值**
2.5.3.常用方法
方法声明 | 功能描述 |
---|
int executeUpdate() | 在此PreparedStatement对象中执行 SQL 语句,该语句必须是一个DML语句或者是无返回内容的SQL 语句,如 DDL 语句 |
ResultSet executeQuery() | 在此PreparedStatement对象中执行 SQL 查询,该方法返回的是ResultSet对象 |
void setInt(int parameterIndex, int x) | 将指定参数设置为给定的int值 |
void setFloat(int parameterIndex, float x) | 将指定参数设置为给定的float值 |
void setString(int parameterIndex, String x) | 将指定参数设置为给定的String值 |
void setDate(int parameterIndex, Date x) | 将指定参数设置为给定的Date值 |
void addBatch() | 将一组参数添加到此PreparedStatement对象的批处理命令中 |
void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) | 将指定的输入流写入数据库的文本字段 |
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) | 将二进制的输入流数据写入到二进制字段中 |
2.5.4.使用
- 为
SQL
语句参数赋值时,可以通过输入参数与SQL
类型相匹配的setXxx()
方法。例如字段的数据类型为int
或Integer
,那么应该使用setInt()
方法,也可以通过setObject()
方法设置多种类型的输入参数
1 2 3 4 5 6 7
| String sql = "INSERT INTO users(id,name,email) VALUES(?, ?, ?)"; PreparedStatement preStmt = conn.prepareStatement(sql); preStmt.setInt(1, 1); preStmt.setString(2, "zhangsan"); preStmt.setObject(3, "zs@sina.com"); preStmt.executeUpdate();
|
2.6.ResultSet接口
2.6.1.定义
ResultSet
接口用于保存JDBC
执行查询时返回的结果集,该结果集封装在一个逻辑表格中
2.6.2.说明
- 在
ResultSet
接口内部有一个指向表格数据行的游标(或指针),ResultSet
对象初始化时,游标在表格的第一行之前,调用next()
方法可将游标移动到下一行。如果下一行没有数据,则返回false
- 在程序中经常使用
next()
方法作为while
循环的条件来迭代ResultSet
结果集
2.6.3.常用方法
方法声明 | 功能描述 |
---|
String getString(int columnIndex) | 用于获取指定字段的String类型的值,参数columnIndex代表字段的索引 |
String getString(String columnName) | 用于获取指定字段的String类型的值,参数columnName代表字段的名称 |
int getInt(int columnIndex) | 用于获取指定字段的int类型的值,参数columnIndex代表字段的索引 |
int getInt(String columnName) | 用于获取指定字段的int类型的值,参数columnName代表字段的名称 |
Date getDate(int columnIndex) | 用于获取指定字段的Date类型的值,参数columnIndex代表字段的索引 |
Date getDate(String columnName) | 用于获取指定字段的Date类型的值,参数columnName代表字段的名称 |
boolean next() | 将游标从当前位置向下移一行 |
boolean absolute(int row) | 将游标移动到此 ResultSet 对象的指定行 |
void afterLast() | 将游标移动到此 ResultSet 对象的末尾,即最后一行之后 |
void beforeFirst() | 将游标移动到此 ResultSet 对象的开头,即第一行之前 |
boolean previous() | 将游标移动到此 ResultSet 对象的上一行 |
boolean last() | 将游标移动到此 ResultSet 对象的最后一行 |
2.6.4.使用
ResultSet
接口中定义了大量的getXxx()
方法,而采用哪种getXxx()
方法取决于字段的数据类型- 程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的
- 例如,假设数据表的第1列字段名为
id
,字段类型为int
,那么既可以使用getInt("id")
获取该列的值,也可以使用getInt(1)
获取该列的值。
3.JDBC编程
3.1.JDBC的编程步骤
- 加载数据库驱动
- 通过
DriverManager
获取数据库连接 - 通过
Connection
对象获取Statement
对象 - 使用
Statement
执行SQL
语句 - 操作
ResultSet
结果集 - 关闭连接,释放资源
1.加载数据库驱动
1
| Class.forName("DriverName");
|
2.通过DriverManager
获取数据库连接
1
| Connection conn = DriverManager.getConnection(String url, String user, String pwd);
|
3.通过Connection
对象获取Statement
对象
- 创建方式
createStatement():
创建基本的Statement
对象prepareStatement(String sql)
:根据传递的SQL语句创建PreparedStatement
对象prepareCall(String sql)
:根据传入的SQL
语句创建CallableStatement
对象
- 示例(以创建基本的
Statement
对象为例)
1
| Statement stmt = conn.createStatement();
|
4.使用Statement
执行SQL
语句
- 执行SQL方式
execute(String sql)
:用于执行任意的SQL
语句executeQuery(String sql)
:用于执行查询语句,返回ResultSet
结果集对象executeUpdate(String sql)
:主要用于执行DML
(数据操作语言)和DDL
(数据定义语言)语句。执行DML语
句(INSERT
、UPDATE
或DELETE
)时,会返回受SQL
语句影响的行数,执行DDL
(CREATE
、ALTER
)语句返回0
- 示例(以
executeQuery()
方法为例)
5.操作ResultSet
结果集
- 如果执行的
SQL
语句是查询语句,执行结果将返回一个ResultSet
对象,该对象里保存了SQL语句查询的结果 - 程序可以通过操作该
ResultSet
对象来取出查询结果
6.关闭连接,释放资源
- 每次操作数据库结束后都要关闭数据库连接,释放资源,以重复利用资源
- 通常资源的关闭顺序与打开顺序相反,顺序是
ResultSet
、Statement
(或PreparedStatement
)和Connection
- 为了保证在异常情况下也能关闭资源,需要在
try...catch
的finally
代码块中统一关闭资源