Trong kiến trúc Spring, Data Access Object (DAO) đóng vai trò trung gian giúp tách biệt logic nghiệp vụ khỏi các chi tiết tương tác với hệ quản trị cơ sở dữ liệu. Framework này cung cấp nhiều giải pháp khác nhau như HibernateTemplate, Spring Data JPA, hoặc JdbcTemplate. Bài viết này sẽ tập trung vào cách sử dụng JdbcTemplate để xây dựng lớp DAO.
1. Khai báo thư viện
Trước tiên, cần bổ sung dependency Spring JDBC vào file cấu hình Maven (pom.xml):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2. Thiết lập DataSource và JdbcTemplate
Thay vì sử dụng XML truyền thống, ta có thể định nghĩa cấu hình kết nối cơ sở dữ liệu và bean JdbcTemplate thông qua annotation @Configuration:
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/app_db");
ds.setUsername("db_user");
ds.setPassword("secure_pass");
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
3. Định nghĩa Repository Interface
Tạo một interface để quy định các phương thức thao tác dữ liệu cho thực thể Account:
public interface AccountRepository {
Account fetchAccountById(Long accountId);
void saveAccount(Account account);
void editAccount(Account account);
void deleteAccount(Long accountId);
}
4. Triển khai Repository
Xây dựng lớp thực thi interface trên, sử dụng JdbcTemplate để thực thi các truy vấn SQL. Annotation @Repository giúp Spring tự động nhận diện và quản lý bean này.
@Repository
public class AccountRepositoryImpl implements AccountRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Account fetchAccountById(Long accountId) {
String query = "SELECT id, owner_name, email_addr FROM accounts WHERE id = ?";
return jdbcTemplate.queryForObject(query,
(rs, rowNum) -> new Account(rs.getLong("id"), rs.getString("owner_name"), rs.getString("email_addr")),
accountId);
}
@Override
public void saveAccount(Account account) {
String query = "INSERT INTO accounts (owner_name, email_addr) VALUES (?, ?)";
jdbcTemplate.update(query, account.getOwnerName(), account.getEmailAddr());
}
@Override
public void editAccount(Account account) {
String query = "UPDATE accounts SET owner_name = ?, email_addr = ? WHERE id = ?";
jdbcTemplate.update(query, account.getOwnerName(), account.getEmailAddr(), account.getId());
}
@Override
public void deleteAccount(Long accountId) {
String query = "DELETE FROM accounts WHERE id = ?";
jdbcTemplate.update(query, accountId);
}
}
5. Kích hoạt Component Scanning
Đảm bảo Spring có thể quét và khởi tạo các bean DAO. Nếu sử dụng Spring Boot, tính năng này được tự động kích hoạt. Trong trường hợp cấu hình thủ công, có thể thêm annotation @ComponentScan vào lớp cấu hình chính:
@Configuration
@ComponentScan(basePackages = "com.example.app.dao")
public class AppConfig {
// Cấu hình bổ sung nếu cần
}
6. Tích hợp DAO vào tầng dịch vụ
Tại các lớp Service, sử dụng @Autowired để Inject DAO và gọi các phương thức xử lý dữ liệu:
@Service
public class AccountService {
@Autowired
private AccountRepository accountRepository;
public Account getAccountDetails(Long id) {
return accountRepository.fetchAccountById(id);
}
public void registerNewAccount(Account account) {
accountRepository.saveAccount(account);
}
// Các phương thức nghiệp vụ khác
}