mybatis设置全局变量
原创 2020-12-29 15:19 阅读(3519)次
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
下一篇:原生js如何判断PC端还是手机端