Khởi động mùa xuân với SQLite

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ đi qua các bước để sử dụng cơ sở dữ liệu SQLite trong ứng dụng Spring Boot hỗ trợ JPA.

Spring Boot hỗ trợ một số cơ sở dữ liệu trong bộ nhớ nổi tiếng, nhưng SQLite yêu cầu chúng tôi nhiều hơn một chút.

Hãy xem những gì nó cần.

2. Thiết lập dự án

Đối với minh họa của chúng tôi, chúng tôi sẽ bắt đầu với ứng dụng Spring Data Rest mà chúng tôi đã sử dụng trong các hướng dẫn trước đây.

Trong pom, chúng ta cần thêm phụ thuộc sqllite-jdbc :

 org.xerial sqlite-jdbc 3.25.2 

Sự phụ thuộc này cung cấp cho chúng ta những gì chúng ta cần sử dụng JDBC để giao tiếp với SQLite. Nhưng, nếu chúng ta định sử dụng ORM thì vẫn chưa đủ.

3. Phương ngữ SQLite

Hãy xem, Hibernate không đi kèm với Phương ngữ cho SQLite . Chúng ta cần tự tạo ra một cái.

3.1. Mở rộng phương ngữ

Bước đầu tiên của chúng tôi là mở rộng lớp org.hibernate.dialect.Dialect để đăng ký các kiểu dữ liệu được cung cấp bởi SQLite:

public class SQLiteDialect extends Dialect { public SQLiteDialect() { registerColumnType(Types.BIT, "integer"); registerColumnType(Types.TINYINT, "tinyint"); registerColumnType(Types.SMALLINT, "smallint"); registerColumnType(Types.INTEGER, "integer"); // other data types } }

Có một số, vì vậy hãy chắc chắn kiểm tra mã mẫu cho phần còn lại.

Tiếp theo, chúng ta sẽ cần ghi đè một số hành vi Phương ngữ mặc định .

3.2. Hỗ trợ cột danh tính

Ví dụ: chúng ta cần cho Hibernate biết cách SQLite xử lý các cột @Id , điều này chúng ta có thể làm với triển khai IdentityColumnSupport tùy chỉnh :

public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl { @Override public boolean supportsIdentityColumns() { return true; } @Override public String getIdentitySelectString(String table, String column, int type) throws MappingException { return "select last_insert_rowid()"; } @Override public String getIdentityColumnString(int type) throws MappingException { return "integer"; } }

Để giữ cho mọi thứ đơn giản ở đây, hãy giữ loại cột nhận dạng chỉ là Số nguyên . Và để có được giá trị nhận dạng có sẵn tiếp theo, chúng tôi sẽ chỉ định cơ chế thích hợp.

Sau đó, chúng tôi chỉ cần ghi đè phương thức tương ứng trong lớp SQLiteDialect đang phát triển của chúng tôi :

@Override public IdentityColumnSupport getIdentityColumnSupport() { return new SQLiteIdentityColumnSupport(); }

3.3. Tắt xử lý các ràng buộc

Và, SQLite không có hỗ trợ cho các ràng buộc cơ sở dữ liệu, vì vậy chúng tôi sẽ cần vô hiệu hóa các ràng buộc đó bằng cách ghi đè lại các phương thức thích hợp cho cả khóa chính và khóa ngoại:

@Override public boolean hasAlterTable() { return false; } @Override public boolean dropConstraints() { return false; } @Override public String getDropForeignKeyString() { return ""; } @Override public String getAddForeignKeyConstraintString(String cn, String[] fk, String t, String[] pk, boolean rpk) { return ""; } @Override public String getAddPrimaryKeyConstraintString(String constraintName) { return ""; }

Và, chỉ trong giây lát, chúng tôi sẽ có thể tham chiếu phương ngữ mới này trong cấu hình Spring Boot của chúng tôi.

4. Cấu hình DataSource

Ngoài ra, vì Spring Boot không cung cấp hỗ trợ cấu hình cho cơ sở dữ liệu SQLite , chúng tôi cũng cần hiển thị bean DataSource của riêng mình :

@Autowired Environment env; @Bean public DataSource dataSource() { final DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("driverClassName")); dataSource.setUrl(env.getProperty("url")); dataSource.setUsername(env.getProperty("user")); dataSource.setPassword(env.getProperty("password")); return dataSource; }

Và cuối cùng, chúng tôi sẽ định cấu hình các thuộc tính sau trong tệp Persence.properties của chúng tôi :

driverClassName=org.sqlite.JDBC url=jdbc:sqlite:memory:myDb?cache=shared username=sa password=sa hibernate.dialect=com.baeldung.dialect.SQLiteDialect hibernate.hbm2ddl.auto=create-drop hibernate.show_sql=true

Lưu ý rằng chúng ta cần giữ bộ đệm ẩn như được chia sẻ để giữ cho các bản cập nhật cơ sở dữ liệu hiển thị trên nhiều kết nối cơ sở dữ liệu.

Vì vậy, với các cấu hình trên, ứng dụng sẽ khởi động và sẽ khởi chạy cơ sở dữ liệu trong bộ nhớ có tên là myDb , cấu hình Spring Data Rest còn lại có thể đảm nhận.

5. Kết luận

Trong bài viết này, chúng tôi đã lấy một ứng dụng Spring Data Rest mẫu và trỏ nó vào cơ sở dữ liệu SQLite. Tuy nhiên, để làm như vậy, chúng tôi phải tạo một phương ngữ Hibernate tùy chỉnh.

Đảm bảo bạn đã kiểm tra ứng dụng trên Github. Chỉ cần chạy với mvn -Dspring.profiles.active = sqlite spring-boot: chạy và duyệt đến // localhost: 8080 .