Mybatis Geneator 深入探索


Mybatis Geneator深入了解

XXXExample的结构

![屏幕快照 2018-10-20 下午6.55.07](Mybatis-Geneator-深入探索/屏幕快照 2018-10-20 下午6.55.07.png)

别人的写的动态sql语句

高复用性。低耦合。高内聚

这是使用Geneator生成的代码 我们可以使用Example查询的原理

<sql id="Example_Where_Clause">
  <!--
    WARNING - @mbg.generated
    This element is automatically generated by MyBatis Generator, do not modify.
    This element was generated on Sat Oct 20 16:31:22 CST 2018.
  -->
  <where>
    <foreach collection="oredCriteria" item="criteria" separator="or">
      <if test="criteria.valid">
        <trim prefix="(" prefixOverrides="and" suffix=")">
          <foreach collection="criteria.criteria" item="criterion">
            <choose>
              <when test="criterion.noValue">
                and ${criterion.condition}
              </when>
              <when test="criterion.singleValue">
                and ${criterion.condition} #{criterion.value}
              </when>
              <when test="criterion.betweenValue">
                and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
              </when>
              <when test="criterion.listValue">
                and ${criterion.condition}
                <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                  #{listItem}
                </foreach>
              </when>
            </choose>
          </foreach>
        </trim>
      </if>
    </foreach>
  </where>
</sql>

##解析复杂查询语句

过程

1.创建XXXExample实例(创建oredCriteria数组 存放Criteria)

2.通过createCriteria()方法获得XXXExample的Criteria对象 (创建criteria数组 存放Criteria)

3.为每个Criteria对象添加查询条件(创建Criterion 把它加入Criteria数组中)

4.增加or条件: 只有第一个Criteria对象会被加入到oredCriteria数组中 ,所以需要使用XXXExample.or()方法把接下来每个语句添加到oredCriteria数组中

5.通过动态sql语句把XXXExample当做参数执行查询

oredCriteria

这是一个 List 的数组 在sql中每个 Criteria之间的用 or 联系

Criteria

在每次通过createCriteria创建一个criteria的时候 都会新建一个Criteria实例 并且添加到oredCriteria数组中

public Criteria createCriteria() {
    Criteria criteria = createCriteriaInternal();//仅仅创建并返回一个Criteria对象
    if (oredCriteria.size() == 0) {
        oredCriteria.add(criteria);
    }
    return criteria;
}

创建criteria对象隐藏的秘密

protected abstract static class GeneratedCriteria 这个静态抽象类中有一个字段名叫做critera 其实就是一个存放Criterion的数组而 Criteria (public static class Criteria extends GeneratedCriteria)继承了GeneratedCriteria类

protected List<Criterion> criteria;
protected Criteria createCriteriaInternal() {
    Criteria criteria = new Criteria();  //该构造方法 其实是调用super()
    return criteria;
}
//而super又调用了
protected GeneratedCriteria() {
    super();
    criteria = new ArrayList<Criterion>();
}

我们可以说每个Criteria中最重要的数据成员是List criteria;

我们每次通过andXXXXXXX语句增加的条件全都被保存到了Criterion中 ,进而在保存到Criteria中

Criterion

关键字段condition和value 前者代表sql语句 后者代表sql语句跟随的参数

![屏幕快照 2018-10-20 下午7.19.03](Mybatis-Geneator-深入探索/屏幕快照 2018-10-20 下午7.19.03.png)

每次XXXExample.Criteria执行andXXXX方法的时候都会调用如addCriterion()的方法

比如:

public Criteria andAddressIdEqualTo(Integer value) {
    addCriterion("address_id =", value, "addressId");
    return (Criteria) this;
}


 protected void addCriterion(String condition, 
 Object value, String property) {
            if (value == null) {
                throw new RuntimeException("Value for " + property + " cannot be null");
            }
            criteria.add(new Criterion(condition, value));
        }

就是创建一个Criterion 并且把它加入到Criteria数组中

我们可以理解成 每个Criteria数组 代表一系列语句如(A and B and C)而每个Criterion则代表了A B C

###or的实现

经过了前面的了解和观察sql和通过以下

public Criteria createCriteria() {
    Criteria criteria = createCriteriaInternal();
    if (oredCriteria.size() == 0) {
        oredCriteria.add(criteria);
    }
    return criteria;
}

得出新建Criteria实例的时候只有第一个criteria会被添加到oredCriteria中

所以得出:

or 的实现其实很简单 即:在每个存放Criteria数组的数组oredCriteria中添加另外一个Criteria数组就可以实现。

public Criteria or() {
    Criteria criteria = createCriteriaInternal();
    oredCriteria.add(criteria);
    return criteria;
}


文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录