2

I have a very simple object graph that I want to store in a database using MyBatis. If I make a brand new object graph (a BatisNode with two details), how do I write code to be sure the child objects are created? Here are the details:


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.
}

Schema:

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)
);

Mapper:

    
        
INSERT INTO node (
  name
)
SELECT #{name};
        

        
SELECT node_id id,
name
FROM node
WHERE node_id=#{id};
        

        
        


4

1 回答 1

4

Ibatis/Mybatis 不是 ORM,只是一个 DataMapper,并且在这些场景(对象图)中特别显示了简单性/限制:它(基本上)不知道对象图。

我采取的一种方法是:

我有:

  1. 一层轻量级 POJO 对象(“DTO 对象”),每个对象对应一个数据库表(一个对象 <-> 数据库表的一个记录),它们只有属性(例如您的 BatisNode 和 BatisNodeDetail 示例)

  2. 一个 DAO 层,每个 DTO 的一个服务对象(例如,BatisNodeDAO 和 BatisNodeDetailDAO),并注入了数据源,以及标准的 insert/loadById/delete 和 select 方法(iBator可以在这里为您提供帮助)

  3. 服务层除了具有典型的服务类(通常是单例)之外,还定义了一些重量级对象(“域对象”),它们处理这些对象,并且通常对应于 DTO 对象图(在您的示例中为 BatisNodeWithDetails )。这些域对象知道如何加载/保存包装 DTO 的图形,调用 DAO(以及处理事务,检测“脏”对象等)。请注意,对于不同的服务方法或用例,可以有几个“域类”包装相同的 DTO(即不同的图)。

于 2011-01-25T01:02:28.810 回答