MYSQL хранимая процедура доступа к Java-объекту, хранящемуся как BLOB

0

Я храню объект Java в виде байта в блоке таблицы. Объект java - это настроенный объект. Как я могу создать объект java и использовать его в хранимой процедуре?

Теги:
stored-procedures
object

2 ответа

1

Пусть класс реализует java.io.Serializable, чтобы вы могли получить InputStream его, который вы можете сохранить в БД, используя CallableStatement#setBinaryStream().

Тем не менее, это обычно считается плохим дизайном. Если класс на самом деле является классом Javabean, вам лучше создать таблицу со столбцами, которая представляет свойства Javabean. Например. a public class User { private Long id; private String name; private Integer age; } следует сопоставить с таблицей типа CREATE TABLE user ( id BIGINT AUTO_INCREMENT, name VARCHAR, age INTEGER )

Изменить как ответ на ваш комментарий: вы, таким образом, хотите хранить массив как двоичный объект. Это очень плохая идея. Таким образом, вы не можете искать данные массива в базе данных, и база данных также не будет переноситься больше. Просто создайте новую таблицу, которая представляет каждый элемент массива. Добавьте к нему дополнительный столбец, который представляет идентификатор родительского объекта (на самом деле это должен быть 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. Для примера рассмотрите учебник по SQL на w3schools.com и документацию SQL для конкретного поставщика.

  • 0
    Спасибо за ваш быстрый ответ. Но у меня есть массив User (согласно вашему примеру), поэтому я использовал блог. Любое альтернативное решение? схема выглядит следующим образом: recordid - integer - первичный ключ user [] - blob
  • 0
    Так вы в принципе хотите хранить массив в БД? Это отношение один ко многим? Просто создайте новую таблицу с дополнительным столбцом, представляющим FK для родительской таблицы / строки. Таким образом, вы можете просто вставить каждый массив как новую строку.
0

Как я могу создать объект java и использовать его в хранимой процедуре?

Это невозможно, по крайней мере, не с MySQL. В отличие от Oracle, который поддерживает Хранимые процедуры Java, синтаксис хранимых процедур MySQL основан на простом стандарте ANSI SQL. Поэтому я не вижу, как вы могли бы построить объект Java из потока, хранящегося в BLOB. То, что вы можете сделать, это доступ к 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;

Наконец, при сохранении экземпляра Record из Java вам нужно будет записать состояние в обе таблицы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню