spring数据jdbc标识符处理

z18hc3ub  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(447)

用例:连接mysql和oracle数据库
问题:如果我将任何一个数据源注解为主数据源,它总是使用主数据库标识符处理并基于此形成查询。
mysql数据库

@Bean
@Primary
@Qualifier("mySqlJdbcConverter")
public JdbcConverter mySqlJdbcConverter(JdbcMappingContext mappingContext, @Lazy RelationResolver relationResolver,
        @Qualifier("mysqlJdbcOperationsReference") NamedParameterJdbcOperations mysqlJdbcOperationsReference) {
    DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(
            mysqlJdbcOperationsReference.getJdbcOperations());
    return new BasicJdbcConverter(mappingContext, relationResolver, mySqlJdbcCustomConversions(), jdbcTypeFactory,
            IdentifierProcessing.create(new Quoting("`"), LetterCasing.UPPER_CASE));
}

@Bean
@Primary
@Qualifier("mySqlJdbcDialect")
public Dialect mySqlJdbcDialect(final JdbcConverter JdbcConverter) {
    return MySqlDialect.INSTANCE;
}

Oracle

@Bean
@Qualifier("oracleJdbcConverter")
public JdbcConverter oracleJdbcConverter(JdbcMappingContext mappingContext, @Lazy RelationResolver relationResolver,
        @Qualifier("oracleJdbcOperationsReference") NamedParameterJdbcOperations oracleJdbcOperationsReference) {
    DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(
            oracleJdbcOperationsReference.getJdbcOperations());
    return new BasicJdbcConverter(mappingContext, relationResolver, oracleJdbcCustomConversions(), jdbcTypeFactory,
            IdentifierProcessing.create(new Quoting("\""), LetterCasing.UPPER_CASE));
}

@Bean
@Qualifier("oracleJdbcDialect")
@RequestScope
public Dialect oracleJdbcDialect(final JdbcMappingContext JdbcConverter) {
    return OracleDialect.INSTANCE;
}

在上述情况下,查询总是带有反引号字符。即使它正在连接到oracle数据库,但标识符总是反引号
查询:

SELECT `service`.`SERVICE_ID` AS `SERVICE_ID`, `service`.`SERVICE_NAME` AS `SERVICE_NAME` FROM `service`

我能知道为什么会这样吗?

iyfjxgzm

iyfjxgzm1#

这个 Dialect 不是从树上捡来的豆子 ApplicationContext . 如果你想用你自己的 Dialect 您需要执行以下操作:
实现你自己的 Dialect .
实施 JdbcDialectProvider 把那个还给我 Dialect .
通过将文件spring.factories放入 META-INF 文件夹中的类路径并添加行 org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<fully qualified name of your JdbcDialectProvider> 看到了吗https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0#dialects
但实际上你不应该这么做,因为oracle和mysql的方言已经是现成的了。

相关问题