Spring Data JDBC和SQLite

vybvopom  于 2023-01-17  发布在  SQLite
关注(0)|答案(3)|浏览(227)

我必须在已有SQLite数据源的地方编写一个新项目。
我基本上有两个问题:

  1. Spring Data JDBC支持SQLite吗?这里的清单没有明确说明:https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#requirements
    1.由于它不是“官方”支持的开箱即用,它甚至建议使用它(SQLite)通过自己的方言?
    我可以做一些导入/导出工作,从sqlite,让我们说postgres,例如没有任何麻烦。
f2uvfpb9

f2uvfpb91#

  1. SQLite不支持开箱即用。
    1.我不熟悉SQLite,但Spring Data JDBC目前不需要任何花哨的SQL特性。在快速查看文档后,我相信您应该可以使用自己的方言。这是使用Spring Data JDBC的数据库的预期方式,不支持开箱即用。
    您甚至可以将方言开源并在Maven上发布,这样其他人也可以从中受益。
w3nuxt5m

w3nuxt5m2#

这可能不是正确的解决方案,所以如果我做错了什么,请纠正我,因为我不完全理解的概念。但这对我来说是有效的:

import java.util.Optional;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.relational.core.mapping.NamingStrategy;

@Configuration
public class SQLiteJdbcDialectProvider extends AbstractJdbcConfiguration {

    @Bean
    @Override
    public JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy,
            JdbcCustomConversions customConversions) {

        JdbcMappingContext mappingContext = super.jdbcMappingContext(namingStrategy, customConversions);
        mappingContext.setForceQuote(false);

        return mappingContext;
    }

}

然后,我将MySQL Dialect复制到SQLite Dialect类中:

import org.springframework.data.relational.core.dialect.AbstractDialect;
import org.springframework.data.relational.core.dialect.ArrayColumns;
import org.springframework.data.relational.core.dialect.H2Dialect;
import org.springframework.data.relational.core.dialect.LimitClause;
import org.springframework.data.relational.core.dialect.LockClause;
import org.springframework.data.relational.core.sql.LockOptions;

public class SQLiteDialect extends AbstractDialect {

    public static final SQLiteDialect INSTANCE = new SQLiteDialect();

    
    private static final LimitClause LIMIT_CLAUSE = new LimitClause() {

        @Override
        public String getLimit(long limit) {
            return "LIMIT " + limit;
        }

        @Override
        public String getOffset(long offset) {
            return String.format("LIMIT %d, 18446744073709551615", offset);
        }

        @Override
        public String getLimitOffset(long limit, long offset) {

            return String.format("LIMIT %s, %s", offset, limit);
        }

        @Override
        public Position getClausePosition() {
            return Position.AFTER_ORDER_BY;
        }
    };
    
    @Override
    public LockClause lock() {
        return LOCK_CLAUSE;
    }

    @Override
    public ArrayColumns getArraySupport() {
        return ArrayColumns.Unsupported.INSTANCE;
    }

    private static final LockClause LOCK_CLAUSE = new LockClause() {

        @Override
        public String getLock(LockOptions lockOptions) {
            return "WITH LOCK";
        }

        @Override
        public Position getClausePosition() {
            return Position.AFTER_ORDER_BY;
        }
    };

    @Override
    public LimitClause limit() {
        return LIMIT_CLAUSE;
    }
}

然后我在下面创建了一个新文件:

src\main\resources\META-INF\spring.factories

以下行:

org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=your.package.SQLiteDialectResolver

最后,我在使用JdbcTemplate调用queryForList时遇到了一个ArrayIndexOutOfBoundsException异常,所以我使用了NamedParameterJdbcTemplate

h43kikqp

h43kikqp3#

我开发了https://github.com/komamitsu/spring-data-sqlite,通过Spring Data JDBC接口使用SQLite,我想你可以很容易地使用它,如果你尝试一下会很棒。

相关问题