我有一个非常简单的对象图,我想使用MyBatis存储在数据库中。如果我创建一个全新的对象图(带有两个细节的BatisNode),如何编写代码以确保创建子对象?以下是详细信息:
public class BatisNode {
protected int id;
protected List details;
protected String name;
//Constructor and getters.
}
public class BatisNodeDetail {
protected int id;
protected BatisNode parent;
protected String name;
//Constructor and getters.
}
架构:
CREATE TABLE node ( node_id int auto_increment primary key, name varchar(255) ); CREATE TABLE node_detail( node_detail_id int auto_increment primary key, name varchar(255) );
映射器:
INSERT INTO node ( name ) SELECT #{name}; SELECT node_id id, name FROM node WHERE node_id=#{id};
答案 0 :(得分:4)
Ibatis / Mybatis不是一个ORM,只是一个DataMapper,简单/限制特别在这些场景中显示(对象图):它(基本上)不知道对象的图形。
我采取的一种方法是:
我有:
一层轻量级POJO对象(“DTO对象”),每个对应一个数据库表(一个对象< - >一个db表的记录),它们只有属性(比如你的BatisNode和BatisNodeDetail示例)
一个DAO层,每个DTO(比如BatisNodeDAO和BatisNodeDetailDAO)的一个服务对象,注入了数据源,标准的insert / loadById / delete和select方法(iBator可以帮到你)
服务层除了具有典型的服务类(通常是单例)外,还定义了一些重量级对象(“域对象”),它们处理这些对象,并且通常对应于DTO对象的图形(在你的例子中,一个BatisNodeWithDetails)。这些域对象知道如何加载/保存包装DTO的图形,调用DAO(以及处理事务,检测“脏”对象等)。请注意,对于不同的服务方法或用例,可能有几个“域类”包装相同的DTO(也就是说,不同的图形)。