2017-03-03 50 views
1

我想參數化table_name:t_user_address_book(uid/500000)。例如: :當uid = 1000時,table_name = t_user_address_book0; 當uid = 500001時,table_name = t_user_address_book1; 如何寫?如何在mybatis中參數化tablename

public interface UserAddressBookMapper { 
    @Insert("insert into t_user_address_book? values(...)") 
    int upsert(Long uid, UserAddressBookMsg userAddressBookMsg); 
} 

回答

2

您可以選擇使用MyBatis的XML代碼表:

<choose> 
    <when test="uid gt 1000000"> 
    <bind name="tableName" value="t_user_address_book2" /> 
    </when> 
    <when test="uid gt 500000"> 
    <bind name="tableName" value="t_user_address_book1" /> 
    </when> 
    <otherwise> 
    <bind name="tableName" value="t_user_address_book0" /> 
    </otherwise> 
</choose> 

或者你可以在java計算表名和它傳遞的參數。

無論你選擇什麼,在查詢中的表名參數必須與$符號代替#引用因爲該值必須替換佔位符的是要查詢的一部分,而不是被解釋/綁定/轉義參數:使用映射器接口W¯¯時

@Insert({"<script>", 
     "<choose> ...", 
     "INSERT ..." 
     "</script>" 
}) 

另外:

INSERT INTO ${tableName} ... 

儘管使用XML,你可以與周圍的註釋與<script>標記的查詢棒第i個註解,您需要命名的參數與有超過1:

@Insert("INSERT INTO table VALUES(#{uid}, #{userAddressBookMsg.propertyName1})") 
int upsert(upsert(@Param("uid")Long uid, @Param("userAddressBookMsg") UserAddressBookMsg userAddressBookMsg); 

然而,它似乎要拆分成卷問題多個表,這是非常複雜處理,同時也將更好地是保留一張表,並在數據庫端查看索引和分區。

-1

快速響應將爲「否」。無法將表名稱作爲參數,因爲mybatis使用準備好的語句。

我會建議使用表名作爲變量,並將其提供給語句字符串。 例如:

public interface UserAddressBookMapper { 

static String tableName; 
static void setTableName(String name) { 
    tableName = name; 
} 

@Insert({"insert into", tableName, "values(...)"}) 
int upsert(UserAddressBookMsg userAddressBookMsg); 

你將不得不調用方法之前設置tableName

+0

第一條語句完全錯誤且代碼片段不能編譯,它不能:未初始化靜態字段+方法與接口中的主體 – blackwizard