SpringBoot--环境配置--切换Schema

场景描述

1. 相关概念界定

环境:这里的环境指的是 生产环境测试环境开发环境 等数据库环境
Schema:Orcale中的特有概念,用户名的意思,和表空间差不多的东西。

2 痛点

在实际开发中,我们肯定不会只用到一个环境,至少开发环境和生产环境一定是分开的。但是当我们的项目上线之后,但是开发还未完成,我们就需要在生产环境和正式环境之间切换。在项目代码层面,我们要切换的公共配置如数据库配置,接口URL,端口,路径等等大部分都写在配置文件中了,SpringBoot项目的配置一般为 *.properties 或者 *.yml 文件。

# application.yml
# #符号表示行注释
# active标识活动的配置文件
spring:
  profiles:
	active: dev   # 测试环境配置
#	active: pd    # 正式环境
# application-dev.yml
spring:
  datasource:
    url: jdbc:oracle:thin:@127.0.0.1:test
    username: test
    password: 123456
    driver-class-name: oracle.jdbc.OracleDriver
# application-pd.yml
spring:
  datasource:
    url: jdbc:oracle:thin:@127.0.0.1:prod
    username: prod
    password: 654321
    driver-class-name: oracle.jdbc.OracleDriver

在切换环境时,我们只需将 application.yml中active改变一下,就能更改大部分配置,非常方便。
但是,如果我们使用的是Oracle数据,在写SQL语句时,一般需要加上Schema,不同的环境其Schema是不同的,而拼写SQL又需要放在Mapper中,没无法直接定义变量直接替换,如下面的例子,很是头疼。

<!-- 测试环境中的 studentMapper.xml -->
<select id="selectByName" parametType="String">
	SELECT * FROM TEST.T_STUDENT WHERE 1 = 1
	<if test=" name != null and name != '' ">AND NAME = #{name}</if>
<select>
<!-- 生产环境中的 studentMapper.xml -->
<select id="selectByName" parametType="String">
SELECT * FROM PROD.T_STUDENT WHERE 1 = 1
	<if test=" name != null and name != '' ">AND NAME = #{name}</if>
<select>

再或者通过@Select注解进行查询

// 测试环境 Student.Mapper
Class Interface Mapper{
	@Select({
	" select * from test.t_student ",
	" where name = ${name}",
	})
	List<Student> SelectByname(@Param("name")String name);
}
// 生产环境 Student.Mapper
Class Interface Mapper{
	@Select({
	" select * from prod.t_student ",
	" where name = ${name}",
	})
	List<Student> SelectByname(@Param("name")String name);
}

如上两个例子SELECT 语句中,表名的前缀不同。生产环境中的表前缀为prod,测试环境中的表前缀为test,针对这种情况,我们可以在为mybatis设置配置属性,然后再mapper中调用。

解决方案

如果我们用的是mybatis,则可以在配置文件中加上如下配置。
使用条件:未使用XML或者配置类配置mybatis

# application-test.yml
mybatis:
  configuration-properties: {tableSchema: test}

这样我们就可以在mapper.xml或者mapper.java中使用tableSchema变凉了。

<!-- 生产环境中的 studentMapper.xml -->
<select id="selectByName" parametType="String">
SELECT * FROM ${tableSchema}.T_STUDENT WHERE 1 = 1
	<if test=" name != null and name != '' ">AND NAME = #{name}</if>
<select>
Class Interface Mapper{
	@Select({
	" select * from ${tableSchema}.t_student ",
	" where name = ${name}",
	})
	List<Student> SelectByname(@Param("name")String name);
}
如果使用XML配置mybatis,则需要在mybatis配置文件中添加如下配置
<bean id="sqlSessionFactory" class="...">
	...
	...
	<property name="configurationProperties">
		<prop key="tableSchema">test</prop>
	</propety>
	...
	...
</bean>
如果使用配置类

则需要在返回SqlSessionFactory的方法中添加上面的属性。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值