mybatis设置全局变量

原创 2020-12-29 15:19 阅读(3317)次

clickhouse在分布式子查询中会将语句发送到多个分片执行,如果语句中的表前不写上库名,查询时会报在default库中找不到表,所以我们需要给每个clickhouse的查询中都写上库名,这样才能正常执行。但库名写死在语句中并不优雅,万一库名修改或测试环境的库名不同,我们开发要将这么多查询语句都要修改,不得累到死,于是就要将clickhouse库名进行配置到公共变量,并在mybatis中获取。

下面分享下如何在mybatis设置和全局变量。

先要spring boot配置文件中定义需要设置的全局配置,然后在clickhouse的mybatis sessionFactory中设置全局变量,这样mybatis的mapper.xml中的语句就可以使用mybatis的全局变量了,代码如下:


  • mybatis全局变量定义dbname

public class ClickhouseDataSourceConfig {

    /**
     * clickhouse数据库名,每个sql的表都要带上库名,否则分布式查询语句可能会报错
     */
    @Value("${spring.clickhouse.db}")
    private String clickHouseDb;

    @Value("${spring.clickhouse.clusterName}")
    private String clusterName;


    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/clickhouse/*.xml"));
        Properties properties = new Properties();
        properties.put("dbname", clickHouseDb);
        properties.put("clusterName", clusterName);
        bean.setConfigurationProperties(properties);
        return bean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

  • mapper.xml中引用dbname

    <select id="selectCount" resultType="integer">
      SELECT count(1) FROM (
        SELECT plate_number FROM ${dbname}.cluster_event e
        WHERE
        e.snapshot_time <![CDATA[>=]]> #{dateTimeRange.startTime}
        and e.snapshot_time <![CDATA[<=]]> #{dateTimeRange.endTime}
        GROUP BY plate_number LIMIT #{limit}
      ) a
    </select>

上面的例子是我们把集群名和库名都用配置的,以免之后要修改。

上一篇:java数组转list