mybatis-mapper / mapper

MyBatis Mapper
https://mapper.mybatis.io
Apache License 2.0
325 stars 47 forks source link

tk-mapper中的IDynamicTableName,动态表名能支持下吗?或者有什么好的办法实现? #48

Closed marsal1212 closed 1 year ago

abel533 commented 1 year ago

目前的实现方案如下:

@Test
public void testSelectByPrimaryKey() {
  SqlSession sqlSession = getSqlSession();
  try {
    EntityMapper<User, Long> entityMapper = sqlSession.getMapper(UserMapper.class);
    Optional<User> user = DynamicTableName.hint("user_2", () -> entityMapper.selectByPrimaryKey(1L));
    Assert.assertTrue(user.isPresent());
  } finally {
    sqlSession.close();
  }
}

目前通过调用静态方法设置,优点是所有方法都能直接支持,不需要给某些实体方法设置额外的表名。

上述 selectByPrimaryKey 对应的方法如下:

<script>
SELECT id,name AS userName,sex FROM ${@io.mybatis.extra.dynamic.tablename.DynamicTableName@table('user')}
<where>
id = #{id}
</where> 
</script>

可以先针对当前实现反馈一下。

marsal1212 commented 1 year ago

我这边直接上了sharding-jdbc的hint分表。强制指定,和上面的方法很类似。

谈谈上面这种做法的感受:代码写起来太割裂了。 正常情况下,需要写sql的地方,肯定会定义好动态后缀参数。需要动态表名的,也只是baseMapper内的一些方法。