我將Java對象作爲一個字節存儲在表的一個blob中。 java對象是自定義對象。我如何構建java對象並在存儲過程中使用它?訪問存儲爲BLOB的Java對象的MYSQL存儲過程
回答
讓班級執行java.io.Serializable
,這樣您就可以獲得一個InputStream
它可以使用CallableStatement#setBinaryStream()
存儲在數據庫中。
這就是說,這通常被認爲是一個糟糕的設計。如果該類實際上是一個Javabean類,那麼最好創建一個包含表示Javabean屬性的列的表。例如。一個public class User { private Long id; private String name; private Integer age; }
應該被映射到一個表像CREATE TABLE user (id BIGINT AUTO_INCREMENT, name VARCHAR, age INTEGER)
編輯爲您的評論的答覆:你這樣基本上要存儲數組作爲二進制對象。這是一個非常糟糕的主意。這樣你就不能在數據庫中搜索數組的數據,並且數據庫也不能再被移植了。只需創建一個代表每個數組項的新表。添加一個額外的列它表示父對象(實際上,它應當是其被映射包含數組父對象表的PK的ID
例:
public class Parent {
private Long id;
private String someData;
private List<Child> children;
// Add/generate public getters/setters.
}
public class Child {
private Long id;
private String someData;
// Add/generate public getters/setters.
}
應該映射到
CREATE TABLE parent (
id BIGINT NOT NULL AUTO_INCREMENT,
someData VARCHAR,
PRIMARY KEY (id)
);
CREATE TABLE child (
id BIGINT NOT NULL AUTO_INCREMENT,
parent_id BIGINT NOT NULL,
someData VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
這樣你可以選擇所有與JOIN
條款的幫助。在檢查的w3schools.com SQL教程和例子供應商特定的SQL文檔。
如何構建java對象並在存儲過程中使用它?
這是不可能的,至少與MySQL無關。與支持Java Stored Procedures的Oracle不同,MySQL的存儲過程語法基於普通的ANSI SQL標準。所以我沒有看到如何從存儲在BLOB中的流中構建一個Java對象。你可以做的是訪問BLOB,但這不會幫助你很多恕我直言。
其實我覺得你在這裏完全是錯誤的道路,使用BLOB並不是正確的路要走(至少不在這裏)。如果您需要堅持它們之間具有1:n關係的對象,則需要相應地建模數據庫。
如果您Record
類有一個與User
類,這是我的理解一對多的關係,那麼你有這樣的事情在Java端:
public class Record {
private Long id;
private User[];
//...
}
然後你需要創建兩個表在數據庫級別,一個用於記錄和其他用戶(一個或多個),並建立一個使用外鍵它們之間的關係(這樣你就可以「附加」用戶記錄):最後
CREATE TABLE record
(
record_id INT NOT NULL,
...,
PRIMARY KEY (record_id)
) TYPE = INNODB;
CREATE TABLE user
(
user_id INT NOT NULL,
record_id INT,
...
PRIMARY KEY (user_id),
INDEX (record_id),
FOREIGN KEY (user_id) REFERENCES record (record_id)
) TYPE = INNODB;
,當堅持一個來自Java的實例,您需要在兩個表中寫入狀態。
- 1. 將Java對象存儲爲MySQL中的BLOB:奇怪的錯誤
- 2. 訪問存儲對象
- 3. 在Ruby中訪問MySQL存儲過程
- 4. 從Java訪問存儲過程%ROWTYPE
- 5. mysql存儲過程問題
- 6. 存儲過程+ mysql問題
- 7. MYSQL存儲過程問題
- 8. Mysql存儲過程問題
- 9. 訪問的Windows Azure Blob存儲
- 10. 訪問Amazon EMR中的Azure blob存儲
- 11. Azure Blob存儲的事務訪問
- 12. 訪問沒有綁定的Blob存儲?
- 13. Java存儲對象
- 14. 使用NSUserDefaults訪問存儲的對象
- 15. 無法通過Python中的azure存儲包訪問blob存儲WebJob
- 16. MYSQL - 存儲過程
- 17. MySQL存儲過程
- 18. MySQL存儲過程
- 19. 存儲過程mysql
- 20. MySQL存儲過程
- 21. MySQL - 存儲過程
- 22. Mysql存儲過程
- 23. MySQl存儲過程
- 24. 存儲過程MySQL
- 25. 如何通過JavaScript訪問Java會話對象存儲JSP
- 26. 傳遞大的BLOB存儲過程
- 27. MySQL的存儲過程
- 28. MySQL的存儲過程
- 29. 存儲過程的MySQL 5.5.16
- 30. MySQL的存儲過程
感謝您的快速回復。但我有一些用戶(根據你的例子),所以我用博客。任何替代方案?我,e計劃看起來像這樣: recordid - 整數 - 主鍵 用戶[] - blob – 2009-12-11 14:25:38
因此,你基本上想要在數據庫中存儲數組?這是一對多的關係?只需創建一個新表格,並將額外的列代表FK到父表格/行。這樣你可以將每個數組插入一個新行。 – BalusC 2009-12-11 15:06:49