在MyBatis中實現動態表名
- 場景:由於MySQL本身受單表數據文件大小限制,數據量將成為性能瓶頸。當單表數據量很大,或預計會很大時,將單個大表和單個大表數據文件,拆分成多個小表和小表數據文件就是一個簡單有效的提升新能的方式。一個較好的解決查詢性能問題的手段就是水平分表。分表后,一次針對不同拆分邏輯的查詢,必須被定位到正確的小表上,此時就需要能動態匹配小表的表名。
- 方案:在MyBatis中一個可行的方式就是將表名參數化,首先,表名必須“枚舉化”,傳給MyBatis的值必須是服務端可控的,不能由客戶端傳遞(防止SQL注入攻擊)。其次,SQL語句中的表名取值符號必須用${tableName},不能用#{}(語句中的其他參數建議使用#{}來取值)。
- 舉例:
<select id = "bizQuery"> SELECT t.* FROM ${dto.tableName} AS t WHERE t.`code` = #{dto.code} </select>