Mybatis根据Spring配置文件实现写不一样的Sql语句

 1. 提问:怎么让一个接口经过不一样的开发环境进行不一样的sql操做?

全文用以区分的配置文件以spring.profiles.active为例程序员

首先,mapper层用spring注解@Value读取配置文件是不行的。编译不会错,可是经过注解写入的值必然为空。面试

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

2. 解决方案

把配置文件读到静态参数上面,而后Provider读取静态参数spring

2.1.何时才是一个写入静态参数的好时机呢?

在main方法的SpringApplication.run()以后,正好合适。sql

细心的同窗可能发现了这个方法实际上是有返回值的,返回了一个ConfigurableApplicationContext类。数据库

这个context指的即是sping上下文,进去查源码,查看类描述编程

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

译:由大多数(若是不是全部)应用程序上下文实现的SPl接口。除了Applicationcontext接口中的应用程序上下文客户端方法外,还提供配置应用程序上下文的工具。这里封装了配置和生命周期方法,以免让ApplicationContext客户端代码明显看到它们。目前的方法应该只在启动和关闭代码中使用。设计模式

继续从spring上下文里找环境变量mybatis

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

译:以可配置的形式返回此应用程序上下文的Environment,容许进一步定制。多线程

那么咱们即可以从spring环境里面取得想要的配置文件并写入静态变量了架构

2.2 开始编码测试

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

那么启动程序看一下,是否得到到了

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

这时候又有同窗问了:“若是咱们的配置文件读取了多个配置呢?这个string是否是就不干净啦?”

继续细看这个类,这就是答案,把每一个激活的环境以集合的形式给你。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

继续编码测试,这样就有更完善的方案来解决了。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3.剖析原理

3.1 代理与反射

spring注解的方式是在spring实现加强类的时候,把值注入进去的。那么值为空的状况就能够大胆猜想了: mybatis调用Provider类时用的是类本类,因此获取不到值。

验证时刻:“类和类不能一律而论”

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3.2 深追底层

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

能够看到该类调用了.newInstance()方法

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

译: 建立由class对象表示的类的新实例。类被实例化,就像经过带有空参数列表的new表达式同样。注意,该方法传播由空构造函数抛出的任何异常,包括检查的异常。使用此方法能够有效地绕过编译器执行的编译时异常检查。构造函数。newInstance方法经过将构造函数抛出的任何异常包装在(checked)InvocationTargetException中来避免这个问题。

3.3 延展

看到了.newInstance()方法,至少可以肯定,在使用Mybatis的时候操做Provider的时候必需要一个public的空参构造器。

最后

对于程序员来讲,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提高本身,历来都是咱们去适应环境,而不是环境来适应咱们!

不用多说,相信你们都有一个共识:不管什么行业,最牛逼的人确定是站在金字塔端的人。因此,想作一个牛逼的程序员,那么就要让本身站的更高,成为技术大牛并非一朝一夕的事情,须要时间的沉淀和技术的积累。

如今竞争这么激烈,只有经过不断学习,提升本身,才能保持竞争力。

对于一些不知道学习什么,没有一个系统路线的程序员,这里给你们提供一些学习资料

须要的小伙伴,能够一键三连,点击这里获取免费领取方式

《Java核心知识点合集(283页)》

内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等 watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java中高级核心知识点合集(524页)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java高级架构知识点整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Docker从入门到实践》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《spring could 学习笔记》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《JVM与性能调优知识点整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《MySQL性能调优与架构设计解析文档》305页

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Nginx入门到实战》319页

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java并发编程》385页

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《1000道 互联网Java工程师面试题 (485页)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

须要的小伙伴,能够一键三连,点击这里获取免费领取方式 

相关文章
相关标签/搜索