在实际开发中,我们肯定不会只用到一个环境,至少开发环境和生产环境一定是分开的。但是当我们的项目上线之后,但是开发还未完成,我们就需要在生产环境和正式环境之间切换。在项目代码层面,我们要切换的公共配置如数据库配置,接口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中,没无法直接定义变量直接替换,如下面的例子,很是头疼。
<select id="selectByName" parametType="String">
SELECT * FROM TEST.T_STUDENT WHERE 1 = 1
<if test=" name != null and name != '' ">AND NAME = #{name}if>
<select>
<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变凉了。
<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);
}
<bean id="sqlSessionFactory" class="...">
...
...
<property name="configurationProperties">
<prop key="tableSchema">testprop>
propety>
...
...
bean>
则需要在返回SqlSessionFactory的方法中添加上面的属性。