文件存储(适合小型数据或配置)
文本文件(如TXT、CSV)
import java.io.FileWriter; import java.io.IOException; public class FileStorage { public static void saveToFile(String data, String filePath) { try (FileWriter writer = new FileWriter(filePath, true)) { // true表示追加模式 writer.write(data + "n"); // 写入数据并换行 } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { saveToFile("用户登录:2025-10-01", "log.txt"); } }
- 优点:简单直接,无需外部依赖。
- 缺点:并发读写需手动加锁,大文件效率低。
- 场景:日志记录、配置文件。
数据库存储(结构化数据首选)
JDBC操作MySQL
import java.sql.*; public class DatabaseStorage { public static void saveUser(String name, String email) { String url = "jdbc:mysql://localhost:3306/mydb"; String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(url, "user", "pass"); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, name); // 防SQL注入 stmt.setString(2, email); stmt.executeUpdate(); // 执行插入 } catch (SQLException e) { e.printStackTrace(); } } }
- 关键点:
- 使用
PreparedStatement
防止SQL注入。 - 连接池推荐(如HikariCP)提升性能。
- 使用
- 场景:用户信息、订单等结构化数据。
ORM框架(Hibernate/JPA)
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; // Getter/Setter省略 } // 保存操作 User user = new User(); user.setName("张三"); user.setEmail("zhangsan@example.com"); entityManager.persist(user); // 自动生成SQL并执行
- 优点:对象化操作,减少手动SQL。
- 工具推荐:Spring Data JPA、MyBatis。
序列化(Java对象持久化)
import java.io.*; public class SerializationDemo { public static void serialize(Object obj, String filePath) { try (ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(filePath))) { oos.writeObject(obj); // 对象转二进制 } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { User user = new User("李四", "lisi@example.com"); serialize(user, "user.dat"); } }
- 注意:
- 类需实现
Serializable
接口。 - 版本号
serialVersionUID
需显式声明避免兼容问题。
- 类需实现
- 场景:缓存对象、进程间传输。
键值存储(高性能缓存/会话数据)
Redis示例(使用Jedis)
import redis.clients.jedis.Jedis; public class RedisStorage { public static void saveSession(String userId, String sessionData) { try (Jedis jedis = new Jedis("localhost", 6379)) { jedis.setex("session:" + userId, 3600, sessionData); // 设置1小时过期 } } }
- 优势:内存级读写(微秒级响应),支持过期策略。
- 场景:用户会话、热点数据缓存。
- 工具延伸:Spring Cache + Redis注解化集成。
云存储与NoSQL(海量数据/灵活结构)
MongoDB文档存储
// Spring Data MongoDB示例 @Document(collection = "products") public class Product { @Id private String id; private String name; private double price; } public interface ProductRepository extends MongoRepository<Product, String> {} // 保存数据 Product product = new Product("手机", 3999.0); productRepository.save(product);
- 适用场景:JSON文档、物联网数据、内容管理系统。
对象存储(阿里云OSS/MinIO)
// 阿里云OSS SDK示例 InputStream stream = new FileInputStream("photo.jpg"); OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey); ossClient.putObject("my-bucket", "user_photos/001.jpg", stream); ossClient.shutdown();
- 场景:图片、视频等二进制文件。
安全与性能最佳实践
- 加密敏感数据
- 使用
AES
或RSA
加密存储(如Jasypt库集成)。
- 使用
- 防注入攻击
- SQL:永远用
PreparedStatement
。 - NoSQL:过滤特殊字符(如、)。
- SQL:永远用
- 并发控制
- 文件:
java.nio.channels.FileLock
。 - 数据库:事务隔离级别(如
@Transactional
)。
- 文件:
- 备份机制
- 数据库:定时快照(RDS自动备份)。
- 文件:增量同步到云存储。
如何选择存储方案?
需求类型 | 推荐方案 | 案例 |
---|---|---|
小规模配置/日志 | 文本/Properties文件 | 应用配置 |
结构化业务数据 | MySQL/PostgreSQL + JDBC | 用户管理系统 |
高并发读缓存 | Redis/Memcached | 购物车会话 |
海量非结构化数据 | MongoDB/Cassandra | 商品评论 |
二进制大文件 | 云存储(OSS/S3) | 用户上传图片 |
引用说明:本文代码示例基于JDK 17、MySQL 8.0官方驱动、Spring Data 3.0及阿里云OSS SDK编写,安全实践参考OWASP Java安全指南,技术选型建议参考各数据库2025年性能基准测试报告[1][2]。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/15531.html