0


0

BLOBとして保存されたJavaオブジェクトにアクセスするMYSQLストアドプロシージャ

Javaオブジェクトをテーブルのblobにバイトとして保存しています。 Javaオブジェクトはカスタマイズされたオブジェクトです。 javaオブジェクトを構築してストアドプロシージャで使用するにはどうすればよいですか?

2 Answer


1


クラスにhttp://java.sun.com/developer/technicalArticles/Programming/serialization/ [java.io.Serializable]を実装させて、DBに保存できる「InputStream」を取得できるようにしますhttp://java.sun.com/javase/6/docs/api/java/sql/CallableStatement.html#setBinaryStream%28java.lang.String,%20java.io.InputStream%29 [CallableStatement#setBinaryStream() ]。

とはいえ、これは通常、悪い設計と見なされます。 クラスが実際にJavabeanクラスである場合、Javabeanプロパティを表す列を持つテーブルを作成することをお勧めします。 E.g. public class User {private Long id;プライベート文字列名。プライベート整数年齢; } `は、 CREATE TABLE user(id BIGINT AUTO_INCREMENT、name VARCHAR、age INTEGER) `のようなテーブルにマッピングする必要があります

コメントの返信として*編集*:したがって、基本的には配列をバイナリオブジェクトとして保存する必要があります。 これはとても悪い考えです。 この方法では、データベース内で配列のデータを検索できず、データベースも移植できなくなります。 各配列項目を表す新しいテーブルを作成するだけです。 親オブジェクトのIDを表す追加の列を追加します(実際には、配列を含む親オブジェクトがマップされるテーブルのPKである必要があります。

例:

public class Parent {
    private Long id;
    private String someData;
    private List 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ドキュメントを確認してください。


0


_ javaオブジェクトを構築してストアドプロシージャで使用するにはどうすればよいですか? _

これは、少なくともMySQLでは不可能です。 Java Stored ProceduresをサポートするOracleとは異なり、MySQLのストアドプロシージャ構文はプレーンなANSI SQL標準に基づいています。 したがって、BLOBに格納されたストリームからJavaオブジェクトを構築する方法はわかりません。 できることはBLOBにアクセスすることですが、これは私見の助けにはなりません。

実際、BLOBを使用するのは正しい方法ではありません(少なくともここではそうではありません)。 オブジェクト間に1:nの関係があるオブジェクトを永続化する必要がある場合は、それに応じてデータベースをモデル化する必要があります。

Record`クラスが User`クラスと1対多の関係にある場合(これは私の理解です)、Java側には次のようなものがあります。

public class Record {
    private Long id;
    private User[];
    //...
}

次に、データベースレベルで2つのテーブルを作成する必要があります。1つはレコード用、もう1つはユーザー用で、外部キーを使用してテーブル間の関係をモデル化します(ユーザーをレコードに「アタッチ」できます)。

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`インスタンスを永続化する場合、両方のテーブルに状態を書き込む必要があります。