非Spring Boot环境下Java连接Google Cloud MySQL求示例代码
非Spring Boot环境连接Google Cloud MySQL的实现方案
我完全理解你搜了好几天全是Spring Boot相关方案的郁闷——毕竟很多教程都默认大家用Spring生态,但纯Java环境连接Cloud SQL其实没那么复杂,正好适合你的自动化API测试场景。下面给你两种可行的方案和完整代码示例:
准备工作
先把基础配置搞定:
- 确保你的Google Cloud项目里已经创建了MySQL类型的Cloud SQL实例,并且创建了测试用的数据库、账号(赋予足够的查询权限)
- 下载MySQL JDBC驱动(推荐用8.0.x版本,适配最新的Cloud SQL MySQL实例)
- 如果选代理方案,提前下载Cloud SQL Auth Proxy工具(Google Cloud官网可直接获取对应系统的版本)
方案一:使用Cloud SQL Auth Proxy(推荐)
这种方式不需要暴露Cloud SQL实例的公网IP,更安全,适合测试环境使用:
启动代理工具(命令行执行):
# Linux/macOS ./cloud-sql-proxy your-project-id:your-region:your-instance-name # Windows cloud-sql-proxy.exe your-project-id:your-region:your-instance-name启动成功后,代理会把本地的3306端口转发到Cloud SQL实例的端口上。
构造JDBC连接URL:
jdbc:mysql://127.0.0.1:3306/your-db-name?user=your-db-username&password=your-db-password&allowPublicKeyRetrieval=true&useSSL=false注:
allowPublicKeyRetrieval=true是MySQL 8.0+版本可能需要的参数,防止连接报错。
方案二:直接通过公网IP连接
如果嫌代理麻烦,也可以直接用实例的公网IP连接,但需要先把测试机器的IP加入Cloud SQL实例的白名单(在Google Cloud控制台的Cloud SQL实例→连接→公网IP→添加网络):
构造JDBC连接URL:
jdbc:mysql://your-instance-public-ip:3306/your-db-name?user=your-db-username&password=your-db-password&useSSL=true
这种方式不够安全,不建议在生产环境使用,但临时测试可以用。
完整Java代码示例(用于自动化API测试)
下面是纯Java的连接、查询、校验代码,你可以直接集成到你的API测试框架里:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class CloudMySQLTestConnector { // 建议把这些配置放到环境变量或properties文件里,不要硬编码 private static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/test_db?user=test_user&password=test_pass&allowPublicKeyRetrieval=true&useSSL=false"; // 获取数据库连接(使用try-with-resources自动关闭连接) private static Connection getDBConnection() throws Exception { // MySQL 8.0+ 可以不用显式加载驱动,DriverManager会自动加载 // Class.forName("com.mysql.cj.jdbc.Driver"); return DriverManager.getConnection(JDBC_URL); } // 根据ID查询用户名(用PreparedStatement防止SQL注入) public static String getUsernameById(int userId) throws Exception { String username = null; String querySql = "SELECT username FROM users WHERE id = ?"; try (Connection conn = getDBConnection(); PreparedStatement pstmt = conn.prepareStatement(querySql)) { pstmt.setInt(1, userId); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { username = rs.getString("username"); } } } return username; } // 自动化API测试校验示例:对比API返回数据和数据库数据 public static void validateApiData(int apiReturnedUserId, String expectedUsername) { try { String actualUsername = getUsernameById(apiReturnedUserId); if (expectedUsername.equals(actualUsername)) { System.out.println("✅ 校验通过:API返回的用户ID对应的用户名与数据库一致"); } else { System.err.println("❌ 校验失败:预期用户名是[" + expectedUsername + "],数据库查询结果是[" + actualUsername + "]"); } } catch (Exception e) { System.err.println("❌ 数据库操作出错:" + e.getMessage()); e.printStackTrace(); } } // 测试入口 public static void main(String[] args) { // 假设你的API返回的用户ID是1,预期用户名是"john_doe" validateApiData(1, "john_doe"); } }
关键注意事项
- 避免硬编码敏感信息:把数据库账号、密码、JDBC URL放到环境变量或者配置文件中,比如用
System.getenv("DB_PASSWORD")获取环境变量值 - 防止SQL注入:一定要用
PreparedStatement代替Statement,尤其是当参数来自API返回或用户输入时 - 资源自动关闭:使用Java的try-with-resources语法,确保Connection、Statement、ResultSet等资源自动关闭,避免内存泄漏
- 驱动版本兼容:如果你的Cloud SQL实例是MySQL 5.x版本,驱动要对应用5.x版本,并且驱动类是
com.mysql.jdbc.Driver
内容的提问来源于stack exchange,提问作者MEGHA JAYEE
相关产品推荐
相关产品推荐

