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 为您提供了沿此思路学习和实施的很大灵活性。