2017-06-22 43 views
1

有沒有辦法將java Map<String, Object>綁定到JDBI @BindBean註釋中的varchar。將Java Map <String,Object>綁定到JDBI中的sql varchar的方法INSERT語句

因此,例如,我有一個類Something.class和我創建一個

@SqlBatch("INSERT INTO Something (name, payload) VALUES(:name, :payload)")

現在在我的Java類nameString型和​​是Map<String, Object>型的,我想在數據庫表中的類型是varchar(...)。現在我想將Map對象作爲JSON對象插入到列中,是否可以通過http://jdbi.org/sql_object_api_argument_binding/中定義的方式創建我自己的複雜活頁夾?而不是讓我的有效載荷在Java中是String類型的。

+0

然後將您的地圖轉換爲JSON對象,如您所說x)檢查[此答案](https://stackoverflow.com/questions/8360836/gson-is-there-an-easier-way-to-serialize- a-map?noredirect = 1&lq = 1) – Nathan

+0

我不能那樣做Nathan,因爲我需要它作爲我需要的其他東西的Map。但無論如何感謝您的建議。 – TheLearner

+0

如果你嘗試在一行中存儲'Map',它顯然沒有很好的設計......每個鍵/值應該被連續存儲到一個輔助表中,並鏈接到'Something.name'(或每行一行'name + playload_key')。從這個角度來看,迭代Map來創建每一行都很容易,但也很容易獲得行來構建地圖。不需要將Map解析爲某種格式化的'String' – AxelH

回答

1

解決了我在創建this post中建議的ArgumentFactory聯編程序時遇到的問題。

我需要那麼什麼是創建一個只包含一個字段類型的Map<String, Object>實施Arugment接口從org.skife.jdbi.v2.tweak所以我結束了以下

public class NotificationPayload implements Argument { 
    private Map<String, Object> payload; 

    @Override 
    public void apply(int i, PreparedStatement preparedStatement, StatementContext statementContext) 
    throws SQLException { 
     preparedStatement.setString(i, toString()); 
    } 

    @Override 
    public String toString() { 
     return new JSONObject(payload).toString(); 
    } 

} 

爲了使這一工作,我當然需要一個類實現它實現了org.skife.jdbi.v2.tweak.ArgumentFactory<T>接口與我的新創建的類型工廠類,因此工廠最後成爲這樣的:

public class NotificationPayloadFactory implements ArgumentFactory<NotificationPayload> { 

    @Override 
    public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) { 
     return value instanceof NotificationPayload; 
    } 

    @Override 
    public Argument build(Class<?> expectedType, NotificationPayload value, StatementContext ctx) { 
     return value; 
    } 

} 

,當然最後也在Does JDBI accept UUID parameters?提到我不得不註冊我的工廠:

jdbi.registerArgumentFactory(new NotificationPayloadFactory()); 

我想只是一個工廠的Map<String, Object>要做到這一點,但不能讓這件工作,並有對NPE的風險。

編輯

的原因,我重寫toString()NotificationPayload是因爲我需要在JSON格式的一些地方,我需要一個String對象的有效載荷。但是,也可以將其刪除,然後在調用toString()preparedStatement.setString()中使用new JSONObject(payload).toString()

相關問題