Spring boot and SQLite

我正在尝试将SQLite与Spring Boot应用程序一起使用。我知道Spring Boot对MongoDB的强大支持。但是我找不到一种将Spring Boot与SQLite结合使用的方法吗?任何建议从何处或如何开始使用Spring Boot和SQLite?

回答:

Spring Boot无法与SQLite开箱即用(例如,与H2,HSQL或Apache Derby兼容-我建议你使用其中的任何一种来代替SQLite)。

首先,你需要覆盖数据源以指定SQLite数据源。在你的配置中使用以下代码(使用DataSourceBuilder在Spring Boot 1.1.0.M2中引入的代码)

@Bean

public DataSource dataSource() {

DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();

dataSourceBuilder.driverClassName("org.sqlite.JDBC");

dataSourceBuilder.url("jdbc:sqlite:your.db");

return dataSourceBuilder.build();

}

然后你需要创建一个SQLiteDialect,因为Hibernate还没有一个(但适用于Hibernate 4)

package your.package

import java.sql.Types;

import org.hibernate.dialect.Dialect;

import org.hibernate.dialect.function.StandardSQLFunction;

import org.hibernate.dialect.function.SQLFunctionTemplate;

import org.hibernate.dialect.function.VarArgsSQLFunction;

import org.hibernate.Hibernate;

import org.hibernate.type.StringType;

public class SQLiteDialect extends Dialect {

public SQLiteDialect() {

registerColumnType(Types.BIT, "integer");

registerColumnType(Types.TINYINT, "tinyint");

registerColumnType(Types.SMALLINT, "smallint");

registerColumnType(Types.INTEGER, "integer");

registerColumnType(Types.BIGINT, "bigint");

registerColumnType(Types.FLOAT, "float");

registerColumnType(Types.REAL, "real");

registerColumnType(Types.DOUBLE, "double");

registerColumnType(Types.NUMERIC, "numeric");

registerColumnType(Types.DECIMAL, "decimal");

registerColumnType(Types.CHAR, "char");

registerColumnType(Types.VARCHAR, "varchar");

registerColumnType(Types.LONGVARCHAR, "longvarchar");

registerColumnType(Types.DATE, "date");

registerColumnType(Types.TIME, "time");

registerColumnType(Types.TIMESTAMP, "timestamp");

registerColumnType(Types.BINARY, "blob");

registerColumnType(Types.VARBINARY, "blob");

registerColumnType(Types.LONGVARBINARY, "blob");

// registerColumnType(Types.NULL, "null");

registerColumnType(Types.BLOB, "blob");

registerColumnType(Types.CLOB, "clob");

registerColumnType(Types.BOOLEAN, "integer");

registerFunction( "concat", new VarArgsSQLFunction(StringType.INSTANCE, "", "||", "") );

registerFunction( "mod", new SQLFunctionTemplate( StringType.INSTANCE, "?1 % ?2" ) );

registerFunction( "substr", new StandardSQLFunction("substr", StringType.INSTANCE) );

registerFunction( "substring", new StandardSQLFunction( "substr", StringType.INSTANCE) );

}

public boolean supportsIdentityColumns() {

return true;

}

/*

public boolean supportsInsertSelectIdentity() {

return true; // As specify in NHibernate dialect

}

*/

public boolean hasDataTypeInIdentityColumn() {

return false; // As specify in NHibernate dialect

}

/*

public String appendIdentitySelectToInsert(String insertString) {

return new StringBuffer(insertString.length()+30). // As specify in NHibernate dialect

append(insertString).

append("; ").append(getIdentitySelectString()).

toString();

}

*/

public String getIdentityColumnString() {

// return "integer primary key autoincrement";

return "integer";

}

public String getIdentitySelectString() {

return "select last_insert_rowid()";

}

public boolean supportsLimit() {

return true;

}

protected String getLimitString(String query, boolean hasOffset) {

return new StringBuffer(query.length()+20).

append(query).

append(hasOffset ? " limit ? offset ?" : " limit ?").

toString();

}

public boolean supportsTemporaryTables() {

return true;

}

public String getCreateTemporaryTableString() {

return "create temporary table if not exists";

}

public boolean dropTemporaryTableAfterUse() {

return false;

}

public boolean supportsCurrentTimestampSelection() {

return true;

}

public boolean isCurrentTimestampSelectStringCallable() {

return false;

}

public String getCurrentTimestampSelectString() {

return "select current_timestamp";

}

public boolean supportsUnionAll() {

return true;

}

public boolean hasAlterTable() {

return false; // As specify in NHibernate dialect

}

public boolean dropConstraints() {

return false;

}

public String getAddColumnString() {

return "add column";

}

public String getForUpdateString() {

return "";

}

public boolean supportsOuterJoinForUpdate() {

return false;

}

public String getDropForeignKeyString() {

throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");

}

public String getAddForeignKeyConstraintString(String constraintName,

String[] foreignKey, String referencedTable, String[] primaryKey,

boolean referencesPrimaryKey) {

throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");

}

public String getAddPrimaryKeyConstraintString(String constraintName) {

throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");

}

public boolean supportsIfExistsBeforeTableName() {

return true;

}

public boolean supportsCascadeDelete() {

return false;

}

}

最后application.properties覆盖以下设置

spring.jpa.database-platform=your.package.SQLiteDialect

spring.jpa.hibernate.ddl-auto=create-drop

为了让Spring Boot通知Hibernate它应该使用上面创建的SQLiteDialect,需要第一个设置。

以上是 Spring boot and SQLite 的全部内容, 来源链接: utcz.com/qa/420316.html

回到顶部