数据访问 API 参考
数据访问模块的 API 参考文档。
DataSource
DataSourceBuilder
数据源构建器。
java
DataSource dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/db")
.username("root")
.password("password")
.maxPoolSize(20)
.minPoolSize(5)
.build();方法:
url(String): 设置数据库 URLusername(String): 设置用户名password(String): 设置密码driverClassName(String): 设置驱动类名maxPoolSize(int): 设置最大连接数minPoolSize(int): 设置最小连接数maxWait(long): 设置最大等待时间testQuery(String): 设置测试查询build(): 构建数据源
JdbcTemplate
JDBC 操作模板类。
java
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);查询操作
java
// 查询单个对象
User user = jdbcTemplate.queryForObject(
"SELECT * FROM users WHERE id = ?",
User.class,
1L
);
// 查询列表
List<User> users = jdbcTemplate.queryForList(
"SELECT * FROM users",
User.class
);
// 查询单个值
int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM users");
long total = jdbcTemplate.queryForLong("SELECT COUNT(*) FROM users");
String name = jdbcTemplate.queryForString("SELECT name FROM users WHERE id = ?", 1L);
// 查询 Optional
Optional<User> optUser = jdbcTemplate.queryForOptional(
"SELECT * FROM users WHERE id = ?",
User.class,
1L
);方法:
queryForObject(String, Class<T>, Object...): 查询单个对象queryForList(String, Class<T>, Object...): 查询列表queryForInt(String, Object...): 查询整数queryForLong(String, Object...): 查询长整数queryForString(String, Object...): 查询字符串queryForOptional(String, Class<T>, Object...): 查询 Optional
更新操作
java
// 插入
Long id = jdbcTemplate.insert(
"INSERT INTO users (name, email) VALUES (?, ?)",
"John",
"john@example.com"
);
// 更新
int rows = jdbcTemplate.update(
"UPDATE users SET name = ? WHERE id = ?",
"Jane",
1L
);
// 删除
int rows = jdbcTemplate.update(
"DELETE FROM users WHERE id = ?",
1L
);方法:
insert(String, Object...): 插入并返回自增 IDupdate(String, Object...): 更新/删除,返回影响行数
批处理
java
// 批量插入
List<Object[]> batchArgs = List.of(
new Object[]{"John", "john@example.com"},
new Object[]{"Jane", "jane@example.com"}
);
int[] rows = jdbcTemplate.batchUpdate(
"INSERT INTO users (name, email) VALUES (?, ?)",
batchArgs
);
// 批量更新(带回调)
jdbcTemplate.batchUpdate(
"INSERT INTO users (name, email) VALUES (?, ?)",
users,
100,
(ps, user) -> {
ps.setString(1, user.getName());
ps.setString(2, user.getEmail());
}
);方法:
batchUpdate(String, List<Object[]>): 批量更新batchUpdate(String, List<T>, int, BiConsumer): 批量更新(带回调)
事务管理
@Transactional
声明式事务注解。
java
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
// 事务操作
}
@Transactional(
propagation = Propagation.REQUIRES_NEW,
isolation = Isolation.READ_COMMITTED,
rollbackFor = Exception.class
)
public void complexOperation() {
// 复杂事务操作
}参数:
propagation: 事务传播行为REQUIRED: 默认,如果存在事务则加入,否则创建新事务REQUIRES_NEW: 创建新事务,挂起当前事务NESTED: 嵌套事务SUPPORTS: 支持事务,如果存在则加入NOT_SUPPORTED: 不支持事务,挂起当前事务NEVER: 不允许事务,如果存在则抛异常MANDATORY: 必须在事务中,否则抛异常
isolation: 事务隔离级别DEFAULT: 使用数据库默认隔离级别READ_UNCOMMITTED: 读未提交READ_COMMITTED: 读已提交REPEATABLE_READ: 可重复读SERIALIZABLE: 串行化
readOnly: 是否只读事务,默认 falserollbackFor: 回滚异常类型noRollbackFor: 不回滚异常类型
TransactionTemplate
编程式事务模板。
java
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
// 执行事务
transactionTemplate.execute(status -> {
try {
// 业务逻辑
userRepository.save(user);
orderRepository.save(order);
return true;
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});方法:
execute(TransactionCallback): 执行事务executeWithoutResult(Consumer<TransactionStatus>): 执行无返回值事务
TransactionManager
事务管理器。
java
TransactionManager transactionManager = new TransactionManager(dataSource);
// 开启事务
transactionManager.begin();
try {
// 业务逻辑
userRepository.save(user);
// 提交事务
transactionManager.commit();
} catch (Exception e) {
// 回滚事务
transactionManager.rollback();
throw e;
}方法:
begin(): 开启事务commit(): 提交事务rollback(): 回滚事务getConnection(): 获取当前事务连接
RowMapper
结果集映射器。
java
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
}
// 使用
List<User> users = jdbcTemplate.query(
"SELECT * FROM users",
new UserRowMapper()
);