post-image

Spring Boot – Database Handling

Spring Boot Starters & Common Configurations

Spring Boot hỗ trợ rất tốt để tạo DataSource cho Database. Chúng ta không cần viết thêm bất kỳ dòng code nào để tạo DataSource trong Spring Boot. Chỉ cần thêm các dependencies và thực hiện cấu hình chi tiết để tạo DataSource và kết nối với Database.

Trong bài hôm nay, chúng ta sẽ sử dụng Spring Boot JDBC để kết nối cơ sở dữ liệu.

Đầu tiên, chúng ta cần thêm phần dependency Spring Boot Starter JDBC vào file cấu hình configuration của dự án của chúng ta.

Người sử dụng Maven có thể thêm các phần dependencies sau vào file pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>Code language: HTML, XML (xml)

Người sử dụng Gradle có thể thêm các phần dependencies sau vào file build.gradle.

compile('org.springframework.boot:spring-boot-starter-jdbc')Code language: JavaScript (javascript)

Connect to H2 database

Để kết nối H2 database, chúng ta cần thêm phần dependencies H2 database vào file configuration của chúng ta.

Người sử dụng Maven có thể thêm các phần dependencies sau vào tệp pom.xml.

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
</dependency>Code language: HTML, XML (xml)

Người sử dụng Gradle có thể thêm các phần dependencies sau vào file build.gradle.

compile('com.h2database:h2')Code language: JavaScript (javascript)

Chúng ta cần tạo file schema.sql và file data.sql trong thư mục classpath src/main/resources để kết nối H2 database.

File schema.sql được cung cấp bên dưới.

CREATE TABLE PRODUCT (ID INT PRIMARY KEY, PRODUCT_NAME VARCHAR(25));

File data.sql được cung cấp bên dưới.

INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (1,'Honey');
INSERT INTO PRODUCT (ID,PRODUCT_NAME) VALUES (2,'Almond');Code language: JavaScript (javascript)

Connect MySQL

Để kết nối với MySQL, chúng ta cần thêm dependency của MySQL vào file configuration của chúng ta.

Người sử dụng Maven có thể thêm các phần dependencies sau vào tệp pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>Code language: HTML, XML (xml)

Người sử dụng Gradle có thể thêm các phần dependencies sau vào file build.gradle.

compile('mysql:mysql-connector-java')Code language: JavaScript (javascript)

Bây giờ, tạo cơ sở dữ liệu và bảng trong MySQL:

Database and Tables in MySQL

Đối với người dùng file properties, hãy thêm các properties sau vào file application.properties.

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000Code language: JavaScript (javascript)

Đối với người dùng YAML, hãy thêm các properties sau vào tệp application.yml.

<pre class="wp-block-syntaxhighlighter-code">spring:
   datasource: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
      username: "root"
      password: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1
      max-active: 15
      max-idle: 10
      max-wait: 8000</pre>Code language: JavaScript (javascript)

Connect Redis

Redis là gì? – Redis (REmote DIctionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker.

Để kết nối cơ sở dữ liệu Redis trong Spring Boot, chúng ta cần thêm dependency Redis vào file configuration của mình.

Người sử dụng Maven có thể thêm các phần dependencies sau vào tệp pom.xml.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-redis</artifactId>
</dependency>Code language: HTML, XML (xml)

Người sử dụng Gradle có thể thêm các phần dependencies sau vào file build.gradle.

compile('org.springframework.boot:spring-boot-starter-data-redis')Code language: JavaScript (javascript)

Đối với kết nối Redis, chúng ta cần sử dụng RedisTemplate. Đối với RedisTemplate chúng ta cần cung cấp thông tin chi tiết về JedisConnectionFactory.

@Bean
JedisConnectionFactory jedisConnectionFactory() {
   JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
   jedisConFactory.setHostName("localhost");
   jedisConFactory.setPort(6000);
   jedisConFactory.setUsePool(true);
   return jedisConFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
   RedisTemplate<String, Object> template = new RedisTemplate<>();
   template.setConnectionFactory(jedisConnectionFactory());
   template.setKeySerializer(new StringRedisSerializer());
   template.setHashKeySerializer(new StringRedisSerializer());
   template.setHashValueSerializer(new StringRedisSerializer());
   template.setValueSerializer(new StringRedisSerializer());
   return template;
}Code language: JavaScript (javascript)

Bây giờ thêm @Autowired vào class RedisTemplate và truy cập data từ Redis database.

@Autowired

RedisTemplate<String, Object> redis;
Map<Object,Object> datalist = redis.opsForHash().entries(“Redis_code_index_key”);Code language: JavaScript (javascript)

JDBCTemplate

Để truy cập Relational Database bằng cách sử dụng JdbcTemplate trong ứng dụng Spring Boot, chúng ta cần thêm các dependency Spring Boot Starter JDBC vào file cấu hình configuration.

Sau đó, nếu thêm @Autowired vào class JdbcTemplate, Spring Boot sẽ tự động kết nối tới Database và cài đặt DataSource cho object JdbcTemplate.

@Autowired
JdbcTemplate jdbcTemplate;
Collection<Map<String, Object>> rows = jdbc.queryForList("SELECT QUERY");Code language: JavaScript (javascript)

Annotation @Repository phải được thêm vào class repository. Annotation @Repository được sử dụng để tạo kho cơ sở dữ liệu cho ứng dụng Spring Boot.

@Repository
public class ProductServiceDAO {
}Code language: PHP (php)

Multiple DataSource

Chúng ta có thể giữ số ‘n’ DataSource trong 1 ứng dụng Spring Boot duy nhất. Ví dụ được đưa ra dưới đây cho thấy cách tạo nhiều hơn 1 DataSource trong ứng dụng Spring Boot. Bây giờ, hãy thêm 2 DataSource cấu hình chi tiết vào file properties của ứng dụng.

Đối với người sử dụng file properties, hãy thêm các properties sau vào file application.properties của bạn.

spring.dbProductService.driverClassName = com.mysql.jdbc.Driver
spring.dbProductService.url = jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect = true
spring.dbProductService.username = root
spring.dbProductService.password = root
spring.dbProductService.testOnBorrow = true
spring.dbProductService.testWhileIdle = true
spring.dbProductService.timeBetweenEvictionRunsMillis = 60000
spring.dbProductService.minEvictableIdleTimeMillis = 30000
spring.dbProductService.validationQuery = SELECT 1
spring.dbProductService.max-active = 15
spring.dbProductService.max-idle = 10
spring.dbProductService.max-wait = 8000

spring.dbUserService.driverClassName = com.mysql.jdbc.Driver
spring.dbUserService.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect = true
spring.dbUserService.username = root
spring.dbUserService.password = root
spring.dbUserService.testOnBorrow = true
spring.dbUserService.testWhileIdle = true
spring.dbUserService.timeBetweenEvictionRunsMillis = 60000
spring.dbUserService.minEvictableIdleTimeMillis = 30000
spring.dbUserService.validationQuery = SELECT 1
spring.dbUserService.max-active = 15
spring.dbUserService.max-idle = 10
spring.dbUserService.max-wait = 8000Code language: JavaScript (javascript)

Người sử dụng Yaml nên thêm các properties sau vào tệp application.yml của bạn.

spring:
   dbProductService: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/PRODUCTSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1
      max-active: 15
      max-idle: 10
      max-wait: 8000
   dbUserService: 
      driverClassName: com.mysql.jdbc.Driver
      url: "jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true"
      password: "root"
      username: "root"
      testOnBorrow: true
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 30000
      validationQuery: SELECT 1    
      max-active: 15
      max-idle: 10
      max-wait: 8000Code language: JavaScript (javascript)

Bây giờ, hãy tạo 1 class Configuration để tạo 1 DataSource và JdbcTemplate cho nhiều DataSource.

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class DatabaseConfig {
   @Bean(name = "dbProductService")
   @ConfigurationProperties(prefix = "spring.dbProductService")
   @Primary
   public DataSource createProductServiceDataSource() {
      return DataSourceBuilder.create().build();
   }
   @Bean(name = "dbUserService")
   @ConfigurationProperties(prefix = "spring.dbUserService")
   public DataSource createUserServiceDataSource() {
      return DataSourceBuilder.create().build();
   }
   @Bean(name = "jdbcProductService")
   @Autowired
   public JdbcTemplate createJdbcTemplate_ProductService(@Qualifier("dbProductService") DataSource productServiceDS) {
      return new JdbcTemplate(productServiceDS);
   }
   @Bean(name = "jdbcUserService")
   @Autowired
   public JdbcTemplate createJdbcTemplate_UserService(@Qualifier("dbUserService") DataSource userServiceDS) {
      return new JdbcTemplate(userServiceDS);
   }
}Code language: CSS (css)

Sau đó tự động inject đối tượng JDBCTemplate bằng cách sử dụng annotation @Qualifier.

@Qualifier("jdbcProductService")
@Autowired
JdbcTemplate jdbcTemplate;

@Qualifier("jdbcUserService")
@Autowired
JdbcTemplate jdbcTemplate;Code language: CSS (css)

Bài viết tham khảo từ nguồn:

https://www.tutorialspoint.com/spring_boot/spring_boot_database_handling.htm

Leave a Reply

Your email address will not be published. Required fields are marked *