时效提示:本文写于 2020 年,部分 API、配置和工具版本可能已经变化,参考时请以官方最新文档为准。

嵌入式数据库

技术选型 Sqlite和h2

h2建表完字段名称是大写,和原本设计思路有偏差,放弃,遂采用Sqllite

并且navicat可以编辑Sqlite,而不能编辑h2

Use in Spring Boot

整合Spring data jpa jdbcTemplate


        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>com.zsoltfabok</groupId>
            <artifactId>sqlite-dialect</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
spring.datasource.url=jdbc:sqlite::resource:db/sqlite/db_freyr_test.db
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.jpa.database-platform=org.hibernate.dialect.SQLiteDialect

到此 jpa和jdbcTemplate 整合完毕。注意:Hibernate 方言要配在 spring.jpa.database-platform(类来自上面引入的 sqlite-dialect 依赖);spring.datasource.platform 是用来选择初始化脚本 schema-${platform}.sql 的,填方言类名不会生效。

遇到问题总结

下面这个异常来自 Spring Data JDBC 的方言识别(DialectResolver),它不支持 SQLite。只用 JdbcTemplate 的话,去掉 spring-boot-starter-data-jdbc 依赖即可;确实要用 Spring Data JDBC 的 Repository,需要自己实现并注册一个 SQLite 的 Dialect。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.relational.core.dialect.Dialect]: Factory method 'jdbcDialect' threw exception; nested exception is org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: Cannot determine a dialect for org.springframework.jdbc.core.JdbcTemplate@51eb0e84. Please provide a Dialect.
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:650)
	... 34 common frames omitted
Caused by: org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: Cannot determine a dialect for org.springframework.jdbc.core.JdbcTemplate@51eb0e84. Please provide a Dialect.
	at org.springframework.data.jdbc.repository.config.DialectResolver.lambda$getDialect$2(DialectResolver.java:80)
	at java.util.Optional.orElseThrow(Optional.java:290)
	at org.springframework.data.jdbc.repository.config.DialectResolver.getDialect(DialectResolver.java:79)
	at org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration.jdbcDialect(AbstractJdbcConfiguration.java:144)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 35 common frames omitted

2.3.4.RELEASE 版本会有问题