Java设计模式之组合模式

本文介绍了组合模式在Mybatis框架中的SqlNode中的应用,展示了如何通过树形结构清晰表示对象层次,以及如何利用组合设计模式简化客户端代码,同时讨论了SqlSource和SqlNode的关系以及它们在动态SQL配置中的作用。
摘要由CSDN通过智能技术生成

组合模式定义与类型

定义

将对象组合成树形结构以表示 “部分-整体” 的层次结构

组合模式使客户端对单个对象和组合对象保持一致的方式处理

类型:结构型

适用场景

希望客户端可以忽略组合对象与单个对象的差异时

处理一个树形结构时

优点

清楚地定义分层次的复杂对象,表示对象的全部或部分层次

让客户端忽略了层次的差异,方便对整个层次结构进行控制

简化客户端代码

符合开闭原则

缺点

限制类型时会较为复杂

使设计模式变得更加抽象

类图

组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。

组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。

在源码中的使用

mybatis的SqlNode

mybatis的SqlNode(SqlNode是mybatis动态SQL功能的重要组成部分)

例如下面这段sql中,<if></if>标签所包含的内容则是mybatis动态sql功能最基本的体现,他能实现如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果
 

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

mybatis提供的动态sql类型有:

  • if
  • choose
  • when
  • otherwise
  • trim
  • where
  • set
  • foreach
  • script
  • bind
SqlSource和SqlNode的关系

文章开始之前需要搞明白代码中的SqlSource和SqlNode分别是什么,以及他们的关系是什么。这两个关系搞不清的话,看代码就会比较懵逼。

他们的关系如上图所示,SqlSource和SqlNode的关系是一对多的关系。

SqlNode

如上所述,SqlNode是动态sql配置在程序中的组织形式,每个 XML Node 会解析成对应的 SqlNode 对象。其类图如下

SqlNode的各个实现类使用了组合设计模式,mybatis通过使用组合设计模式帮助上层调用者屏蔽了对象的复杂性,也使得如果后续需要添加新的SqlNode类型的话,会变得非常容易,符合开闭原则。

SqlNode的数据结构

SqlNode的数据结构很像一个树结构,MixedSqlNode节点为树枝,其余类型为树叶。其结构大致如下:

关于mybatis sqlNode的详细内容解析可以查看这篇博客mybatis源码学习------动态sql的解析(SqlNode)_A股慈善家的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值