MYSQL存储过程访问存储为BLOB的java对象

时间:2009-12-11 12:45:52

标签: java mysql stored-procedures object

我将Java对象作为字节存储在表的blob中。 java对象是自定义对象。如何构造java对象并在存储过程中使用它?

2 个答案:

答案 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实例时,您需要在两个表中写入状态。