首页 > 其他分享 >JDBC

JDBC

时间:2024-10-12 17:24:26浏览次数:6  
标签:JDBC 数据库 PreparedStatement SQL 连接 连接池

目录

简述JDBC操作数据库的步骤?

JDBC(Java Database Connectivity)是一个 Java API,用于连接和执行查询在数据库中。以下是使用 JDBC 操作数据库的基本步骤:

  1. 加载数据库驱动

    • 需要加载数据库的 JDBC 驱动,以便 JDBC 能够识别和连接到数据库。
    Class.forName("com.mysql.jdbc.Driver");
    
  2. 建立数据库连接

    • 使用 DriverManager.getConnection() 方法建立到数据库的连接。
    Connection conn = DriverManager.getConnection(url, username, password);
    
  3. 创建 Statement 对象

    • 通过连接对象创建 Statement 对象,用于执行 SQL 语句。
    Statement stmt = conn.createStatement();
    
  4. 执行 SQL 语句

    • 使用 Statement 对象执行 SQL 查询或更新。
    ResultSet rs = stmt.executeQuery("SELECT * FROM table_name");
    // 或者执行更新操作
    int rowsAffected = stmt.executeUpdate("UPDATE table_name SET column_name = value WHERE condition");
    
  5. 处理 ResultSet

    • 如果执行的是查询操作,将返回 ResultSet 对象,需要遍历这个对象来处理查询结果。
    while (rs.next()) {
        String data = rs.getString("column_name");
        // 处理数据
    }
    
  6. 关闭资源

    • 操作完成后,需要关闭 ResultSetStatementConnection 对象,释放数据库资源。
    rs.close();
    stmt.close();
    conn.close();
    
  7. 处理异常

    • JDBC 操作过程中可能会抛出 SQLException,需要捕获并处理这些异常。
    try {
        // JDBC operations
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

以上是 JDBC 操作数据库的基本步骤。在实际开发中,可能还需要考虑事务管理、连接池的使用、预备语句(PreparedStatement)来防止 SQL 注入攻击等高级特性。此外,为了提高代码的可读性和可维护性,通常会使用 DAO 模式来封装数据库操作逻辑。

PreparedStatement 比Statement 有什么优势?

PreparedStatementStatement 都是 Java JDBC API 中用于执行 SQL 语句的接口,但它们在性能、安全性和功能上有一些关键的区别。以下是 PreparedStatement 相对于 Statement 的一些优势:

  1. 性能

    • PreparedStatement 可以预编译 SQL 语句,这意味着 SQL 语句在数据库中编译并优化后,可以重复使用,这对于执行多次相同的操作尤其有用。
    • Statement 每次执行相同的 SQL 语句时都需要重新编译,这在执行大量相同查询的情况下会导致性能下降。
  2. 安全性

    • PreparedStatement 可以有效防止 SQL 注入攻击,因为它们使用参数化查询,用户输入作为参数传递,而不是直接拼接到 SQL 语句中。
    • Statement 通常通过字符串拼接的方式来执行动态 SQL,这使得应用程序容易受到 SQL 注入攻击。
  3. 易于维护

    • 使用 PreparedStatement 可以使得代码更加清晰和易于维护,因为 SQL 语句和业务逻辑分离,参数化查询也使得代码更加整洁。
  4. 自动类型转换

    • PreparedStatement 会自动处理 Java 数据类型到 SQL 数据类型的转换,减少了数据类型转换的错误。
  5. 批量处理

    • PreparedStatement 支持批量设置参数和执行,这对于批量插入或更新操作非常有用,可以减少数据库的往返次数,提高效率。
  6. 支持元数据

    • PreparedStatement 提供了获取结果集元数据的方法,如 getParameterMetaDatagetMetaData,这有助于处理动态 SQL 查询。
  7. 可读性

    • 参数化查询使得 SQL 语句的可读性更强,尤其是当 SQL 语句包含多个变量时。

示例

// 使用 Statement
String sql = "SELECT * FROM users WHERE id = " + userId;
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);

// 使用 PreparedStatement
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();

在上面的例子中,PreparedStatement 的使用方式更加安全,因为它通过 setInt 方法来设置参数,而不是将用户输入直接拼接到 SQL 语句中。

总的来说,PreparedStatement 是执行 SQL 语句的推荐方式,尤其是在需要执行多次相同查询或执行动态 SQL 时。它提供了性能、安全性和易用性的优势。

简述数据库连接池的机制原理?你知道有哪些数据库连接池?

数据库连接池是一种创建和管理数据库连接的技术,用于减少建立和销毁连接的开销,提高资源利用率和系统性能。

机制原理

  1. 初始化:在应用启动时,连接池会根据预设的参数创建一定数量的数据库连接,或者保持空池,等待应用的请求。

  2. 连接请求:当应用需要与数据库交互时,它会向连接池请求一个连接。

  3. 连接分配:如果池中有空闲连接,连接池会分配一个给应用使用;如果没有空闲连接,且池未满,则创建一个新的连接;如果池已满,则根据设定的策略(等待、抛出异常等)处理请求。

  4. 连接使用:应用使用分配的连接执行数据库操作。

  5. 连接回收:操作完成后,应用将连接返回给连接池,而不是关闭连接。连接池会检查连接的有效性,如果连接有效,则将其标记为空闲,以便再次使用;如果连接无效,则从池中移除,并在需要时创建新连接。

  6. 连接维护:连接池会定期对空闲连接进行维护,如执行心跳检测、自动关闭长时间未使用的连接等。

  7. 连接销毁:在应用关闭或重载时,连接池会销毁所有连接,并释放资源。

优势

  • 减少开销:避免每次数据库操作都创建和销毁连接,减少了开销。
  • 提高性能:复用现有连接,减少了连接创建和销毁的时间。
  • 资源控制:限制最大连接数,避免过多连接消耗数据库资源。
  • 稳定性:通过定期检测和维护,保证连接的有效性。

常见的数据库连接池

  1. HikariCP:目前最流行的高性能 JDBC 连接池,以其速度快和稳定性著称。

  2. Apache DBCP(Database Connection Pool):Apache 提供的一个数据库连接池项目,功能全面。

  3. C3P0:是一个成熟的 JDBC 连接池实现,提供了丰富的配置选项。

  4. Vibur:一个高性能的轻量级连接池,专注于提供最佳性能。

  5. Tomcat JDBC Connection Pool:Tomcat 提供的连接池,通常与 Tomcat 服务器一起使用。

  6. H2 Database:一个纯 Java 编写的关系型数据库,内置了连接池管理。

  7. cojen:一个较新的连接池实现,旨在提供高性能和低延迟。

  8. BoneCP:一个高性能的连接池,专为需要高并发的应用设计。

  9. ConnId:主要用于身份管理的连接池,支持多种数据源。

  10. PooledDB:一个简单的连接池实现,适用于小型应用。

选择哪个连接池通常取决于应用的需求、性能要求、易用性和社区支持。开发者可以根据实际情况和个人喜好来选择最合适的连接池。

标签:JDBC,数据库,PreparedStatement,SQL,连接,连接池
From: https://www.cnblogs.com/yangcurry/p/18460951

相关文章

  • ERROR [org.hibernate.transaction.JDBCTransaction] - Could not toggle autocommit
    错误描述: DEBUG[org.hibernate.SQL]-SELECTorp.ATTR6FROMDISTRIBUT_VIEWd WHEREd.state='1'ANDd.oper_logLIKE'%下单%' GROUPBYorp.ATTR6 ERROR[org.hibernate.transaction.JDBCTransaction]-Couldnottoggleautocommitjava.sql.SQLE......
  • Java日总结---JDBC
    JDBC就是使用java语言操作关系型数据库的一种API1.JDBAAPI---DriverManager(两个作用)注册驱动:在mysql8.0后是ClassforName("com.mysql.cj.jdbc.Driver");来实现的查看源码后发现是由Driver类中静态代码块,底层是由DriverManager中的registerDriver方法来做的提示:在mysql5......
  • idea数据库图形化窗口连接数据库报错:Driver class ‘com.mysql.cj.jdbc.Driver‘ not
    报错信息在idea中数据库图形化窗口中,创建下图数据库连接点击测试连接后,发生报错:Driverclass'com.mysql.cj.jdbc.Driver'notfoundNodriverfilesprovided.报错界面:原因出现此错误的原因通常是数据库驱动程序尚未下载或未正确配置到IDEA中。解决方案......
  • Spring JdbcTemplate与NamedJdbcTemplate模板的实战案例与优化解析
    前言基于SpringJdbcTemplate来实现用户的增删改查案例,以及NamedJdbcTemplate模版的优化案例,和SpringJDBC相关支持类使用。 基本案例实现创建JavaWeb项目,使用JDBCTemplate对MySQL用户表进行增删改查操作。第一步:创建JavaWeb项目,创建数据库表,配置pom.xml文件t_user:......
  • 最简单的示例:通过JDBC查询数据
    引言在现代企业级应用开发中,持久层框架(如MyBatis、Hibernate等)极大地简化了数据库操作,提高了开发效率和代码的可维护性。本文将通过一个最简单的示例,演示如何使用JDBC连接数据库、执行SQL语句以及处理结果,并与Mybatis源码做对比,为后续深入研究MyBatis源码打下基础......
  • JDBC数据库 连接池配置
    前言我们在写任何一个CRUD方法的时候都要进行即连接数据库和释放资源这两个操作。DAO层方法中每次都创建一个Connection对象,用完就关闭了,创建Connection成本很大,如何解决这个问题呢?每次CRUD操作都要使用数据库的时候,都要创建一个数据库对象,普通的JDBC数据库连接使用DriverMan......
  • 三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关
    文章目录IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点进程线程创建线程的三种方式网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码XMLXML的作用是什么?xml特点注解什么是注解?注解的使用注解的重要性注解的使用实例M......
  • JDBC连接GaussDB云数据库操作示例
    ​目录一、实验环境二、登录华为云创建测试库表1、登录GaussDB云数据库2、建库、建表,用于测试3、新增普通角色(用户)用于登录及访问测试(可选)4、获取对应的公网IP三、创建java工程1、创建java工程2、添加jar包3、编辑Java代码四、执行并查看测试结果一、实验环境1、本......
  • 925 jdbc js 链表(2)
    jdbc基础复习一遍js声明函数行为绑定onclick单击ondbclick双击script标签放head以外也可以script必须写双标签变量声明都用var弱类型console。log1==1true1==‘1’trueprompt弹窗输入for循环js创建对象......
  • 奇妙的 JDBC batch insert 到 Doris 异常的问题
    遇到一个很奇怪的异常,通过JDBCbatchinsert时,会报`Unknowncommand(27)`的异常。![exception.png](https://upload-images.jianshu.io/upload_images/13187386-c3138cbb820d3f21.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)而且这个问题很容易复现,复现例子:1.......