Java中带有序列化的LinkedList

Java中带有序列化的LinkedList,java,mysql,serialization,linked-list,Java,Mysql,Serialization,Linked List,我开始学习序列化,并在将其与LinkedList 假设我有下表: CREATE TABLE JAVA_OBJECTS ( ID BIGINT NOT NULL UNIQUE AUTO_INCREMENT, OBJ_NAME VARCHAR(50), OBJ_VALUE BLOB ); 我计划存储3种对象类型-因此表可能看起来像这样- ID OBJ_NAME OBJ_VALUE ============================ 1 Class1

我开始学习序列化,并在将其与
LinkedList

假设我有下表:

CREATE TABLE JAVA_OBJECTS   (
    ID BIGINT NOT NULL UNIQUE AUTO_INCREMENT,
    OBJ_NAME VARCHAR(50),
    OBJ_VALUE BLOB
);
我计划存储3种对象类型-因此表可能看起来像这样-

ID  OBJ_NAME    OBJ_VALUE
============================
1   Class1      BLOB
2   Class2      BLOB
3   Class1      BLOB
4   Class3      BLOB
5   Class3      BLOB
我将使用3种不同的
链接列表来管理这些对象

我已经能够实现
LoadFromTable()
StoreIntoTable(class1obj1)
。 我的问题是-如果我在
LinkedList
中更改
Class2
对象的属性,我如何在数据库中对此单个项目进行更改?还要考虑到
LinkedList
中元素的顺序可能会改变

谢谢:)

*编辑
是的,我知道我必须删除/更新数据库表中的一行。但是如何跟踪要更新的行?我只是将对象存储在列表中,而不是将它们各自的ID存储在表中。

如果更改对象中的属性或项目顺序。您必须删除该行并再次插入更新的列表。

如果您更改对象中的属性或项目顺序。您必须删除该行并再次插入更新的列表

How do i effect the change in the DB for this individual item?
我希望我没弄错。SQL update和delete语句允许您添加WHERE子句,在该子句中选择要更新的行的ID

e、 g

编辑:

为了防止ID出现问题,可以包装对象

class Wrapper {
   int  dbId;
   Object obj;
}
并将它们而不是“裸体”对象添加到LinkedList中

我希望我没弄错。SQL update和delete语句允许您添加WHERE子句,在该子句中选择要更新的行的ID

e、 g

编辑:

为了防止ID出现问题,可以包装对象

class Wrapper {
   int  dbId;
   Object obj;
}
并将它们而不是“裸”对象添加到LinkedList中,您可以将其用于表,然后使用函数检索分配给上一条INSERT/UPDATE语句添加/更新的行的id。同时维护从java对象到Id的映射(如HashMap)。使用此映射,您可以跟踪要删除/更新的行

编辑:也可以查看的答案。

您可以将其用于表,然后使用该函数检索分配给上一条INSERT/UPDATE语句添加/更新的行的id。同时维护从java对象到Id的映射(如HashMap)。使用此映射,您可以跟踪要删除/更新的行


编辑:查看的答案。

您必须将其ID存储在您存储的对象中。但是,我建议不要尝试运行自己的ORM系统,而是使用Hibernate之类的工具。

您必须将它们的ID存储在正在存储的对象中。但是,我建议不要尝试使用自己的ORM系统,而是使用Hibernate之类的工具。

我认为这里真正的问题是,混合和匹配不同的抽象级别。通过将序列化java对象存储为关系数据库作为BLUB,您必须考虑几个缺点:

  • 你失去了互操作性。用Java以外的其他语言编写的应用程序无法读回数据。甚至其他Java应用程序也必须在其类路径中包含序列化类的类文件
  • 更改存储类的类定义将导致维护噩梦
  • 您放弃了关系数据库的优势。序列化从数据库中隐藏实际数据。因此,数据库只显示一个黑盒。您无法对实际数据执行任何有意义的查询。您所拥有的只是ID和字节块
  • 您必须自己实现低级数据处理。实际上,数据库是为了有效地处理您的数据而设计的,但是由于序列化,您阻碍了它的工作。所以你现在只能靠自己了,你正在遇到这个问题
因此,在大多数情况下,你会从工作中受益并使用正确的工具

以下是一些建议:

将应用程序内部的内部数据处理与持久性存储分开。设计数据库模式时,应使内置数据库功能能够有效地处理数据。对于像MySQL这样的关系数据库,您可以从不同的技术(如普通JDBC)、对象关系映射器(如JPA)或简单映射器(如MyBatis)中进行选择。这里的分离意味着避免因实现特定的问题而污染数据库

例如,如果您的Java应用程序中有一个Person实例列表,那么每个Person都包含一个姓名和一个年龄。然后,您可以将关系数据库中的列表表示为一个表,该表由一个VARCHAR字段表示名称,一个数字字段表示年龄,可能还有第三个字段表示唯一键。然后数据库就可以做它能做的最好的事情:管理大量的数据

在应用程序内部,通常将持久层与包含与数据库通信的代码的程序的其余部分分开

在某些用例中,关系数据库可能不是合适的工具。也许在一个只有一小部分数据的单用户桌面应用程序中,最好将您的人员列表序列化为一个普通文件,并在下次启动时重新读取

但是,还有其他方法可以持久化您的数据。也许某种面向对象的数据库是正确的工具。特别是我对快速物体有经验。作为一种简化,这是类固醇的系列化。在应用程序和数据库之间不需要像JPA或JDBC这样的层。您可以将类实例直接存储到数据库中。但与具有BLOB字段的关系数据库不同,OODB知道您的类和实际数据,并且可以从中受益

另一种选择可能是