JavaJDBC

1.什么是 JDBC

  • 定义:JDBCJava Database ConnectivityJava数据库连接),它是一套用于执行SQL语句的Java API
  • 作用:应用程序可通过这套 API 连接到关系型数据库,并使用 SQL 语句来完成对数据库中数据的查询、新增、更新和删除等操作
  • 应用程序使用 JDBC 访问数据库的方式:
    • image-20211119191900403

2.JDBC 常用 API

2.1.Driver 接口

  • Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用

  • 注意:在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指数据库的驱动 JAR 包)

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.定义

  • StatementJava执行数据库操作的一个重要接口,它用于执行静态的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.定义

  • PreparedStatementStatement的子接口,用于执行预编译的 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()方法。例如字段的数据类型为intInteger,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数
1
2
3
4
5
6
7
// 假设users表中字段id、name、email类型分别是int、varchar、varchar
String sql = "INSERT INTO users(id,name,email) VALUES(?, ?, ?)";
PreparedStatement preStmt = conn.prepareStatement(sql);
preStmt.setInt(1, 1); //使用参数与SQL类型相匹配的方法
preStmt.setString(2, "zhangsan"); //使用参数与SQL类型相匹配的方法
preStmt.setObject(3, "zs@sina.com"); //使用setObject()方法设置参数
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 的编程步骤

  1. 加载数据库驱动
  2. 通过DriverManager获取数据库连接
  3. 通过Connection对象获取Statement对象
  4. 使用Statement执行SQL语句
  5. 操作ResultSet结果集
  6. 关闭连接,释放资源

1.加载数据库驱动

1
Class.forName("DriverName");	// DriverName就是数据库驱动类所对应的字符串

2.通过DriverManager获取数据库连接

1
Connection conn = DriverManager.getConnection(String url, String user, String pwd);	// 数据库的url,用户名和密码
1
2
3
4
5
6
7
8
/**
* url语法(以MySQL数据库为例)
* jdbc:mysql:是固定的写法,mysql指的是MySQL数据库
* hostname指主机的名称
* port指的是连接数据库的端口号(MySQL端口号默认为3306)
* databasename指的是MySQL中相应数据库的名称
*/
jdbc:mysql://hostname:port/databasename

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句(INSERTUPDATEDELETE)时,会返回受SQL语句影响的行数,执行DDLCREATEALTER)语句返回 0
  • 示例(以executeQuery()方法为例)

    5.操作ResultSet结果集

  • 如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了 SQL 语句查询的结果

  • 程序可以通过操作该ResultSet对象来取出查询结果

    6.关闭连接,释放资源

  • 每次操作数据库结束后都要关闭数据库连接,释放资源,以重复利用资源

  • 通常资源的关闭顺序与打开顺序相反,顺序是ResultSetStatement(或PreparedStatement)和Connection

  • 为了保证在异常情况下也能关闭资源,需要在try...catchfinally代码块中统一关闭资源