微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Data JDBC和SQLite

如何解决Spring Data JDBC和SQLite

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

  1. Spring Data JDBC是否支持sqlite?这里的清单未明确声明:https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#requirements
  2. 由于不是开箱即用的“正式”支持,甚至不建议通过自己的方言使用它(sqlite)?

我可以从sqlite进行一些进出口工作,例如说postgres,完全没有问题。

解决方法

  1. 不支持立即使用SQLite。

  2. 我对SQLite不熟悉,但是Spring Data JDBC当前不需要任何高级SQL功能。在快速检查了文档之后,我相信您可以使用自己的方言了。这是将数据库与Spring Data JDBC一起使用的既定方式,但不提供现成的支持。

您甚至可以将方言设为开源并将其发布在Maven上,这样其他人也可以从中受益。

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。