JDBC是Java API的一种,用于执行SQL语句。它是Java标准库中规范程序如何访问数据库的接口。由于是接口,JDBC不能直接访问数据库,并且依赖于对应厂商提供的JDBC驱动,以实现JDBC规范。因此,编写程序操作数据库时一定要导入驱动包。
JDBC的类和接口主要位于java.sql包中:
常用的类和接口
Driver接口
所有支持Java语言连接的类都会实现Driver接口,不同数据库有不同的驱动类名:
-
MySQL 5:com.mysql.jdbc.Driver
-
MySQL 8:com.mysql.cj.jdbc.Driver
DriverManager类
用于注册驱动和创建Java代码与数据库的连接。主要方法:
方法声明 | 描述 |
static void registerDriver(Drvier driver) | 向DriverManager中注册JDBC驱动(建议不要使用) |
static Connection getConnection(String url, String user, String password) | 连接数据库并返回Connection接口对象。 |
加载数据库时通常使用Class类的静态方法forName()实现。
Connection接口
Connection接口代表一个Java程序和数据库的连接对象,Java程序通过这个连接对象访问和操作数据库。常用方法:
方法声明 | 描述 |
DatabaseMetaData getMetaData() | 返回DatabaseMetaData接口对象(访问数据库元数据) |
Statement createStatement | 创建一个Statement接口对象(将一条SQL语句写入程序) |
PreparedStatement prepareStatement(String sql) | 创建一个PreparedStatement接口对象(将一条SQL语句写入程序) |
`CallableStatement prepareCall(String sql) | 创建一个CallableStatement接口对象(用于调用数据库中的存储过程) |
Statement接口
用于执行静态SQL语句
方法声明 | 描述 |
int executeUpdate(String sql) | 执行DML(操作)语句,返回受语句影响的记录条数 |
ResultSet executeQuery(String sql) | 执行DQL(查询)语句,返回查询结果ResultSet接口对象 |
SQL语句分类
定义语句(DDL)
-
CREATE:创建数据库、表等
-
ALTER:修改表的定义
-
DROP:删除数据库、表等
操作语句(DML)
-
INSERT:插入数据
-
UPDATE:修改数据
-
DELETE:删除数据
查询语句(DQL)
-
SELECT:查询数据
控制语句(DCL)
-
GRANT:添加用户权限
-
REVOKE:收回用户权限
-
COMMIT:提交事务
-
ROLLBACK:回滚事务
PreparedStatement接口
PreparedStatement接口是Statement接口的子接口,用于执行预编译的SQL语句。该接口可以执行有参数的SQL语句,所以更推荐使用PreparedStatement接口。
在PreparedStatement接口对象的SQL语句中,使用?占位符来代替参数,然后通过以下方法为参数赋值,其中prarmeterIndex表示SQL语句中?占位符的顺序。
方法声明 | 描述 |
void setInt(int parameterIndex, int x) | 将参数设置为int类型值 |
void setDouble(int parameterIndex, double x) | 将参数设置为double类型值 |
void setString(int parameterIndex, String x) | 将参数设置为String类型值 |
void setDate(int parameterIndex, Date x) | 将参数设置为java.sql.Date类型值 |
其他方法:
方法声明 | 描述 |
int executeUpdate() | 执行包含参数的DML(操作)语句和DDL(定义)语句,返回受语句影响的记录条数 |
ResultSet executeQuery() | 执行包含参数的DQL(查询)语句,返回查询结果ResultSet接口对象 |
void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) | 将指定输入流写入数据库的文本字段 |
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) | 将二进制输入流数据写入二进制字段 |
execute()方法
bool execute()
可以执行各种SQL语句。如果执行语句后产生了ResultSet对象,则返回true,可以用getResultSet()获取ResultSet对象;如果执行语句没有产生ResultSet对象,则返回false,可以用getUpdateCount()方法获取返回所影响的行数。
ResultSet接口
ResultSet接口封装了DQL(查询)语句返回的结果集。ResultSet接口对象初始化时,会有一个位于结果集第一行记录之前的指针,调用next()方法可以向下移动指针,所有在应用程序中常使用next()作为while循环的条件来迭代ResultSet结果集。
while (resultSet.next()) {
intid=resultSet.getInt("id");
System.out.println(id);
}
获取方法:
columnIndex表示字段的索引(从1开始),columnName表示字段名
方法声明 | 描述 |
String getString(int columnIndex / String columnName) | 获取指定字段的String类型值 |
int getInt(int columnIndex / String columnName) | 获取指定字段的int类型值 |
Date getDate(int columnIndex / String columnName) | 获取指定字段的Date类型值 |
操作指针:
方法声明 | 描述 |
boolean next() | 下移一行 |
boolean absolute(int row) | 移动到指定行 |
void afterLast() | 移动到末尾,即最后一行之后 |
void beforeFirst() | 移动到开头,即第一行之前 |
boolean previous() | 上移一行 |
boolean last() | 移动到最后一行 |
JDBC编程
在了解JDBC常用的类和接口后,就可以编写JDBC程序操作数据库。
JDCB程序操作数据库的基本步骤是:
-
注册加载驱动
-
获取数据库连接
-
创建语句对象
-
执行语句
-
关闭资源
添加驱动包
以MySQL为例:
-
安装MySQL时会自动下载Java驱动包到C:\Program Files (x86)\MySQL\Connector J 8.0目录(默认安装路径)。
-
在IntelliJ IDEA中的项目下新建一个lib文件,将MySQL安装目录下的Java驱动程序复制到lib文件夹中。
-
在IntelliJ IDEA中依次点击File(文件)→Project Structure(项目结构)→Modules(模块),找到右侧的Dependencies(依赖),再单击➕,选择JARs or Directories(JARs或目录),在弹出的窗口选择刚才导入的驱动程序文件,点击OK(确定),然后点Apply(应用)。
导入sql类
新建Java类,在文件开头写入import java.sql.*;导入全部需要的sql接口和类。
注册加载驱动
加载MySQL数据库驱动代码如下:(会抛出异常ClassNotFoundException)
Class.forName("com.mysql.jdbc.Driver");
加载完数据库的驱动类后,Java会自动将驱动类的实例注册到DriverManagerDriverManager类。
获取数据库连接
使用getConnection()会抛出异常SQLException
Connection connection = DriverManager.getConnection(String url, String user, String pwd);
-
MySQL的url书写格式是jdbc:mysql://hostname:port/databasename
-
user表示用户名,pwd表示密码
连接本地数据库中的demo数据库,代码如下:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename", "root", "123456");
创建语句对象
这里使用PreparedStatement接口创建语句对象,会抛出异常SQLException
PreparedStatement preparedStatement = connection.prepareStatement("SQL语句");
在PreparedStatement接口对象的SQL语句中,使用?占位符来代替参数,然后通过PreparedStatement接口的方法为参数赋值。
执行语句
在创建语句对象后,使用对应接口的方法来执行语句。
方法声明 | 描述 |
int executeUpdate() | 执行DML(操作)语句,返回受语句影响的记录条数 |
ResultSet executeQuery() | 执行DQL(查询)语句,返回查询结果ResultSet接口对象 |
关闭资源
操作数据库会占用内存和外部数据库的资源,所以必须在方法调用结束后关闭数据库资源。为了保证在任何情况下都能关闭资源,应该将关闭操作对象名.close()放在try-catch语句的finally代码块中。