我将Java对象作为字节存储在表的blob中。 java对象是自定义对象。如何构造java对象并在存储过程中使用它?
答案 0 :(得分:1)
让课程实施java.io.Serializable
,以便您可以使用CallableStatement#setBinaryStream()
获取InputStream
的数据,然后将其存储在数据库中。
那就是说,这通常被认为是一个糟糕的设计。如果该类实际上是一个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 )
编辑作为评论的回复:因此,您基本上希望将数组存储为二进制对象。这是一个非常糟糕的主意。这样您就无法在数据库中搜索数组的数据,并且数据库也不再可移植。只需创建一个表示每个数组项的新表。向其添加一个额外的列,表示父对象的ID(实际上,它应该是包含该数组的父对象所映射到的表的PK。
示例:
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文档。
答案 1 :(得分:0)
如何构造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持久化Record
实例时,您需要在两个表中写入状态。