Quản lý truy cập dữ liệu với DAO và JdbcTemplate trong Spring

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
}

Thẻ: Spring Framework JdbcTemplate DAO Pattern Spring JDBC Java

Đăng vào ngày 14 tháng 9 lúc 09:48