上一篇
在Java中保存数据库操作通常使用JDBC或ORM框架(如Hibernate),通过创建数据库连接、构造SQL语句、执行插入/更新操作并处理事务,最后关闭连接确保数据持久化。
原生JDBC操作(基础)
这是最底层的数据库操作方式,适合学习原理或简单场景:
// 1. 加载驱动(JDBC 4.0+ 可省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接(try-with-resources自动关闭)
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC",
"user",
"password");
// 3. 创建PreparedStatement防SQL注入
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO users(name,email) VALUES(?,?)")) {
// 4. 设置参数
pstmt.setString(1, "张三");
pstmt.setString(2, "zhangsan@example.com");
// 5. 执行更新
int rows = pstmt.executeUpdate();
System.out.println("插入行数: " + rows);
} catch (SQLException e) {
// 6. 异常处理(实际项目需细化)
e.printStackTrace();
}
关键要点:
- 使用
PreparedStatement而非Statement防止SQL注入 try-with-resources确保自动关闭连接(JDK7+特性)- MySQL 8.x驱动包名为
com.mysql.cj.jdbc.Driver
Spring JDBC Template(轻量级封装)
Spring框架对JDBC的简化方案:
@Autowired
private JdbcTemplate jdbcTemplate; // 依赖注入
public void saveUser(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getEmail());
// 获取自增ID(MySQL示例)
Long id = jdbcTemplate.queryForObject("SELECT LAST_INSERT_ID()", Long.class);
user.setId(id);
}
优势:
- 自动管理连接释放
- 简化异常处理(将检查异常转为运行时异常)
- 支持命名参数
NamedParameterJdbcTemplate
Hibernate(全自动ORM)
实现对象到数据库的自动映射:

@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters/setters
}
// 保存操作
try (Session session = HibernateUtil.getSessionFactory().openSession()) {
Transaction tx = session.beginTransaction();
User newUser = new User("李四", "lisi@example.com");
session.save(newUser); // 核心保存方法
tx.commit();
}
特性:
- 自动生成SQL语句
- 一级/二级缓存优化
- 支持HQL面向对象查询
MyBatis(半自动ORM)
SQL灵活可控的持久层框架:
<!-- Mapper XML -->
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(name, email)
VALUES(#{name}, #{email})
</insert>
// Java调用
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User("王五", "wangwu@example.com");
mapper.insertUser(user); // 插入后自增ID自动填充到user.id
session.commit();
}
适用场景:
- 需要精细控制SQL语句
- 复杂查询或存储过程调用
- 遗留数据库表结构复杂
Spring Data JPA(终极简化)
基于JPA规范的快速开发方案:

public interface UserRepository extends JpaRepository<User, Long> {
// 自动实现基础CRUD
}
@Service
public class UserService {
@Autowired
private UserRepository repository;
@Transactional // 注解管理事务
public User createUser(String name, String email) {
User user = new User(name, email);
return repository.save(user); // 单行保存操作
}
}
核心优势:
- 方法名自动生成查询(如
findByEmail(String email)) - 分页/排序内置支持
- 整合Hibernate实现
最佳实践建议
-
连接池必用
// HikariCP示例(当前性能最优) HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost/test"); config.setUsername("user"); config.setPassword("password"); HikariDataSource ds = new HikariDataSource(config); -
事务管理原则
- 使用
@Transactional注解声明事务边界 - 避免在事务中执行远程调用等耗时操作
- 使用
-
SQL注入防御

- 始终用预编译语句(PreparedStatement)
- 禁止拼接SQL字符串
-
性能优化
- 批量操作:JDBC的
addBatch()/executeBatch() - JPA的
hibernate.jdbc.batch_size配置 - 合理使用二级缓存
- 批量操作:JDBC的
技术选型参考
| 场景 | 推荐方案 |
|---|---|
| 小型项目/学习用途 | JDBC或Spring JDBC |
| 需要高度SQL控制 | MyBatis |
| 快速开发CRUD应用 | Spring Data JPA |
| 复杂领域模型 | Hibernate |
权威引用:
- Oracle官方JDBC教程
- Spring Data JPA文档
- MyBatis官方指南
- Hibernate用户手册
通过合理选择技术方案,结合连接池、事务管理等最佳实践,可构建高效可靠的数据库存储层,建议新项目优先考虑Spring Data JPA+连接池方案,平衡效率与维护成本。
