我正在介绍序列化,并在与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个不同的LinkedList
来管理这些对象..
我已经能够实施LoadFromTable()
和StoreIntoTable(Class1 obj1)
。
我的问题是 - 如果我在Class2
中更改LinkedList<Class2>
对象的属性,如何影响此单个项目的数据库更改?还要考虑LinkedList
中元素的顺序可能会发生变化..
谢谢:)
*编辑 是的,我知道我必须删除/更新我的数据库表中的一行。但是我如何跟踪要更新的WHICH行?我只是将对象存储在List中,而不是表中的各自ID。
答案 0 :(得分:1)
您必须将ID存储在您正在存储的对象中。但是,我建议不要尝试使用自己的ORM系统,而是使用像Hibernate这样的东西。
答案 1 :(得分:0)
如果更改对象中的属性或项目的顺序。您将不得不删除该行并再次插入更新的列表。
答案 2 :(得分:0)
How do i effect the change in the DB for this individual item?
我希望我能帮到你。 SQL update和delete语句允许您添加一个WHERE子句,您可以在其中选择要更新的行的ID。
e.g。
UPDATE JAVA_OBJECTS SET OBJ_NAME ="new name" WHERE ID = 2
编辑:
为了防止你的ID问题你可以包裹你的对象
class Wrapper {
int dbId;
Object obj;
}
将它们而不是'naked'对象添加到LinkedList
中答案 3 :(得分:0)
您可以对表使用AUTO_INCREMENT attribute,然后使用mysql_insert_id()函数检索分配给上一个INSERT / UPDATE语句添加/更新的行的ID。与此一起维护从java对象到Id的映射(例如HashMap)。使用此地图,您可以跟踪要删除/更新的行。
修改:同时查看this question的答案。
答案 4 :(得分:0)
我认为这里真正的问题是,你混合和匹配不同的抽象层次。通过将序列化的Java对象作为BLOB存储到关系数据库中,您必须考虑几个缺点:
因此,在大多数情况下,您可以从separation of concerns获益并使用正确的工具来完成工作。
以下是一些建议:
将应用程序内部的内部数据处理与持久存储分开。设计数据库模式的方式是使内置数据库功能能够有效地处理数据。对于像MySQL这样的关系数据库,您可以选择不同的技术,如纯JDBC,像JPA这样的对象关系映射器或像MyBatis这样的简单映射器。这里的分离意味着避免因实现特定问题而污染数据库。
例如,如果您在Java应用程序中有一个Person实例列表,每个Person都包含一个名称和一个年龄。然后,您将在关系数据库中将该列表表示为一个表,该表包含名称的VARCHAR字段和年龄的数字字段,以及可能是唯一键的第三个字段。然后数据库能够做到最好:管理大量数据。
在应用程序内部,您通常将持久层与包含代码的程序的其余部分分开,以与数据库进行通信。
在某些用例中,关系数据库可能不是合适的工具。也许在具有少量数据的单个用户桌面应用程序中,最好将您的Person列表序列化为普通文件并在下次启动时将其读回。
但是还有其他替代方法可以保留您的数据。也许某种面向对象的数据库是正确的工具。特别是我有快速对象的经验。作为简化,它是类固醇的序列化。在您的应用程序和数据库之间不需要像JPA或JDBC这样的层。您可以将类实例直接存储到数据库中。但与具有BLOB字段的关系数据库不同,OODB知道您的类和实际数据,并且可以从中受益。
另一种选择可能是JDBM或Berkeley DB。
因此,关注点的分离和选择正确的持久性策略(并以正确的方式使用它)是项目成功的关键问题。但即使对于有经验的开发人员来说,做正确也很难