"小王刚入职一家电商公司,领导让他开发一个简单的商品管理系统,需求很明确:用Java程序把商品信息存入MySQL数据库,可小王盯着屏幕发了半天呆——'Java怎么连MySQL来着?上次课好像讲过...'"
如果你也有过类似的困惑,别担心!今天我们就来彻底解决这个问题,无论是学生作业、毕业设计还是工作中的小项目,掌握Java连接MySQL这项基础技能都至关重要。
在开始写代码前,我们需要准备几样东西:
小贴士:Connector/J的jar文件可以手动下载后添加到项目库,如果用Maven/Gradle就更方便了。
让我们从最基础的JDBC连接开始:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class BasicConnection { public static void main(String[] args) { // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/your_database"; String username = "your_username"; String password = "your_password"; Connection connection = null; try { // 1. 加载驱动(新版本可以省略这步) Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立连接 connection = DriverManager.getConnection(url, username, password); // 3. 验证连接是否成功 if(connection != null) { System.out.println("恭喜!数据库连接成功啦!"); } } catch (ClassNotFoundException e) { System.out.println("找不到驱动类:" + e.getMessage()); } catch (SQLException e) { System.out.println("数据库连接失败:" + e.getMessage()); } finally { // 4. 关闭连接 try { if(connection != null) { connection.close(); } } catch (SQLException e) { System.out.println("关闭连接时出错:" + e.getMessage()); } } } }
常见问题排查:
?allowPublicKeyRetrieval=true
&useSSL=false
(生产环境不推荐)实际项目中,频繁创建关闭连接很耗资源,连接池才是王道!
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.SQLException; public class ConnectionPoolDemo { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database"); config.setUsername("your_username"); config.setPassword("your_password"); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); dataSource = new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } public static void main(String[] args) { try (Connection conn = getConnection()) { System.out.println("从连接池获取连接成功!"); // 这里执行你的SQL操作... } catch (SQLException e) { e.printStackTrace(); } } }
为什么用HikariCP:
光连接还不够,我们得会操作数据:
import java.sql.*; public class ProductDAO { private static final String INSERT_SQL = "INSERT INTO products(name, price, stock) VALUES (?, ?, ?)"; private static final String SELECT_BY_ID = "SELECT * FROM products WHERE id = ?"; public void addProduct(String name, double price, int stock) { try (Connection conn = ConnectionPoolDemo.getConnection(); PreparedStatement pstmt = conn.prepareStatement(INSERT_SQL)) { pstmt.setString(1, name); pstmt.setDouble(2, price); pstmt.setInt(3, stock); int affectedRows = pstmt.executeUpdate(); System.out.println("添加了 " + affectedRows + " 条记录"); } catch (SQLException e) { e.printStackTrace(); } } public void getProduct(int id) { try (Connection conn = ConnectionPoolDemo.getConnection(); PreparedStatement pstmt = conn.prepareStatement(SELECT_BY_ID)) { pstmt.setInt(1, id); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { System.out.printf("ID: %d, 名称: %s, 价格: %.2f, 库存: %d%n", rs.getInt("id"), rs.getString("name"), rs.getDouble("price"), rs.getInt("stock")); } } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { ProductDAO dao = new ProductDAO(); dao.addProduct("Java编程思想", 99.9, 50); dao.getProduct(1); } }
注意事项:
数据库操作难免出错,好的异常处理很重要:
try { // 数据库操作代码... } catch (SQLException e) { System.err.println("SQL状态码: " + e.getSQLState()); System.err.println("错误代码: " + e.getErrorCode()); System.err.println("错误信息: " + e.getMessage()); // 根据不同类型错误特殊处理 if(e.getErrorCode() == 1062) { System.out.println("重复数据,请检查唯一约束"); } else if(e.getErrorCode() == 1045) { System.out.println("用户名密码错误"); } }
根据2025年的技术发展,推荐以下实践:
版本选择:
安全配置:
String url = "jdbc:mysql://localhost:3306/db?useSSL=true&requireSSL=true";
新特性利用:
// 使用新的executeLargeUpdate方法处理大数据量 Statement stmt = conn.createStatement(); long count = stmt.executeLargeUpdate("UPDATE big_table SET status=1");
微服务环境:
Q:连接MySQL 8.0总是报时区错误?
A:在连接URL后添加:?serverTimezone=Asia/Shanghai
Q:如何查看当前数据库版本?
DatabaseMetaData meta = conn.getMetaData(); System.out.println("MySQL版本:" + meta.getDatabaseProductVersion());
Q:大量连接时出现"Too many connections"怎么办?
连接数据库就像给Java程序插上了存储数据的翅膀,从最初的DriverManager到现代化的连接池,虽然方式在变,但核心思想不变,无论技术如何发展,扎实的基础永远是你最强大的武器。
"小王已经熟练掌握了Java连接MySQL的各种技巧,他的商品管理系统运行得非常好,甚至开始研究更高级的MyBatis框架了,而这一切,都始于那个看似简单的数据库连接..."
希望这篇指南能成为你Java数据库开发路上的好帮手!如果遇到问题,不妨回头看看这些基础代码,也许答案就在其中。
本文由 雍卓 于2025-08-02发表在【云服务器提供商】,文中图片由(雍卓)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/512995.html
发表评论