上一篇
最新动态:截至2025年8月,随着Java 21的进一步普及,JDBC和ORM框架在数据库操作性能上均有显著优化,尤其在批量数据导出场景下,吞吐量平均提升约15%,开发者现在能更高效地处理大规模表数据导出任务。
在实际开发中,我们经常遇到这些需求:
下面介绍三种Java实现方案,从原生JDBC到主流框架的完整代码示例。
最基础的方式,适合所有Java环境:
public class JdbcTableExporter { public static void exportToCSV(String tableName, String outputPath) { String url = "jdbc:mysql://localhost:3306/your_db"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName); FileWriter writer = new FileWriter(outputPath)) { // 写入列头 ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { writer.append(metaData.getColumnName(i)); if (i < columnCount) writer.append(","); } writer.append("\n"); // 写入数据行 while (rs.next()) { for (int i = 1; i <= columnCount; i++) { writer.append(rs.getString(i)); if (i < columnCount) writer.append(","); } writer.append("\n"); } System.out.println("导出完成:" + outputPath); } catch (Exception e) { e.printStackTrace(); } } }
关键点说明:
ResultSetMetaData
动态获取表结构 LIMIT offset, size
) 需要先添加依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.10.0</version> </dependency>
改进后的实现:
public void exportWithCommonsCSV(String tableName, String outputPath) throws SQLException, IOException { try (Connection conn = dataSource.getConnection(); ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName)) { CSVPrinter printer = new CSVPrinter( new FileWriter(outputPath), CSVFormat.DEFAULT.withHeader(rs) ); printer.printRecords(rs); // 自动处理数据类型转换 printer.flush(); } }
优势:
适合已集成Spring的项目:
@Repository public interface UserRepository extends JpaRepository<User, Long> { // 默认已提供findAll() } @Service public class ExportService { @Autowired private UserRepository userRepo; public void exportToJson(String path) throws IOException { List<User> users = userRepo.findAll(); new ObjectMapper() .writerWithDefaultPrettyPrinter() .writeValue(new File(path), users); } }
扩展技巧:
@Query
自定义导出字段 Page<User> page = userRepo.findAll(PageRequest.of(0, 1000)); while (page.hasNext()) { // 处理当前页数据 page = userRepo.findAll(page.nextPageable()); }
内存控制
Statement.setFetchSize(1000)
减少内存占用 格式选择
| 格式 | 优点 | 缺点 |
|--------|-----------------------|-------------------|
| CSV | 通用性强,体积小 | 无数据类型标记 |
| JSON | 结构清晰 | 体积较大 |
| Excel | 可直接查看 | 依赖POI等库 |
异常处理
@Transactional(timeout = 30)
根据项目需求选择合适方案:
最新测试表明,在导出10万行数据时:
建议在正式环境先进行小规模测试,确保数据完整性和性能达标。
本文由 撒鹍 于2025-08-02发表在【云服务器提供商】,文中图片由(撒鹍)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/516417.html
发表评论