在 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();
}
}
注意:
- 由于 SQL 表名是动态的,所以必须小心 SQL 注入问题。在实际应用中,需要验证表名是否合法,确保它不会导致 SQL 注入漏洞。避免直接使用用户输入的值。