[Spring boot + spring data] Viết một ứng dụng nhỏ sử dụng spring boot + spring data jdbc

Bài viết này sẽ hướng dẫn các bạn từng bước xây dựng một ứng dụng java sử dụng spring boot kết hợp với spring data jdbc để lưu trữ và nhận dữ liệu trong cơ sở dữ liệu quan hệ.

A. Đầu ra

Một ứng dụng nhỏ lưu trữ và truy xuất dữ liệu Account trong cơ sở dữ liệu

B. Đầu vào

  • Jdk 1.8
  • Maven 3.2+
  • IDE tùy ý (MÌnh dùng netbean, các bạn có thể import luôn cái file pom vào cũng được)

C. Các bước thực hiện

1. Cấu trúc thư mục

2. File pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <groupId>com.vnpt.ssdc.springdata</groupId>
    <artifactId>spring_jdbc_repository</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_jdbc_repository</name>
    <description>Demo project for Spring JDBC with Repository</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>2.1.4.RELEASE</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jdbc</artifactId>
            <version>1.0.4.RELEASE</version>
            <type>jar</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3. Xây dựng đối tượng Account

public class Account {

    @Id
    private Long id;
    private String userName;
    private String password;

    public Account() {
    }

    public Account(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

Lưu ý, để có thể sử dụng được spring data jdbc, entity của chúng ta phải có một trường được map với annotation ID nhằm định dạnh một đối tượng, ở đây ta sẽ dùng trường Id.

Một lưu ý nữa cho quy tắc đặt tên các trường. Spring sẽ tự đống scan object để tìm ra tên cột tương ứng với trường đó. Ví dụ: Account có một trường là username thì cột tương ứng trong cơ sở dữ liệu của trường này là USERNAME. Nếu ta đặt tên trường là userName tức là sử dụng theo kiểu camelCase thì tên cột tương ứng trong cơ sở dữ liệu của trường này là USER_NAME.

4. AccountRepository

public interface AccountRepository extends CrudRepository<Account, Long> {

}

Nhìn rất đơn giản đúng không ạ. Spring cung cấp sẵn các interface Repository chứa các chức năng nhất định Ví dụ:

  • CrudRepository chứa sẵn các function CRUD thao tác trên object entity.
  • PagingAndSortingRepository extends từ CrudRepository nhưng thêm tính năng phân trang

Ở đât chúng sẽ dùng luôn CrudRepository để sử dụng lại hàm save và hàm findAll đã được viết sẵn.

5. Account controller

Để đơn giản, minh xây dựng một lớp account controller tự thực hiện các thao tác insert dữ liệu, fetch dữ liệu hiển thị ra màn hình console thay cho việc sử dụng giao diện web

    @Autowired
    AccountDaoManager accountService;

    public void run() {
        Account acc = new Account("soithattha", "123456");
        accountService.addAccount(acc);
        logger.info("Add account " + new Gson().toJson(acc));

        acc = new Account("hungdd", "123456");
        accountService.addAccount(acc);
        logger.info("Add account " + new Gson().toJson(acc));

        logger.info("fetchAll:");
        List<Account> accounts = accountService.fetchAll();
        accounts.forEach(s -> System.out.println(new Gson().toJson(s)));

    }

6. App Runner

AppRunner là một đống tượng cài đặt interface CommandLineRunner của springboot, tác dụng duy nhất của nó ở đây là sẽ class này sẽ được run sau khi ứng dụng kết thúc việc khởi tạo các bean.

    @Autowired
    private AccountController controller;

    @Override
    public void run(String... args) throws Exception {
        controller.run();
    }

7. Demo

8. Full source

https://bit.ly/2MW3TEr

Ps: Bác nào thắc mắc gì cứ comment ở dưới nhé, rất sẵn lòng giải đáp