JDBC常用类

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) - 执行查询,返回ResultSet
  • int executeUpdate(String sql) - 执行DML语句,返回影响行数
  • boolean execute(String sql) - 执行任意SQL,返回是否有ResultSet
  • void addBatch(String sql) - 将SQL添加到批处理
  • int[] executeBatch() - 执行批处理
  • void close() - 关闭Statement
  • ResultSet 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) - 指示列是否允许NULL
  • boolean 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,提供了更灵活的功能,主要子类有:

  1. JdbcRowSet - 连接的RowSet
  2. CachedRowSet - 离线的RowSet
  3. WebRowSet - 扩展CachedRowSet,支持XML格式
  4. JoinRowSet - 可以在内存中实现SQL JOIN
  5. FilteredRowSet - 支持过滤数据

使用示例

// 使用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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值