2017-03-03 16 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でテーブル名を計算し、それをパラメータとして渡すことができます。

任意の値を指定するには、クエリーの一部になるように値を置き換え、解釈/バインド/エスケープされないように値を#の代わりに$の表記で参照する必要があります。パラメータは次のとおりときマッパーインターフェイスワットを使用しても

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

INSERT INTO ${tableName} ... 

XMLの使用にもかかわらず、あなたは注釈が<script>タグでクエリを囲むに固執することができますあなたは以上の1があるとパラメータの名前を指定する必要がi番目の注釈、:それが良いになりながら

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

はしかし、それはあなたがボリュームの問題のために複数のテーブルに分割したいようだ、これは処理するための非常に複雑です単一のテーブルを保持し、インデックス作成とパーティショニングについてDB側を見てください。

-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

関連する問題