JDBC là một application interface trong ngôn ngữ Java được sử dụng để quy định cách các chương trình khách hàng truy cập vào cơ sở dữ liệu, cung cấp các phương thức để thêm, xóa, sửa và truy vấn cơ sở dữ liệu.
Ví dụ cơ bản về JDBC
Các bước làm việc cơ bản của JDBC như sau:
Tạo lớp thực thể (entity class).
Khai báo interface DAO cho việc đọc và ghi vào cơ sở dữ liệu. Việc định nghĩa DAO giúp tách biệt tầng dịch vụ (service layer) và tầng dữ liệu (data layer), khi sử dụng DAO, chỉ cần quan tâm đến các phương thức đọc và ghi được công khai, không cần quan tâm đến cách thức lưu trữ dưới tầng dữ liệu. Điều này giúp dễ dàng thay thế cách thức lưu trữ.
Tạo một lớp thực thi của interface DAO, sử dụng JDBC Template của Spring để thực hiện các phương thức.
Cuối cùng, định nghĩa một bean của lớp thực thi DAO và tiêm cấp nguồn dữ liệu vào.
Giả sử chúng ta muốn truy cập vào một bảng dữ liệu MySQL user thông qua Spring + JDBC, cấu trúc dữ liệu của bảng user như sau:
Định nghĩa thực thể
Định nghĩa interface DAO
Định nghĩa lớp thực thi DAO
Bằng cách sử dụng JdbcTemplate để thực hiện các câu lệnh SQL tương ứng với nguồn dữ liệu, chúng ta có thể hoàn thành các tác vụ truy cập cơ sở dữ liệu.
Lớp kiểm thử
Spring Boot JDBC
Thêm dependency của Spring Boot
Bạn có thể tạo một dự án Spring Boot bằng cách chọn các thành phần bạn cần trên trang Spring Initializr. Hoặc bạn có thể thêm các dependency cần thiết trực tiếp vào file pom.xml:
Cấu hình nguồn dữ liệu
Sau khi thêm dependency, bạn cần cấu hình nguồn dữ liệu trong file application.properties hoặc application.yml.
Dưới đây là một ví dụ cấu hình nguồn dữ liệu cơ bản:
Hãy thay thế url, username, password bằng thông tin tương ứng của bạn.
Kiểm tra
Sau khi chạy phương thức main, console sẽ hiển thị nội dung sau, cho thấy kết nối tới nguồn dữ liệu thành công:
spring-boot-starter-data-jdbc sử dụng spring-jdbc để cung cấp các tính năng JDBC.
Thêm các phụ thuộc Spring
Thêm các phụ thuộc cần thiết vào file pom.xml:
Cấu hình nguồn dữ liệu dựa trên JDBC Driver
Dưới đây là một ví dụ cấu hình nguồn dữ liệu JDBC cho mysql:
Kiểm tra
JdbcTemplate API
Spring trích xuất mã mẫu truy cập dữ liệu vào các lớp mẫu. Spring cung cấp 3 lớp mẫu JDBC:
JdbcTemplate: Lớp mẫu JDBC cơ bản nhất của Spring, lớp mẫu này hỗ trợ các chức năng truy cập cơ sở dữ liệu JDBC đơn giản nhất và truy vấn tham số chỉ mục đơn giản.
SimpleJdbcTemplate: Lớp mẫu này sử dụng một số tính năng của Java 5 như tự động đóng gói, kiểu chung và danh sách tham số biến để đơn giản hóa việc sử dụng lớp mẫu JDBC.
NamedParameterJdbcTemplate: Khi thực hiện truy vấn bằng lớp mẫu này, bạn có thể ràng buộc các giá trị truy vấn vào SQL bằng tham số có tên thay vì sử dụng chỉ mục tham số đơn giản.
API cốt lõi nhất định của spring-jdbc chính là JdbcTemplate, có thể nói rằng hầu hết các truy cập cơ sở dữ liệu JDBC đều xoay quanh lớp này. Spring đã đóng gói sâu lớp truy cập cơ sở dữ liệu vào lớp JdbcTemplate bằng cách sử dụng Dependency Injection để cấu hình nguồn dữ liệu và sau đó JdbcTemplate chịu trách nhiệm cho việc truy cập dữ liệu cụ thể.
JdbcTemplate chủ yếu cung cấp các phương thức sau:
Phương thức execute: Có thể sử dụng để thực thi bất kỳ câu lệnh SQL nào, thường được sử dụng để thực thi các câu lệnh DDL.
Phương thức update và batchUpdate: Phương thức update được sử dụng để thực hiện các câu lệnh thêm, sửa, xóa; phương thức batchUpdate được sử dụng để thực hiện các câu lệnh xử lý hàng loạt.
Phương thức query và queryForXXX: Được sử dụng để thực hiện các câu lệnh truy vấn.
Phương thức call: Được sử dụng để thực hiện các câu lệnh liên quan đến stored procedure, function.
Để thuận tiện cho việc trình bày, các hoạt động thêm, sửa, xóa và truy vấn dưới đây đều xoay quanh một bảng có tên là user (cột id là khóa chính tự tăng) và thực thể dữ liệu của bảng như sau:
Thực thể dữ liệu chỉ cần là một Java Bean thuần túy, không cần bất kỳ annotation nào.
Phương thức execute
Sử dụng phương thức execute để thực thi câu lệnh DDL, tạo một cơ sở dữ liệu có tên là test và sau đó tạo một bảng có tên là user trong cơ sở dữ liệu này.
Phương thức update
Thêm dữ liệu
Xóa dữ liệu
Sửa dữ liệu
Xử lý hàng loạt
Phương thức query
Truy vấn đối tượng duy nhất
Truy vấn nhiều đối tượng
Lấy giá trị duy nhất của một cột hoặc các hàm như count, avg, sum
Cấu hình SpringBoot JDBC
Lớp JdbcTemplateAutoConfiguration
JdbcTemplateAutoConfiguration là lớp tự động cấu hình cho JdbcTemplate, nó có nhiệm vụ khởi tạo JdbcTemplate.
Giải thích mã nguồn của lớp JdbcTemplateAutoConfiguration:
@AutoConfigureAfter(DataSourceAutoConfiguration.class) chỉ định rằng JdbcTemplateAutoConfiguration phải chạy sau khi DataSourceAutoConfiguration hoàn thành, điều này có nghĩa là việc khởi tạo JdbcTemplate phải xảy ra sau khi DataSource được khởi tạo.
JdbcProperties là lớp cấu hình cho JdbcTemplateAutoConfiguration, cho phép người dùng điều chỉnh cách khởi tạo JdbcTemplate bằng cách thiết lập các tùy chọn.
@Import({ JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class }) chỉ định rằng cần import hai lớp cấu hình JdbcTemplateConfiguration và NamedParameterJdbcTemplateConfiguration, công việc cụ thể của việc khởi tạo JdbcTemplate cũng được thực hiện trong hai lớp cấu hình này.
Lớp JdbcTemplateConfiguration
Mã nguồn của lớp JdbcTemplateConfiguration như sau:
Giải thích mã nguồn của lớp JdbcTemplateConfiguration: Trong JdbcTemplateConfiguration, JdbcTemplate được khởi tạo dựa trên DataSource và JdbcProperties.
Lớp NamedParameterJdbcTemplateConfiguration
Mã nguồn của lớp NamedParameterJdbcTemplateConfiguration như sau:
Giải thích mã nguồn của lớp NamedParameterJdbcTemplateConfiguration: Trong NamedParameterJdbcTemplateConfiguration, NamedParameterJdbcTemplate được khởi tạo dựa trên JdbcTemplate.
spring-data-jdbc
Dự án Spring Data bao gồm hỗ trợ lưu trữ JDBC và tự động tạo SQL cho các phương thức trên CrudRepository. Đối với các truy vấn phức tạp hơn, nó cung cấp annotation @Query.
Khi các phụ thuộc cần thiết tồn tại trên classpath, Spring Boot sẽ tự động cấu hình lưu trữ JDBC của Spring Data. Chúng có thể được thêm vào dự án thông qua một phụ thuộc duy nhất spring-boot-starter-data-jdbc. Nếu cần thiết, bạn có thể điều khiển cấu hình Spring Data JDBC bằng cách thêm annotation @EnableJdbcRepositories hoặc một lớp con của JdbcConfiguration vào ứng dụng.
Để biết thêm chi tiết về Spring Data JDBC, bạn có thể tham khảo Spring Data JDBC.