这两天由于工作上需要,和同事一起搞一个项目,项目很简单,只对一张表维护,数据来源于硬件设备,通过Socket传输。我主要负责设计和项目搭建,之前也搭过,是mybatis的,mybatis-plus的项目是用别人搭好的,自己没实践过,现在必须得弄了。两天的搭建过程中主要遇到三个问题,有一些新的思考,做个记录, 方便后面回顾学习,也希望能帮到同为工程师的我们。这是第三篇。
前面说到我这边是动态表名,年表,表名带有年份后缀,现在是2021年,就是_2021,此时又遇到头疼的问题,如果用baseMapper自带的方法,表名无法动态,如果在自己Mapper写sql,那还好,表名可以用${}传过去,可以处理。那怎么办,还是得弄!!!看到一个篇官方的说明,说mybatis-plus 3.4.0有对动态表名的支持,设置也很简单。其中也看了下别人的方式,最后觉得还是这个篇官方的简介实操性最高:
MyBatis Plus 提供的 DynamicTableNameInnerInterceptor 插件就是用来解决动态表名。同时,还提供了 TableNameHandler 接口,该接口有一个 dynamicTableName() 方法,该方法返回新的表名称。
那就试下:
跑起来后,诶,不行啊:
那是为什么,别人也验证过,可以用,那不可能是不支持,那肯定是我的问题,但是我不知道问题出在哪,服务启动时跟了下断点,MybatisPlusConfig的mybatisPlusInterceptor的方法是走完了,看了下MybatisPlusInterceptor继承自Interceptor,再理解了下代码,定义一个名称和处理映射map,dynamicTableNameInnerInterceptor设置这个map,MybatisPlusInterceptor再添加这个interceptor,看着很对啊,示例也是那么写的!那为什么没效果?后面都跟到源码去了,发现得出的语句的表名后缀确实是没带上去,也就是没进到拦截器这里,走查询时也是没进这里的断点:
后来经过一番折腾,没解决。有点难受,再过了一会,想到,示例中的 log表,然后代码那里也是log表:
这好像是,应该是说精确匹配吧,我那里写的是表名的一部分,我以为可以模糊匹配表名,改成表名全名试下:
尼玛,可以了。那一刻我真是又喜又恨:
所以,你以为的有时不是不一定对噢。
找到问题:全名匹配。