在 MyBatis 中,动态表查询可以通过动态 SQL 来实现。MyBatis 提供了 <where>, <if>, <choose>, <foreach> 等标签来帮助你构建动态 SQL。动态表的查询通常依赖于传入的参数来决定使用哪个表。你可以使用动态 SQL 来改变查询中的表名。

以下是一个简单的例子,展示如何在 MyBatis 中设置动态表查询。

1. 使用 if 标签来动态选择表

<select id="selectByTable" resultType="com.example.YourEntity">
    SELECT * FROM
    <choose>
        <when test="tableName == 'table1'">
            table1
        </when>
        <when test="tableName == 'table2'">
            table2
        </when>
        <otherwise>
            default_table
        </otherwise>
    </choose>
    WHERE id = #{id}
</select>

2. 在 Java 方法中传入表名

在 Java 代码中,你可以将表名作为参数传递给 MyBatis 查询:

public List<YourEntity> selectByTable(String tableName, int id) {
    Map<String, Object> params = new HashMap<>();
    params.put("tableName", tableName);
    params.put("id", id);
    return sqlSession.selectList("com.example.selectByTable", params);
}

3. 使用动态 SQL 通过 @SelectProvider

如果你需要更复杂的查询,可以使用 @SelectProvider 来动态生成 SQL。例如:

@SelectProvider(type = SqlProvider.class, method = "selectByTable")
List<YourEntity> selectByTable(@Param("tableName") String tableName, @Param("id") int id);

class SqlProvider {
    public String selectByTable(Map<String, Object> params) {
        String tableName = (String) params.get("tableName");
        Integer id = (Integer) params.get("id");

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM ");
        sql.append(tableName != null ? tableName : "default_table");
        sql.append(" WHERE id = #{id}");
        return sql.toString();
    }
}

注意:

  1. 由于 SQL 表名是动态的,所以必须小心 SQL 注入问题。在实际应用中,需要验证表名是否合法,确保它不会导致 SQL 注入漏洞。避免直接使用用户输入的值。