1 常用接口与类
常用接口与类主要有 DriverManager、Connection、Statement 和 ResultSet。
1.1 DriverManager
注册数据库驱动,创建数据库连接。Driver 由数据库厂家提供。
1)注册驱动
- 通过 API 注册驱动,但 Driver 会 new 两次
DriverManager.registerDriver(new Driver());
- 推荐写法:
Class.forName("com.mysql.jdbc.Driver");
Class.forName() 要求 JVM 查找并加载指定的类,会执行该类的静态代码段。JDBC 规范要求数据库厂家的 Driver 实现都必须向 DriverManager 注册自己。如 com.mysql.jdbc.Driver 类中,有以下静态块:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
2)连接数据库
- DriverManager.getConnection(String url, String user, String password)
Connection conn = DriverManager.getConnection(url, user, password) ;
1.2 Connection
所有与数据库交互都是基于连接对象的,在连接上下文中执行 sql 语句并返回结果。
1)创建 statement 对象
- createStatement():创建向数据库发送 sql 的 statement 对象。
- prepareStatement(sql) :创建向数据库发送预编译 sql 的 PrepareSatement 对象。
- prepareCall(sql):创建执行存储过程的 callableStatement 对象。
2)事务处理
- setAutoCommit(boolean autoCommit):设置事务是否自动提交。
- commit() :提交事务。
- rollback() :回滚事务。
- setSavepoint():创建保存点,可以回滚到保存点
3)其他
- getMetaData():获取一个 DatabaseMetaData 对象,该对象包含了有关数据库的基本信息
- close():关闭数据库连接
1.3 Statement
用于执行静态 SQL 语句并返回它所生成结果的对象。
1)三种 Statement 类
- Statement:由 createStatement 创建,用于发送简单的SQL语句(不带参数)。
- PreparedStatement:继承自 Statement 接口,由 preparedStatement 创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement 对象比 Statement 对象的效率更高,并且可以防止 SQL 注入,一般都使用 PreparedStatement。
如果 sql 语句有参数通过 ? 来占位。通过 setxxx(int i,Obj obj) 方法来指定参数String sql = "select *from user where username =? and password =?"; //创建prepareStatement statement = connection.prepareStatement(sql); //设置参数 statement.setString(1, username); statement.setString(2, password); resultSet = statement.executeQuery();
- CallableStatement:继承自 PreparedStatement 接口,由方法 prepareCall 创建,用于调用存储过程。
2)执行 sql
- execute(String sql):执行任意 sql 语句,返回 boolean 值,表示是否返回的是 ResultSet 结果集。只有不确定是什么语句的时候才应使用 execute() 方法
- executeQuery(String sql):只能运行 select 语句,返回 ResultSet 结果集。
- executeUpdate(String sql):运行 insert/update/delete 操作,返回更新的行数。
3)批处理
- addBatch(String sql) :把多条 sql 语句放到一个批处理中。
- executeBatch():向数据库发送一批 sql 语句执行。
1.4 ResultSet
查询数据结果集,可以作为迭代器通过移动获取数据。维护了一个游标,默认游指向结果集第一行之前。不可修改,Connection 关闭后,就不再可用。
1)检索不同类型字段的方法
- getString(int index)、getString(String columnName):获得在数据库里是 varchar、char 等类型的数据对象。
- getFloat(int index)、getFloat(String columnName):获得在数据库里是 Float 类型的数据对象。
- getDate(int index)、getDate(String columnName):获得在数据库里是 Date 类型的数据。
- getBoolean(int index)、getBoolean(String columnName):获得在数据库里是 Boolean 类型的数据。
- getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
2)对结果集进行滚动的方法
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动 resultSet 的最前面。
- afterLast():移动到 resultSet 的最后面。
3)判断
- isAfterLast():是否到了结尾
- isBeforeFirst():是否到了开头
- isFirst():是否第一条记录
- isLast():是否最后一条记录
- wasNull():检查列值是否为 NULL 值,如果列的类型为基本类型,且数据库中的值为 0,那么 这项检查就很重要。由于数据库 NULL 也返回 0,所以 0 值和数据库的 NULL 不能区分。如果列的类型为对象,可以简单地将返回值与 null 比较
- void close():关闭 ResultSet 对象
使用后依次关闭对象及连接:ResultSet → Statement → Connection
2 java.sql 操作数据库完整步骤示例
void jdbcTemple() {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//1.注册驱动
Class.forName(driverClass);
//2.建立连接
connection = DriverManager.getConnection(url, user, password);
//3.创建Statement
statement = connection.createStatement();
//4.执行sql语句
resultSet = statement.executeQuery("SELECT * FROM users");
//5.处理结果
while (resultSet.next()) {
resultSet.getString(columnIndex);
resultSet.getString(columnLabel);
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
//6.关闭连接
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}