Skip to content

SQL 方言(Dialect)

Bean Searcher 可以为我们自动生成完整的 SQL 语句,但对应不同的数据库,SQL 语法可能略有不同。为此,Bean Searcher 使用方言(Dialect)来扩展支持这些不同的数据库。

方言实现

Bean Searcher 自带四种 Dialect 实现:

Bean Searcher 中的方言很简单

  • v3.3.0 起,它被简化,只需实现 两个 方法即可;
  • v3.7.0 起,再被简化,只需实现 一个 方法即可。

配置方法

以下介绍各框架下的方言配置。

SpringBoot / Grails

使用 bean-searcher-boot-starter 依赖时,如需切换 Bean Searcher 自带的方言,则可通过以下配置项来指定:

配置键名含义可选值默认值
bean-searcher.sql.dialectSQL 方言MySQLOraclePostgreSQLSqlServerMySQL

自定义的方言,只需将之注册为 Bean 即可:

java
@Bean
public Dialect myDialect() {
    return new MyDialect();
}

非 Boot 的 Spring 项目

xml
<!-- 定义 Oracle 方言 -->
<bean id="dialect" class="cn.zhxu.bs.dialect.MyDialect" />

<!-- v3.3 起需要配置运算符池 -->
<bean id="fieldOpPool" class="cn.zhxu.bs.FieldOpPool" 
    p:dialect-ref="dialect" />

<bean id="paramResolver" class="cn.zhxu.bs.implement.DefaultParamResolver" 
    p:fieldOpPool-ref="fieldOpPool" />

<bean id="sqlResolver" class="cn.zhxu.bs.implement.DefaultSqlResolver" 
    p:dialect-ref="dialect" />

<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- 省略其它属性配置,BeanSearcher 检索器也同此配置 -->
    <property name="paramResolver" ref="paramResolver" />
    <property name="sqlResolver" ref="sqlResolver" />
</bean>

Others

java
Dialect dialect = new MyDialect();
// v3.3 起需要配置运算符池
FieldOpPool fieldOpPool = new FieldOpPool();
fieldOpPool.setDialect(dialect);    // 配置使用 Oracle 方言
DefaultParamResolver paramResolver = new DefaultParamResolver();
paramResolver.setFieldOpPool(fieldOpPool);
DefaultSqlResolver sqlResolver = new DefaultSqlResolver();
sqlResolver.setDialect(dialect);    // 配置使用 Oracle 方言
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // 省略其它属性配置,BeanSearcher 检索器也同此配置
        .paramResolver(paramResolver)
        .sqlResolver(sqlResolver)
        .build();

动态方言(v4.2.0)

动态方言一般在 多数据源 的场景下才会使用。其实现原理非常简单,仅两个实现类:

  • DynamicDialect(核心类)
  • DynamicDialectSupport

配置方法(使用 bean-searcher-boot-starterbean-searcher-solon-plugin 依赖时):

配置键名含义可选值默认值
bean-searcher.sql.dialect-dynamic是否使用动态方言truefalsefalse
bean-searcher.sql.dialects不同数据源的方言关系Map<String, Dialect>

例如:

yml
bean-searcher:
  sql:
    # 默认 MySQL 方言
    dialect: MySQL
    # 启用动态方言
    dialect-dynamic: true
    dialects:
      # user 数据源使用 Oracle 方言
      user: Oracle
      # order 数据源使用 PostgreSQL 方言
      order: PostgreSQL

基于 Apache 许可发布