1. 程式人生 > >mysql資料庫分表時,使用mybatis動態設定表名

mysql資料庫分表時,使用mybatis動態設定表名

mybatis中傳遞引數一般使用#{},但是當引數是表名時#{}就會報錯。這是為啥呢?

這是因為#{ } 解析為一個 JDBC 預編譯語句(prepared statement)的引數標記符。

簡單來講:select * from user_#{tableVersion}

會被解析為select * from user_?

而${ } 僅僅為一個純碎的 string 替換,在動態 SQL 解析階段將會進行變數替換

簡單來講:select * from user_#{tableVersion}

會被解析為select * from user_1

 

綜上所得, ${ } 的變數的替換階段是在動態 SQL 解析階段,而 #{ }的變數的替換是在 DBMS 中。

#{}與${}的區別可以簡單總結如下:
#{}將傳入的引數當成一個字串,會給傳入的引數加一個雙引號
${}將傳入的引數直接顯示生成在sql中,不會新增引號
#{}能夠很大程度上防止sql注入,${}無法防止sql注入
${}一般用於傳輸資料庫的表名、欄位名等
能用#{}的地方儘量別用${}