使用MyBatis映射树?

时间:2015-02-15 03:08:20

标签: java java-8 mybatis ibatis

我试图通过设置树结构并将其映射到MyBatis来混淆我的方式。我的表定义为;

CREATE TABLE `Hierarchy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parentId` int(11) NULL DEFAULT NULL,
  `name` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我尝试在MyBatis中使用;

进行关联
@Select(SELECT_ALL)
    @Results(value = {
            @Result(property = "id", column = "id"),
            @Result(property = "children", column = "parentId",
                    jdbcType = JdbcType.NUMERIC,
                    many = @Many(select = "selectById")),
            @Result(property = "name", column = "name")
    })
    List<Hierarchy> selectAll();

我的班级有;

private Integer id;
private Integer parentId;
private String name;
private List<Hierarchy> children;

我很快就意识到这不会起作用,因为它最终会向后关联,并且我会在结果集中多次让孩子回来。那么答案是什么?我做完选择之后是否必须进行迭代并以这种方式填充我的孩子?

我尝试了一些方法,但它们看起来都非常低效,而且我发现很难处理父ID的前向引用而不重复列表两次。

那么,有没有人在此之前撤下这个?这个诀窍是什么?

1 个答案:

答案 0 :(得分:1)

几年前我和iBatis一起做过这件事,并且从未对结果感到满意。我的树是只读的,简化了代码。我还需要上下导航树,因此每个记录都有一个父类指针。算法(使用你的类名等)是:

  1. 将整个数据库表读入List。这只是使用了“select * from hierarchy”和标准结果映射。
  2. 遍历列表,在主键上形成索引(Map),并注意根元素,该元素应该是唯一具有null parentId的记录。
  3. 第二次遍历列表,从Map查找每个项目的父记录,并调用 this.setParent(Hierarchy parent) parent.addChild(Hierarchy child)
  4. 这一切都很好,但远非优雅。如你所知,它需要两次通过列表。如果您找到更好的方法,请分享。