Я храню объект Java в виде байта в блоке таблицы. Объект java - это настроенный объект. Как я могу создать объект java и использовать его в хранимой процедуре?
Пусть класс реализует 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 для конкретного поставщика.
Как я могу создать объект 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 вам нужно будет записать состояние в обе таблицы.