Java如何连接MySQL数据库:两步打通链路
java如何连接mysql数据库,本质是通过JDBC驱动建立TCP会话并执行SQL。最直接的方式是引入mysql-connector-j依赖后用DriverManager.getConnection()拿到Connection对象,三行代码即可连通;生产环境则推荐用HikariCP或Druid连接池复用连接,避免频繁握手带来的性能损耗。MySQL8.0以上版本驱动类名为com.mysql.cj.jdbc.Driver,URL必须带serverTimezone参数,否则会报时区错误;MySQL5.x则使用com.mysql.jdbc.Driver,两套配置不兼容。你需要提前确认MySQL开启了远程访问权限、3306端口可连通、账号有对应库的权限,否则代码写对也连不上。
Java连接MySQL数据库的JDBC基础配置
在pom.xml中引入mysql-connector-j,groupId为com.mysql,artifactId为mysql-connector-j,版本号与你服务器上的MySQL大版本对齐——MySQL8.0.x用8.0.x驱动,5.7.x用5.1.x驱动,跨大版本容易出现认证插件不兼容或字符集报错。JDBC4.0之后(Java6+),驱动通过SPI机制自动注册,不需要再写Class.forName("com.mysql.cj.jdbc.Driver")这行代码,但保留这行在某些老旧容器排查问题时仍有价值。
URL格式固定为jdbc:mysql://主机:端口/数据库名?参数,账号密码作为getConnection的第二、第三个参数传入。完整调用链是:DriverManager根据URL前缀匹配到MySQL驱动,驱动与MySQL服务端完成三次握手、认证、协商字符集,最后返回一个Connection实例。这个实例后续用来创建Statement或PreparedStatement执行查询。
拿到Connection就成功了大半。
Java连接MySQL数据库的连接池方案
裸用DriverManager每次请求都会新建TCP连接,握手和认证开销在高并发下很明显。连接池在应用启动时预先创建一批Connection放在队列里,用完归还而不是关闭,HikariCP是SpringBoot2.x之后默认集成的连接池,Druid由阿里巴巴开源并内置SQL监控页面。两种方案的核心差异如下:
| 对比项 | JDBC直连 | HikariCP连接池 | Druid连接池 |
|---|---|---|---|
| 适用场景 | 学习、脚本、低频任务 | 生产Web应用、高频接口 | 生产环境、需SQL监控 |
| 连接开销 | 每次新建TCP加认证 | 预创建复用 | 预创建复用 |
| 配置复杂度 | 低 | 中 | 中高 |
| 监控能力 | 无 | 有限 | 内置慢查询与SQL统计 |
URL里的参数直接决定连接行为。useSSL=false在MySQL8.0本地开发时建议加上,避免SSL警告;allowPublicKeyRetrieval=true配合caching_sha2_password认证插件使用;characterEncoding=utf8mb4确保emoji和生僻字不丢字;rewriteBatchedStatements=true让批量INSERT走更高效的协议。
Connection、Statement、ResultSet三个资源都要关,且必须在finally块或try-with-resources里关,否则数据库连接会被慢慢耗尽。Java7+推荐try-with-resources写法,把资源声明在try后的括号里,JVM会自动按声明逆序关闭,不需要手写finally。
常见错误是把密码里的特殊字符原样拼进URL,比如@符号会被URL解析器当作主机分隔符,导致连接串被截断报Communicationslinkfailure。密码含特殊字符时要么改密码,要么用Properties对象传参而不是拼URL字符串。
该方案的适用边界是单机MySQL或主从架构下的普通业务连接。如果你用的是MySQL8.0默认的caching_sha2_password认证插件,且驱动版本低于8.0,会直接拒绝认证,此时必须升级驱动到8.0.x,而不是改MySQL配置。对于需要读写分离、分库分表的场景,连接池本身不提供路由能力,需要额外配置ShardingSphere或MyBatis插件。
