HoRain云--Java连MySQL:从JDBC到连接池全攻略

发布时间:2026/7/4 3:41:31
HoRain云--Java连MySQL:从JDBC到连接池全攻略 HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍☕ Java 连 MySQL从 JDBC 到连接池 先选驱动MySQL 8 必看️ JDBC 最小可跑MySQL 8 写法️ PreparedStatement必须跟 PHP 那篇安全篇呼应 连接池生产必上呼应前面 FastAPI 连接池那篇HikariCPSpring Boot 默认最快Druid阿里监控 墙 Spring Boot JDBC Template比纯 JDBC 省一半️ JPA / MyBatis 一句定位你不问不展开⚠️ 高频踩坑 一句选型☕ Java 连 MySQL从 JDBC 到连接池你前面 Java 那串数据类型 → String → 构造 → LinkedList → 多态 → 发邮件走下来MySQL 是「Java 工具线」第一站——JDBC 是基础连接池是生产Spring Boot 是日常。这篇跟前面 PHP MySQL / FastAPI 连接池那几条能串上。 先选驱动MySQL 8 必看驱动状态类名mysql-connector-j(8.x)✅ 现在标准com.mysql.cj.jdbc.Drivercom.mysql.jdbc.Driver❌ 5.x 已废弃别再写!-- pom.xml -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.3.0/version /dependency️ JDBC 最小可跑MySQL 8 写法import java.sql.*; public class JdbcDemo { public static void main(String[] args) throws Exception { // MySQL 8 必带 serverTimezone否则抛 WARN/error String url jdbc:mysql://localhost:3306/test_db?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue; String user root; String pwd password; // 1. 加载驱动MySQL 4.0 其实 Class.forName 可省但写了更稳 Class.forName(com.mysql.cj.jdbc.Driver); // 2. 拿连接 try (Connection conn DriverManager.getConnection(url, user, pwd)) { // 3. 查询 String sql SELECT id, name, age FROM users WHERE age ?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, 18); ResultSet rs ps.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(id) rs.getString(name) rs.getInt(age)); } // 4. 插入 String insert INSERT INTO users(name, age) VALUES(?, ?); PreparedStatement ps2 conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS); ps2.setString(1, 张三); ps2.setInt(2, 25); ps2.executeUpdate(); ResultSet keys ps2.getGeneratedKeys(); if (keys.next()) { System.out.println(新ID: keys.getLong(1)); } } // try-with-resources 自动关 conn/ps/rs } }⚠️ MySQL 8 四个高频卡点你前面 PHP 那篇没这些Java 独有serverTimezone不配会抛异常/WARNuseSSLfalse本地开发省事生产开 trueallowPublicKeyRetrievaltrue—— 用caching_sha2_password时MySQL 8 默认不配会登不上驱动类名cj那版老教程com.mysql.jdbc.Driver已废️ PreparedStatement必须跟 PHP 那篇安全篇呼应// ❌ 拼接 SQL → 跟 PHP 一样有注入风险 String sql SELECT * FROM users WHERE name name ; // ✅ PreparedStatement → 参数占位驱动转义 String sql SELECT * FROM users WHERE name ? AND age ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, name); // 驱动帮你转义引号 ps.setInt(2, 18);跟 PHPmysqli_prepare/ PDO 那套思想完全一致Java 这边?占位没有命名:name那种命名要借 MyBatis/JPA。 连接池生产必上呼应前面 FastAPI 连接池那篇JDBCDriverManager每次getConnection都建 TCP 握手高并发直接炸。生产用连接池HikariCPSpring Boot 默认最快dependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId /dependencyHikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/test_db?serverTimezoneAsia/ShanghaiuseSSLfalse); config.setUsername(root); config.setPassword(password); config.setMaximumPoolSize(20); config.setMinimumIdle(5); config.setConnectionTimeout(30000); // 30s HikariDataSource ds new HikariDataSource(config); // 用 try (Connection conn ds.getConnection(); PreparedStatement ps conn.prepareStatement(SELECT ...)) { ... }Druid阿里监控 墙dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.23/version /dependency# application.yml spring: datasource: druid: url: jdbc:mysql://localhost:3306/test_db?serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: password initial-size: 5 max-active: 20 filters: stat,wall # 监控 SQL 防火墙跟前面 FastAPIconnection_pool那篇思路一模一样池大小、超时、探活HikariCP≈ FastAPI SQLAlchemy poolDruid≈ 加了墙和监控。 Spring Boot JDBC Template比纯 JDBC 省一半dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency# application.yml spring: datasource: url: jdbc:mysql://localhost:3306/test_db?serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: password hikari: maximum-pool-size: 20Repository public class UserDao { Autowired private JdbcTemplate jt; public ListUser findAdults() { return jt.query( SELECT id, name, age FROM users WHERE age ?, (rs, rowNum) - new User( rs.getLong(id), rs.getString(name), rs.getInt(age) ), 18 ); } public int add(User u) { return jt.update( INSERT INTO users(name, age) VALUES(?, ?), u.getName(), u.getAge() ); } }JdbcTemplate帮你管PreparedStatement 资源关闭 行映射比裸 JDBC 舒服又比 JPA 轻——CRUD 简单表首选。️ JPA / MyBatis 一句定位你不问不展开方案定位什么时候用JDBC JdbcTemplateSQL 自己写轻简单 CRUD、报表、遗留表MyBatis​SQL 写 XML/注解Java 管映射复杂 SQL、DBA 调优、遗留项目JPA / Hibernate​对象主导SQL 自动生成领域模型清晰、CRUD 为主、快速开发跟前面 FastAPI SQLAlchemy / Pydantic 那套可以对上JPA ≈ SQLAlchemy ORMMyBatis ≈ SQL 映射手写。⚠️ 高频踩坑坑现象解法MySQL 8 没配serverTimezoneThe server time zone value XXX is unrecognizedserverTimezoneAsia/Shanghaicom.mysql.jdbc.Driver弃用警告换com.mysql.cj.jdbc.Driver中文乱码库/表 UTF8MB4 没配URL 加characterEncodingUTF-8 库utf8mb4连接泄露Too many connections一定try-with-resources或池框架关caching_sha2_password登不上MySQL 8 默认 authURL 加allowPublicKeyRetrievaltrue批量插入慢逐条executeUpdateaddBatch()executeBatch()或rewriteBatchedStatementstrue 一句选型本地练手JDBC MySQL 8 驱动​Spring Boot 小项目JdbcTemplate HikariCP​复杂 SQL / 国内项目MyBatis Druid​领域模型重 / 快速开发JPA要不要顺着往下看Spring Boot MyBatis 最小可跑跟前面 PHP PDO / FastAPI SQL 那两条工具线能串还是JDBC Batch / 事务conn.setAutoCommit(false)那块你前面那条线走的是「基础 → 工具」MyBatis 是工具线下一站。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧