2011-01-25 75 views
2

我有一個非常簡單的對象圖,我想使用MyBatis存儲在數據庫中。如果我製作一個全新的對象圖(具有兩個細節的BatisNode),如何編寫代碼以確保創建子對象?下面是詳細信息:在MyBatis中插入子對象

 

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

     
     


回答

4

ibatis的/ MyBatis的是不是一個ORM,只是一個DataMapper的,和簡單/限制表示特別是在這些場景(對象圖):它(基本上)不知道對象的圖。

一種方法我已經採取這是:

我有:

  1. 輕量級POJO對象( 「DTO對象」)的層,每一個對應於一個數據庫表(一個對象< - > db表中的一條記錄),它們只有屬性(比如你的BatisNode和BatisNodeDetailDAO例子)

  2. DAO層,每個DTO(比如說BatisNodeDAO和BatisNodeDetailDAO)的一個服務對象與數據源注入d,標準插入/ loadById /刪除和選擇的方法(iBator可以幫助你在這裏)

  3. 服務層,除了具有典型的服務類(單身正常),還定義了一些重量級的對象,(「域對象「),它們處理的內容通常對應於DTO對象的圖形(在您的示例中爲BatisNodeWithDetails)。這些領域對象知道如何加載/保存包裝DTO的圖形,調用DAO(並處理事務,檢測「髒」對象等)。注意,對於不同的服務方法或用例,可以有幾個包含相同DTO(也就是不同圖)的「域類」。

+0

感謝您的建議。這是我的第一個batis項目。這聽起來像是兩件物品的相當一部分工作。我在現實生活中有更多的工作。冬眠會是一個更好的選擇嗎? – User1 2011-01-25 14:25:56