JDBC常用类
一、DriverManager类
作用:管理一组JDBC驱动程序的基本服务
主要方法:
static Connection getConnection(String url)static Connection getConnection(String url, String user, String password)static Connection getConnection(String url, Properties info)static void deregisterDriver(Driver driver)static Driver getDriver(String url)
使用示例:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb", "user", "password");
二、Connection类
作用:表示与特定数据库的连接(会话)
主要方法:
Statement createStatement()- 创建Statement对象PreparedStatement prepareStatement(String sql)- 创建预编译语句CallableStatement prepareCall(String sql)- 创建存储过程调用语句void setAutoCommit(boolean autoCommit)- 设置自动提交模式void commit()- 提交事务void rollback()- 回滚事务void close()- 立即关闭连接boolean isClosed()- 检查连接是否已关闭DatabaseMetaData getMetaData()- 获取数据库元数据
事务控制方法:
conn.setAutoCommit(false); // 开始事务
try {
// 执行SQL操作
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
}
三、Statement类
作用:用于执行静态SQL语句并返回结果
主要方法:
ResultSet executeQuery(String sql)- 执行查询,返回ResultSetint executeUpdate(String sql)- 执行DML语句,返回影响行数boolean execute(String sql)- 执行任意SQL,返回是否有ResultSetvoid addBatch(String sql)- 将SQL添加到批处理int[] executeBatch()- 执行批处理void close()- 关闭StatementResultSet getResultSet()- 获取结果集int getUpdateCount()- 获取更新计数
使用示例:
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
while(rs.next()) {
// 处理结果
}
stmt.close();
四、PreparedStatement类(继承自Statement)
作用:表示预编译的SQL语句,可防止SQL注入
主要方法(除了继承的方法外):
void setInt(int parameterIndex, int x)- 设置整型参数void setString(int parameterIndex, String x)- 设置字符串参数void setDate(int parameterIndex, Date x)- 设置日期参数void setObject(int parameterIndex, Object x)- 设置任意类型参数void clearParameters()- 清除当前参数值
使用示例:
String sql = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 1);
pstmt.setString(2, "张三");
pstmt.setInt(3, 25);
pstmt.executeUpdate();
五、CallableStatement类(继承自PreparedStatement)
作用:用于调用数据库存储过程
主要方法:
void registerOutParameter(int parameterIndex, int sqlType)- 注册输出参数boolean wasNull()- 检查最后一个读取的值是否为SQL NULL- 各种get方法如
getInt(),getString()等获取输出参数值
使用示例:
// 调用存储过程 {call procedure_name(?, ?)}
CallableStatement cstmt = conn.prepareCall("{call get_employee(?, ?)}");
cstmt.setInt(1, 101); // 设置输入参数
cstmt.registerOutParameter(2, Types.VARCHAR); // 注册输出参数
cstmt.execute();
String name = cstmt.getString(2); // 获取输出参数
六、ResultSet类
作用:表示数据库结果集,通常通过执行查询数据库的语句生成
主要方法:
boolean next()- 将光标移动到下一行boolean previous()- 将光标移动到上一行boolean first()- 将光标移动到第一行boolean last()- 将光标移动到最后一行void beforeFirst()- 将光标移动到第一行前面void afterLast()- 将光标移动到最后一行后面boolean isBeforeFirst()- 判断是否在第一行前boolean isAfterLast()- 判断是否在最后一行后boolean isFirst()- 判断是否在第一行boolean isLast()- 判断是否在最后一行int getRow()- 获取当前行号boolean absolute(int row)- 移动到指定行boolean relative(int rows)- 相对移动行- 各种get方法如
getInt(),getString()等获取列值 void updateInt(int columnIndex, int x)- 更新列值(可更新结果集)void updateRow()- 更新当前行到数据库(可更新结果集)void deleteRow()- 删除当前行(可更新结果集)void refreshRow()- 刷新当前行数据
结果集类型:
TYPE_FORWARD_ONLY- 只能向前移动TYPE_SCROLL_INSENSITIVE- 可滚动,不感知数据库变化TYPE_SCROLL_SENSITIVE- 可滚动,感知数据库变化
并发模式:
CONCUR_READ_ONLY- 只读CONCUR_UPDATABLE- 可更新
使用示例:
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
// 向后遍历
while(rs.next()) {
System.out.println(rs.getString("name"));
}
// 向前遍历
rs.afterLast();
while(rs.previous()) {
System.out.println(rs.getString("name"));
}
// 可更新结果集示例
Statement updStmt = conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet updRs = updStmt.executeQuery("SELECT * FROM employees WHERE 1=2");
updRs.moveToInsertRow();
updRs.updateInt("id", 101);
updRs.updateString("name", "John");
updRs.insertRow();
七、DatabaseMetaData类
作用:提供关于数据库的整体信息
常用方法:
String getDatabaseProductName()- 获取数据库产品名称String getDatabaseProductVersion()- 获取数据库版本String getDriverName()- 获取JDBC驱动名称String getDriverVersion()- 获取JDBC驱动版本ResultSet getTables(String catalog, String schema, String tableName, String[] types)- 获取表信息ResultSet getColumns(String catalog, String schema, String table, String column)- 获取列信息ResultSet getPrimaryKeys(String catalog, String schema, String table)- 获取主键信息ResultSet getImportedKeys(String catalog, String schema, String table)- 获取外键信息
使用示例:
DatabaseMetaData meta = conn.getMetaData();
System.out.println("DB: " + meta.getDatabaseProductName());
System.out.println("Version: " + meta.getDatabaseProductVersion());
// 获取所有表
ResultSet tables = meta.getTables(null, null, "%", new String[]{"TABLE"});
while(tables.next()) {
System.out.println(tables.getString("TABLE_NAME"));
}
八、ResultSetMetaData类
作用:提供关于ResultSet对象中列的类型和属性信息
常用方法:
int getColumnCount()- 返回列数String getColumnName(int column)- 返回指定列的名称String getColumnTypeName(int column)- 返回指定列的数据类型名称int getColumnType(int column)- 返回指定列的SQL类型int getPrecision(int column)- 返回指定列的精度int getScale(int column)- 返回指定列的小数位数boolean isNullable(int column)- 指示列是否允许NULLboolean isAutoIncrement(int column)- 指示列是否自动递增
使用示例:
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
for (int i = 1; i <= colCount; i++) {
System.out.println("Column " + i + ": " + meta.getColumnName(i));
System.out.println("Type: " + meta.getColumnTypeName(i));
System.out.println("Nullable: " + (meta.isNullable(i) == ResultSetMetaData.columnNullable ? "YES" : "NO"));
}
九、RowSet类
RowSet扩展了ResultSet,提供了更灵活的功能,主要子类有:
JdbcRowSet- 连接的RowSetCachedRowSet- 离线的RowSetWebRowSet- 扩展CachedRowSet,支持XML格式JoinRowSet- 可以在内存中实现SQL JOINFilteredRowSet- 支持过滤数据
使用示例:
// 使用JdbcRowSet
JdbcRowSet jrs = RowSetProvider.newFactory().createJdbcRowSet();
jrs.setUrl("jdbc:mysql://localhost:3306/mydb");
jrs.setUsername("user");
jrs.setPassword("password");
jrs.setCommand("SELECT * FROM employees");
jrs.execute();
while(jrs.next()) {
System.out.println(jrs.getString("name"));
}
十、SQLException类
JDBC操作中可能抛出的异常,提供了丰富的错误信息:
常用方法:
String getSQLState()- 返回SQL状态码int getErrorCode()- 返回数据库特定的错误代码SQLException getNextException()- 获取链中的下一个异常Iterator<Throwable> iterator()- 获取异常链迭代器
最佳实践:
try {
// JDBC操作
} catch (SQLException e) {
while(e != null) {
System.out.println("SQL State: " + e.getSQLState());
System.out.println("Error Code: " + e.getErrorCode());
System.out.println("Message: " + e.getMessage());
e = e.getNextException();
}
}
5466

被折叠的 条评论
为什么被折叠?



