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
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
我们每次通过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;
}