JDBC的坑

小白一枚,今天刚开始用JDBC就遇到问题。
一:java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
两种解决办法:

  1. 将url改为:“jdbc:mysql://localhost:3306/emp?serverTimezone=GMT%2B8”
  2. 在命令行加一句设置失去时区的操作在这里插入图片描述
    二:Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
    Tue Nov 27 11:34:53 CST 2018 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    针对这个问题网上的解决办法大都是在url后面加一句:useSSL=false,但是我改来改去这个WARN一直都在。有其他办法的朋友欢迎留言。
<think>好的,用户之前问了关于Java Swing的知识,现在又转向了JDBC,我需要先回顾一下之前的对话,确保这次回答在结构和风格上保持一致。用户可能正在学习Java的各个核心部分,先学了GUI,现在想了解数据库连接。 首先,我需要确定用户的基础。他们可能已经了解Java基础,但可能对数据库概念不太熟悉。所以,在介绍JDBC时,要确保基础概念清晰,比如JDBC是什么,它的作用,以及核心组件。 接下来,用户可能需要知道JDBC的基本使用步骤,比如加载驱动、建立连接、创建语句、执行查询和处理结果。这些步骤需要分点说明,每个步骤给出示例代码,这样用户能更好地理解。 还要考虑用户可能遇到的常见问题,比如异常处理、资源释放、SQL注入等。这时候需要加入注意事项和最佳实践,比如使用PreparedStatement防止注入,使用连接池优化性能。 另外,用户可能对JDBC和ORM框架的区别不太清楚,比如Hibernate或MyBatis。需要简单对比,说明JDBC的优缺点,以及适用场景。 需要检查是否有遗漏的核心类,比如DriverManager、Connection、Statement、ResultSet等,这些都是JDBC的关键类,必须涵盖。 还要注意线程安全和性能优化的问题,比如连接池的使用,这部分用户可能在实际开发中会遇到,所以给出建议是必要的。 最后,提供一个完整的示例代码,让用户能够直观地看到JDBC的使用流程,从加载驱动到关闭连接,每一步都注释清楚。同时,确保示例代码正确,没有语法错误,并且符合Java的最新标准,比如使用try-with-resources来自动关闭资源。 可能用户的需求不仅仅是了解JDBC的基础,而是为了实际项目做准备,所以需要强调实践中的最佳做法,比如资源释放、异常处理等,避免常见的。 总结下来,回答需要结构清晰,分点讲解,结合代码示例,注意事项和常见问题,保持与之前Swing回答一致的风格,帮助用户逐步构建知识体系。</think>以下是 JDBCJava Database Connectivity)的基础知识介绍,从核心概念到实际使用逐步展开: --- ### 一、JDBC 是什么? JDBCJava 连接数据库的标准 API,提供与数据库交互的通用接口,支持执行 SQL 语句、处理查询结果和事务管理。 **核心目标**:通过统一接口访问不同数据库(如 MySQL、Oracle、PostgreSQL),开发者无需关心底层数据库差异。 --- ### 二、JDBC 核心组件 1. **DriverManager** 管理数据库驱动,负责加载驱动并建立连接。 2. **Connection** 表示与数据库的会话,用于创建 Statement 对象和管理事务。 3. **Statement** 执行静态 SQL 语句(如 `executeQuery()` 执行查询)。 4. **PreparedStatement** 预编译 SQL 语句,防止 SQL 注入,提升性能。 5. **ResultSet** 封装查询结果,提供遍历数据的方法(如 `next()`)。 6. **SQLException** 处理数据库操作中的异常(如连接失败、语法错误)。 --- ### 三、JDBC 使用步骤 #### 1. 加载数据库驱动 ```java Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动 // 或通过 DriverManager 自动加载(JDBC 4.0+ 支持) ``` #### 2. 建立数据库连接 ```java String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); ``` #### 3. 创建 Statement 对象 ```java Statement stmt = conn.createStatement(); // 普通 Statement PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?"); // 预编译 ``` #### 4. 执行 SQL 语句 - **查询操作** ```java ResultSet rs = stmt.executeQuery("SELECT * FROM users"); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println(id + ": " + name); } ``` - **更新操作(INSERT/UPDATE/DELETE)** ```java int rows = stmt.executeUpdate("DELETE FROM users WHERE id = 5"); System.out.println("删除了 " + rows + " 行"); ``` #### 5. 释放资源 必须按顺序关闭资源(ResultSet → Statement → Connection): ```java try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("..."); ResultSet rs = pstmt.executeQuery()) { // 自动关闭资源(JDK7+ try-with-resources) } catch (SQLException e) { e.printStackTrace(); } ``` --- ### 四、事务管理 通过 `Connection` 控制事务: ```java conn.setAutoCommit(false); // 关闭自动提交 try { // 执行多个 SQL 操作 conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚事务 } ``` --- ### 五、PreparedStatement 优势 1. **防止 SQL 注入** 通过占位符 `?` 绑定参数,避免恶意输入篡改 SQL 逻辑。 2. **提升性能** 预编译 SQL 语句,重复执行时效率更高。 ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)"); pstmt.setString(1, "张三"); // 第一个参数替换为字符串 pstmt.setInt(2, 25); // 第二个参数替换为整数 pstmt.executeUpdate(); ``` --- ### 六、连接池优化 频繁创建/关闭 `Connection` 会消耗资源,建议使用连接池: - **常用连接池**:HikariCP、DBCP、C3P0。 - **HikariCP 示例**: ```java HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); config.setUsername("root"); config.setPassword("123456"); try (HikariDataSource dataSource = new HikariDataSource(config); Connection conn = dataSource.getConnection()) { // 使用连接 } ``` --- ### 七、JDBC 与 ORM 框架对比 | **特性** | **JDBC** | **ORM(如 MyBatis、Hibernate)** | |----------------|-----------------------------------|---------------------------------------| | 开发效率 | 需手动编写 SQL 和映射代码 | 自动映射对象与表,减少重复代码 | | 灵活性 | 直接控制 SQL,灵活性高 | 部分复杂 SQL 需额外配置 | | 适用场景 | 简单查询、需要精细控制 SQL 的场景 | 快速开发、对象关系复杂的场景 | --- ### 八、注意事项 1. **异常处理** 始终捕获 `SQLException`,并确保资源关闭(避免内存泄漏)。 2. **SQL 注入** 禁止拼接 SQL 字符串,必须使用 `PreparedStatement`。 3. **性能优化** - 批量操作使用 `addBatch()` 和 `executeBatch()`。 - 查询结果较大时,设置 `fetchSize` 分页加载。 4. **兼容性** 不同数据库的驱动和 URL 格式可能不同(如 Oracle 的 `jdbc:oracle:thin:@localhost:1521:orcl`)。 --- ### 九、完整示例 ```java public class JdbcDemo { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE age > ?")) { pstmt.setInt(1, 18); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name") + ", " + rs.getInt("age")); } } catch (SQLException e) { e.printStackTrace(); } } } ``` --- ### 十、学习资源 - 官方文档:[JDBC Tutorial](https://docs.oracle.com/javase/tutorial/jdbc/) - 常用驱动: - MySQL:`mysql-connector-java` - PostgreSQL:`postgresql` - SQLite:`sqlite-jdbc` 掌握 JDBC 后,可进一步学习 MyBatis 或 Hibernate 等 ORM 框架,提升开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值