JDBC详解与实战指南

JDBC详解与实战指南

1. JDBC基础概念

JDBC(Java Database Connectivity)是Java提供的API,用于连接和操作关系型数据库。核心接口包括DriverManagerConnectionStatementPreparedStatementCallableStatementResultSet等。

  • DriverManager:用于加载数据库驱动,并管理与数据库的连接。典型用法:

    Connection conn = DriverManager.getConnection(url, username, password);
    

    参数:

    • url:数据库连接的URL,格式如jdbc:mysql://localhost:3306/dbname
    • username:数据库用户名。
    • password:数据库密码。
  • Connection:表示与数据库的连接。支持事务管理:

    conn.setAutoCommit(false); // 开启事务
    conn.commit(); // 提交事务
    conn.rollback(); // 回滚事务
    

    方法:

    • setAutoCommit(boolean autoCommit):设置是否自动提交。
    • commit():提交事务。
    • rollback():回滚事务。
2. SQL语句执行
  • Statement:用于执行静态SQL语句,适合一次性执行:

    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM users");
    

    方法:

    • executeQuery(String sql):执行查询语句,返回ResultSet
    • executeUpdate(String sql):执行更新操作,返回受影响的行数。
  • PreparedStatement:预编译的SQL语句,适合多次执行,提高性能并防止SQL注入:

    PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
    pstmt.setInt(1, 123);
    ResultSet rs = pstmt.executeQuery();
    

    参数和方法:

    • setInt(int parameterIndex, int value):设置整数参数。
    • setString(int parameterIndex, String value):设置字符串参数。
  • CallableStatement:用于调用存储过程:

    CallableStatement cstmt = conn.prepareCall("{call getUser(?)}");
    cstmt.setInt(1, 123);
    ResultSet rs = cstmt.executeQuery();
    
3. 结果集处理
  • ResultSet:存储查询结果,支持逐行读取数据:
    while(rs.next()) {
        int id = rs.getInt("id");
        String name = rs.getString("name");
    }
    
    方法:
    • next():移动到下一行。
    • getInt(String columnLabel):获取指定列的整数值。
    • getString(String columnLabel):获取指定列的字符串值。
4. 批量操作
  • 批处理:通过addBatch()executeBatch()实现批量操作:
    PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (name) VALUES (?)");
    pstmt.setString(1, "John");
    pstmt.addBatch();
    pstmt.setString(1, "Jane");
    pstmt.addBatch();
    pstmt.executeBatch();
    
5. 元数据
  • DatabaseMetaData:获取数据库的结构信息:

    DatabaseMetaData dbMetaData = conn.getMetaData();
    ResultSet tables = dbMetaData.getTables(null, null, "%", new String[] {"TABLE"});
    
    • 方法:
      • getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types):获取数据库中的表信息。
  • ResultSetMetaData:获取结果集的元数据信息:

    ResultSetMetaData rsMetaData = rs.getMetaData();
    int columnCount = rsMetaData.getColumnCount();
    
6. 异常处理与调试
  • SQLException:JDBC操作中抛出的主要异常,包含丰富的错误信息:
    try {
        // JDBC操作
    } catch (SQLException e) {
        System.err.println("Error Code: " + e.getErrorCode());
        System.err.println("SQL State: " + e.getSQLState());
        e.printStackTrace();
    }
    
    • 方法:
      • getErrorCode():获取错误代码。
      • getSQLState():获取SQL状态码。
7. JDBC性能优化
  • 连接池:使用连接池管理数据库连接,减少创建和关闭连接的开销。
  • C3P0(C3P0 是一个开源的 JDBC 数据库连接池库)、
  • HikariCP(Spring Boot默认集成的数据库连接池是HikariCP)、
  • Druid连接池(Druid是阿里巴巴开源的数据库连接池项目))
  • PreparedStatement重用:在高频查询中重用PreparedStatement,避免多次编译SQL语句。
  • 批处理:使用批处理减少数据库交互次数,提高性能。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值