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

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

    • 场景描述
      • 1. 相关概念界定
            • 环境:这里的环境指的是 *生产环境*,*测试环境*,*开发环境* 等数据库环境
            • Schema:Orcale中的特有概念,用户名的意思,和表空间差不多的东西。
      • 2 痛点
    • 解决方案
          • 如果使用XML配置mybatis,则需要在mybatis配置文件中添加如下配置
          • 如果使用配置类

场景描述

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中,没无法直接定义变量直接替换,如下面的例子,很是头疼。


<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);
}
如果使用XML配置mybatis,则需要在mybatis配置文件中添加如下配置
<bean id="sqlSessionFactory" class="...">
	...
	...
	<property name="configurationProperties">
		<prop key="tableSchema">testprop>
	propety>
	...
	...
bean>
如果使用配置类

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

你可能感兴趣的:(mybatis,spring,java)