Spring Boot Dengan SQLite

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melalui langkah-langkah untuk menggunakan pangkalan data SQLite dalam aplikasi Spring Boot yang diaktifkan oleh JPA.

Spring Boot menyokong beberapa pangkalan data dalam memori yang terkenal di luar kotak, tetapi SQLite memerlukan sedikit lagi dari kami.

Mari lihat apa yang diperlukan.

2. Penyediaan Projek

Untuk ilustrasi kami, kami akan memulakan dengan aplikasi Spring Data Rest yang telah kami gunakan dalam tutorial yang lalu.

Di pom, kita perlu menambahkan kebergantungan sqllite-jdbc :

 org.xerial sqlite-jdbc 3.25.2 

Ketergantungan ini memberi kita apa yang kita perlukan untuk menggunakan JDBC untuk berkomunikasi dengan SQLite. Tetapi, jika kita akan menggunakan ORM, itu tidak mencukupi.

3. Dialek SQLite

Lihat, Hibernate tidak menghantar dengan Dialek untuk SQLite . Kita perlu mencipta sendiri.

3.1. Memanjangkan Dialek

Langkah pertama kami adalah memperluas kelas org.hibernate.dialect.Dialect untuk mendaftarkan jenis data yang disediakan oleh 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 } }

Terdapat beberapa, jadi periksa contoh kod yang lain.

Seterusnya, kita perlu mengatasi beberapa tingkah laku Dialek lalai .

3.2. Sokongan Lajur Identiti

Sebagai contoh, kita perlu memberitahu Hibernate bagaimana SQLite mengendalikan lajur @Id , yang boleh kita lakukan dengan pelaksanaan IdentityColumnSupport tersuai :

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"; } }

Untuk memastikan perkara mudah di sini, mari simpan jenis lajur identiti kepada Integer sahaja. Dan untuk mendapatkan nilai identiti yang tersedia seterusnya, kami akan menentukan mekanisme yang sesuai.

Kemudian, kami hanya mengganti kaedah yang sesuai di kelas SQLiteDialect kami yang sedang berkembang :

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

3.3. Lumpuhkan Pengendalian Kekangan

Dan, SQLite tidak mempunyai sokongan untuk kekangan pangkalan data, jadi kami perlu mematikannya dengan mengesampingkan kaedah yang sesuai untuk kunci utama dan asing:

@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 ""; }

Dan, dalam beberapa saat, kita akan dapat merujuk dialek baru ini dalam konfigurasi Spring Boot kami.

4. Konfigurasi Sumber Data

Juga, kerana Spring Boot tidak memberikan sokongan konfigurasi untuk pangkalan data SQLite di luar kotak , kami juga perlu mengekspos kacang DataSource kami sendiri :

@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; }

Dan akhirnya, kami akan mengkonfigurasi sifat berikut dalam fail persistence.properties kami :

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

Perhatikan bahawa kita perlu menyimpan cache seperti yang dikongsi untuk memastikan kemas kini pangkalan data dapat dilihat di beberapa sambungan pangkalan data.

Oleh itu, dengan konfigurasi di atas, aplikasi akan dimulakan dan akan melancarkan pangkalan data dalam memori yang disebut myDb , yang dapat digunakan oleh konfigurasi Spring Data Rest yang tersisa.

5. Kesimpulan

Dalam artikel ini, kami mengambil contoh aplikasi Spring Data Rest dan menunjukkannya pada pangkalan data SQLite. Namun, untuk melakukannya, kami harus membuat dialek Hibernate tersuai.

Pastikan untuk melihat permohonan di Github. Hanya jalankan dengan mvn -Dspring.profiles.active = sqlite spring-boot: jalankan dan layari ke // localhost: 8080 .