阿德1986
把配置都开了不就好了?
大梵天1984
不会吧,你set表名的代码是在查询方法之前吗?
Holems
同学,你好,我怎么感觉这个事让你整复杂了呢,你上面这个需求order和order_today,我感觉写一个实体就可以了,到底在什么时候什么情况下查哪个表,在ITableNameHandler的实现类中编写逻辑,然后配置好就可以了。
欧尼桑1111
应该不是叫不叫id的问题,是你的主键中也包含“user”字符串片段,他也给你替换了。这应该算是bug,你可以提给官方。
慕粉4385183
如果是web项目,可以这样写,但是别忘了,在使用结束时,要清空ThreadLocal变量,防止被线程池重用。web处理请求时,只要没处理完,当前处理请求的当前线程就不会释放,不会乱掉的。
还有一个处理办法,将动态表名放到request对象中也可以,然后再从request中取。
慕勒2345720
同学,你好,你配置动态表名解析器了吗?如果配置了,你ITableNameHandler实现类中的dynamicTableName抽象方法的返回值,是你要替换的的表名吗?如果返回值为null不替换。
训练营
多表联查可以既使用xml或@select注解的方式写sql,然后还能使用MP的条件构造器,这种方式,我个人认为挺优雅的。给你举个例子:
MP自带的CRUD操作是针对单表操作的,如果要操作多表,可以写自定义sql。
给你举个使用条件构造器的多表sql例子,可以写在xml中或注解中,下面的是用xml的写法:
<select id="mySelectList" resultType="User">
select u.*,r.role_name from user u inner join role r on u.role_id = r.role_id ${ew.customSqlSegment}
</select>对应的Mapper接口中的方法定义:
List<User> mySelectList(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
返回值可以是VO。也可以是实体类,但要要记住,如果用实体类接返回值,实体中非该实体对应表的数据库字段的属性上要标注@TableField(exist = false),如果使用了条件构造器,条件构造器的字段名别忘了带别名。
weixin_慕丝7591493
同学,你可否提供一下关键代码,还是粘贴错误信息的时候,截个图也行,或者有换行。现在我看着太费劲了。
qq_慕码人1149559
该注解,除了可以使用在自定义方法上,还可以使用在类、接口或枚举类上,你可以试试写到Mapper接口上,是否生效。
qq_阆苑凨_0
我已经好多年没用过这种传统的springmvc的xml配置方式了。我试着说一下思路,然后你看看是否可行。
首先编写一个实现ITableNameHandler的类,如果需要多个表实现动态表面,就编写多个实现ITableNameHandler接口的类。我们假设实现了一个,类名是com.mp.MyTableNameHandler,需要在类上增加@Component("myTableNameHandler")。大致配置如下:
<property name="plugins"> <array> <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"> <!--....其他配置...--> <property name='sqlParserList'> <list> <ref bean='myTableNameHandler' /> </list> </property> </bean> </array></property>
你看看这样配置是否可行,如果有问题再反馈给我。
崔元太
看着动态表面的代码写的没问题。可能是项目哪个地方写错了导致的报错。你测试类加一下两个注解了吗
@RunWith(SpringRunner.class)
@SpringBootTest
还有,你启动类中的注解@MapperScan("com.mp.dao")和我写的一样吗?