在MyBatis中实现动态表名

在MyBatis中实现动态表名

  1. 场景:由于MySQL本身受单表数据文件大小限制,数据量将成为性能瓶颈。当单表数据量很大,或预计会很大时,将单个大表和单个大表数据文件,拆分成多个小表和小表数据文件就是一个简单有效的提升新能的方式。一个较好的解决查询性能问题的手段就是水平分表。分表后,一次针对不同拆分逻辑的查询,必须被定位到正确的小表上,此时就需要能动态匹配小表的表名。
  2. 方案:在MyBatis中一个可行的方式就是将表名参数化,首先,表名必须“枚举化”,传给MyBatis的值必须是服务端可控的,不能由客户端传递(防止SQL注入攻击)。其次,SQL语句中的表名取值符号必须用${tableName},不能用#{}(语句中的其他参数建议使用#{}来取值)。
  3. 举例:
    <select id = "bizQuery">
        SELECT
            t.*
        FROM
            ${dto.tableName} AS t 
        WHERE
            t.`code` = #{dto.code}
    </select>
    
原文地址:https://www.cnblogs.com/JaxYoun/p/14158938.html