1

我正在研究一个项目的域模型。我有一个名为 user 的类,它有一个名为 UserType 的类作为属性之一。我知道当我想选择所有用户时,我会使用连接来选择所有相应的用户类型。如何进行插入?我必须为 userType 编写处理程序吗?或者我可以做类似的事情

INSERT INTO users(... usertype_id ...) VALUES(... #{usertype.usertype_id}...)

请帮忙;

我花了一整天的时间试图弄清楚这一点。我正在使用 ibatis 3.0,我是 ibatis 的新手。

4

1 回答 1

3

Ibatis 不是一个完整的 ORM 框架,所以它不知道对象关系。所以是的,如果您想直接使用与表中的记录不完全对应的域对象,则必须编写类似INSERT的内容;也就是说,如果您在 Ibatis 中映射的 User 对象没有getUsertypeId()方法(返回与表列 usertype_id 对应的值)而是getUserType()方法。

(当然,您也可以编写一个 getUsertypeId()内部调用的方法getUserType().getId()......但只是停在这里,不要假装也做一个setUserTypeId(int id),它在内部尝试从 Db 加载 UsertypeId 等等......这需要麻烦. 您将结束重新发明 JPA/Hibernate。)

我不认为TypeHandler是正确的方法,该功能更倾向于转换非平凡的类型,而不是处理关系。

另一种有效的方法是有一层相对较低级别的哑 POJO,每个表大约一个,具有直接映射到表列的属性(例如,UserDb具有userTypeId属性但没有getUserType()方法、没有商业智能、依赖关系的对象在上层或持久性知识上),然后,在此之上,一层更丰富的“真实”领域对象,每个对象都包装了那些“哑” POJO 的(通常很小的)图,并具有调用所需的智能持久层(例如 DAO)加载/保存图形(可能是懒惰的)。

这种方法的一个优点是实际 ibatis 映射的核心(SQL 编码)可以使用Ibator相当自动地完成——它甚至可以从 DB 模式创建 POJO 的代码。

对于涉及许多表(报告)的大量数据读取,您可以创建其他简单的临时 POJO(直接对应于 SELECT 的列,并且可能具有一些基本的智能来显示值 - 类似于“ViewModel”) ...甚至是 HashMaps。

PS:您可能想了解DDD(以及“实体”、“值对象”、“视图”、“上下文”、“富域对象”与“贫血域对象”等概念。Ibatis 为您提供了沿此思路学习和实施的很大灵活性。

于 2010-04-26T14:37:21.497 回答