Spring - Tổng quan về khung JDBC

Trong khi làm việc với cơ sở dữ liệu bằng cách sử dụng JDBC cũ, việc viết mã không cần thiết để xử lý các ngoại lệ, mở và đóng các kết nối cơ sở dữ liệu, v.v. Tuy nhiên, Spring JDBC Framework sẽ quản lý tất cả các chi tiết cấp thấp bắt đầu từ việc mở kết nối, chuẩn bị và thực hiện câu lệnh SQL, xử lý các ngoại lệ, xử lý các giao dịch và cuối cùng là đóng kết nối.

Vì vậy, những gì bạn phải làm chỉ là xác định các tham số kết nối và chỉ định câu lệnh SQL được thực thi và thực hiện công việc cần thiết cho mỗi lần lặp trong khi tìm nạp dữ liệu từ cơ sở dữ liệu.

Spring JDBC cung cấp một số cách tiếp cận và các lớp tương ứng khác nhau để giao tiếp với cơ sở dữ liệu. Tôi sẽ sử dụng cách tiếp cận cổ điển và phổ biến nhất sử dụngJdbcTemplatelớp của khuôn khổ. Đây là lớp khung trung tâm quản lý tất cả các giao tiếp cơ sở dữ liệu và xử lý ngoại lệ.

Lớp JdbcTemplate

Lớp JDBC Template thực hiện các truy vấn SQL, cập nhật các câu lệnh, lưu trữ các lệnh gọi thủ tục, thực hiện lặp qua ResultSets và trích xuất các giá trị tham số trả về. Nó cũng bắt các ngoại lệ JDBC và dịch chúng sang cấu trúc phân cấp ngoại lệ chung, nhiều thông tin hơn, được xác định trong gói org.springframework.dao.

Các phiên bản của lớp JdbcTemplateluồng an toàn sau khi được cấu hình. Vì vậy, bạn có thể định cấu hình một phiên bản JdbcTemplate và sau đó đưa tham chiếu được chia sẻ này vào nhiều DAO một cách an toàn.

Một thực tiễn phổ biến khi sử dụng lớp Mẫu JDBC là định cấu hình một DataSource trong tệp cấu hình Spring của bạn, sau đó đưa phụ thuộc vào hạt DataSource được chia sẻ đó vào các lớp DAO của bạn và JdbcTemplate được tạo trong bộ thiết lập cho DataSource.

Định cấu hình nguồn dữ liệu

Hãy để chúng tôi tạo một bảng cơ sở dữ liệu Student trong cơ sở dữ liệu của chúng tôi TEST. Chúng tôi giả sử bạn đang làm việc với cơ sở dữ liệu MySQL, nếu bạn làm việc với bất kỳ cơ sở dữ liệu nào khác thì bạn có thể thay đổi các truy vấn DDL và SQL của mình cho phù hợp.

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

Bây giờ chúng ta cần cung cấp Nguồn dữ liệu cho Mẫu JDBC để nó có thể tự cấu hình để có quyền truy cập cơ sở dữ liệu. Bạn có thể định cấu hình Nguồn dữ liệu trong tệp XML bằng một đoạn mã như được hiển thị trong đoạn mã sau:

<bean id = "dataSource" 
   class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
   <property name = "url" value = "jdbc:mysql://localhost:3306/TEST"/>
   <property name = "username" value = "root"/>
   <property name = "password" value = "password"/>
</bean>

Đối tượng truy cập dữ liệu (DAO)

DAO là viết tắt của Data Access Object, thường được sử dụng để tương tác với cơ sở dữ liệu. Các DAO tồn tại để cung cấp một phương tiện để đọc và ghi dữ liệu vào cơ sở dữ liệu và chúng nên hiển thị chức năng này thông qua một giao diện mà phần còn lại của ứng dụng sẽ truy cập chúng.

Hỗ trợ DAO trong Spring giúp bạn dễ dàng làm việc với các công nghệ truy cập dữ liệu như JDBC, Hibernate, JPA hoặc JDO một cách nhất quán.

Thực thi câu lệnh SQL

Hãy để chúng tôi xem cách chúng tôi có thể thực hiện thao tác CRUD (Tạo, Đọc, Cập nhật và Xóa) trên các bảng cơ sở dữ liệu bằng cách sử dụng đối tượng Mẫu JDBC và SQL.

Querying for an integer

String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );

Querying for a long

String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );

A simple query using a bind variable

String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});

Querying for a String

String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);

Querying and returning an object

String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(
   SQL, new Object[]{10}, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

Querying and returning multiple objects

String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(
   SQL, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

Inserting a row into the table

String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );

Updating a row into the table

String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );

Deleting a row from the table

String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );

Thực thi các câu lệnh DDL

Bạn có thể dùng execute(..)từ jdbcTemplate để thực thi bất kỳ câu lệnh SQL hoặc câu lệnh DDL nào. Sau đây là một ví dụ sử dụng câu lệnh CREATE để tạo bảng:

String SQL = "CREATE TABLE Student( " +
   "ID   INT NOT NULL AUTO_INCREMENT, " +
   "NAME VARCHAR(20) NOT NULL, " +
   "AGE  INT NOT NULL, " +
   "PRIMARY KEY (ID));"

jdbcTemplateObject.execute( SQL );

Ví dụ về khung JDBC mùa xuân

Dựa trên các khái niệm trên, chúng ta hãy kiểm tra một số ví dụ quan trọng sẽ giúp bạn hiểu cách sử dụng JDBC framework trong Spring -

Sr.No. Ví dụ & Mô tả
1 Ví dụ về Spring JDBC

Ví dụ này sẽ giải thích cách viết một ứng dụng Spring dựa trên JDBC đơn giản.

2 Thủ tục lưu trữ SQL trong mùa xuân

Tìm hiểu cách gọi thủ tục được lưu trữ trong SQL khi sử dụng JDBC trong Spring.