在MyBatis中插入子对象

时间:2011-01-25 00:43:15

标签: java ibatis mybatis

我有一个非常简单的对象图,我想使用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};
        

        
        


1 个答案:

答案 0 :(得分:4)

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

我采取的一种方法是:

我有:

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

  2. 一个DAO层,每个DTO(比如BatisNodeDAO和BatisNodeDetailDAO)的一个服务对象,注入了数据源,标准的insert / loadById / delete和select方法(iBator可以帮到你)

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