Java通过JDBC驱动连接MySQL数据库,核心四步走:加载驱动、获取连接、执行SQL、关闭资源;Sqoop则通过命令行工具连接MySQL,主要用于大数据生态的批量数据迁移,两者应用场景不同,但都依赖MySQL JDBC驱动和网络连通性。
Java连接MySQL数据库步骤详解
准备工作:添加MySQL JDBC驱动依赖
用Java代码连MySQL,第一步是搞定驱动,如果你用Maven,在pom.xml里加以下内容:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
Gradle用户用implementation 'mysql:mysql-connector-java:8.0.33',手动下载jar包放进classpath也行,但要注意版本对应。驱动版本建议与MySQL服务器版本匹配,8.x驱动兼容5.7和8.0,多数情况下直接用最新稳定版即可。
核心代码:加载驱动、建立连接、执行SQL
下面是一个完整的Java连接MySQL数据库代码示例,涵盖了从加载驱动到关闭资源的标准流程:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class MySQLConnector {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "your_password";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "SELECT FROM your_table";
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString("column_name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 从里到外依次关闭
try { if (rs != null) rs.close(); } catch (Exception e) {}
try { if (stmt != null) stmt.close(); } catch (Exception e) {}
try { if (conn != null) conn.close(); } catch (Exception e) {}
}
}
}
关键点:连接字符串jdbc:mysql://后跟主机、端口、数据库名,参数useSSL和serverTimezone经常需要设置,避免SSL警告和时区报错,驱动类名从com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver(6.x版本之后),每次操作务必关闭资源,防止连接泄漏。
使用连接池优化性能
生产环境不建议直接用DriverManager获取连接,改用连接池(如HikariCP)能显著提升性能,配置示例:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/your_db?useSSL=false");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection();
连接池复用连接,减少创建开销,是Java连接MySQL数据库的推荐做法。
常见问题排查
- ClassNotFoundException:驱动jar没引入,检查依赖或手动添加。
- CommunicationsException:连接超时,检查MySQL服务是否启动、防火墙3306端口是否开放、连接地址是否正确。
- Access denied:用户或密码错误,也可能权限不足,用
GRANT语句授权。 - 中文乱码:连接字符串追加
characterEncoding=UTF-8。
Sqoop连接MySQL常用命令详解
必备条件与驱动配置
Sqoop本身不带MySQL驱动,需要把mysql-connector-java.jar复制到Sqoop的lib目录下,同时确保Sqoop环境变量已配置,MySQL服务可访问。连接命令的基本格式:
sqoop import --connect jdbc:mysql://host:port/database --username user --password pass --table table_name --target-dir /path
MySQL JDBC连接字符串的格式与Java代码中一致,例如
jdbc:mysql://192.168.1.100:3306/your_db?useSSL=false&serverTimezone=UTC。
从MySQL导入数据到HDFS
下面是一个实际命令,将MySQL表导入HDFS,并指定逗号分隔:
sqoop import --connect jdbc:mysql://192.168.1.100:3306/your_db --username root --password 123456 --table employees --target-dir /user/hive/warehouse/employees --fields-terminated-by ',' --num-mappers 4
Sqoop导入MySQL数据到Hive实战
这是大数据场景里的高频操作,将MySQL数据直接倒入Hive表:
sqoop import --connect jdbc:mysql://192.168.1.100:3306/your_db --username root --password 123456 --table employees --hive-import --hive-table employees --create-hive-table --fields-terminated-by ','
参数说明:
--connect:指定MySQL JDBC连接字符串。--username/--password:数据库认证信息。--table:要导入的表名。--hive-import:启动Hive导入模式。--hive-table:目标Hive表名。--num-mappers:并行Map数,通常设为4-8,根据数据量调整。--split-by:指定分片列,最好用主键或整型列,保证数据均匀分布。
增量导入与参数调优
当数据持续增长,可以用增量导入模式:
sqoop import --connect jdbc:mysql://... --username ... --password ... --table orders --incremental lastmodified --check-column update_time --last-value '2026-01-01 00:00:00'
--boundary-query可以自定义分片边界,避免全表扫描;--fetch-size调整每次拉取行数,默认1000,大表适当增大可提高吞吐。合理设置--split-by和--num-mappers是Sqoop性能优化的关键。
Java连接与Sqoop连接的场景选择
| 对比项 | Java JDBC | Sqoop |
|---|---|---|
| 操作方式 | 编程式,需要写代码 | 命令行,适合脚本化 |
| 数据规模 | 小到中等,适合单条或小批量操作 | 大容量,批量迁移效率极高 |
| 并行能力 | 需手动实现多线程,复杂度高 | 内置MapReduce,并行度可调 |
| 主要用途 | 应用内实时数据交互、事务处理 | 离线ETL、数据仓库导入导出 |
| 灵活性 | 高,可定制复杂业务逻辑 | 低,以表为单位,受限于SQL |
行业共识:当数据量超过百万行时,Sqoop的批量导入速度远快于Java JDBC逐条插入,但Java JDBC在实时查询和复杂逻辑处理上无可替代,选择哪种方式,取决于你的数据量、时效性和技术栈。
Java连接MySQL数据库与Sqoop使用常见问题(Q&A)
Q1:Java连接MySQL时ClassNotFoundException怎么解决?
A:确认mysql-connector-java.jar是否在classpath中,Maven项目检查依赖是否下载成功,手动项目检查jar包路径,驱动类名在新版中为com.mysql.cj.jdbc.Driver,旧版为com.mysql.jdbc.Driver,包名不要写错。
Q2:Sqoop连接MySQL时提示拒绝连接,如何排查?
A:先检查MySQL服务是否运行,端口是否开放,用telnet 主机IP 3306测试连通性,确认连接字符串中的主机、端口、数据库名正确,最后检查MySQL用户权限,确保允许从当前主机登录。
Q3:Sqoop导入MySQL时出现字符编码错误怎么办?
A:在--connect参数后追加?characterEncoding=UTF-8,例如--connect jdbc:mysql://host:3306/db?characterEncoding=UTF-8,同时确认MySQL数据库和表的编码为utf8mb4,数据文件本身编码一致,避免乱码。
Java代码连接MySQL和Sqoop连接MySQL是两种互补的技术方案,前者适合实时编程操作,后者专攻大数据批量迁移,掌握各自的连接步骤、参数调优和常见问题,就能在实际项目中灵活选型,高效完成数据访问与迁移任务。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/540429.html


