mybatis generator 自动生成的拼装sql分析

0.使用的场景
1.自己的实现: 一个简单的实现例子

2.成熟的解决方案: mybatis generator

3.源码分析

  • java example

    点击查看代码
        public class JobLogExample {
      protected String orderByClause;
    
      protected boolean distinct;
    
      protected List<Criteria> oredCriteria;
    
      public JobLogExample() {
          oredCriteria = new ArrayList<Criteria>();
      }
    
      public void setOrderByClause(String orderByClause) {
          this.orderByClause = orderByClause;
      }
    
      public String getOrderByClause() {
          return orderByClause;
      }
    
      public void setDistinct(boolean distinct) {
          this.distinct = distinct;
      }
    
      public boolean isDistinct() {
          return distinct;
      }
    
      public List<Criteria> getOredCriteria() {
          return oredCriteria;
      }
    
      public void or(Criteria criteria) {
          oredCriteria.add(criteria);
      }
    
      public Criteria or() {
          Criteria criteria = createCriteriaInternal();
          oredCriteria.add(criteria);
          return criteria;
      }
    
      public Criteria createCriteria() {
          Criteria criteria = createCriteriaInternal();
          if (oredCriteria.size() == 0) {
              oredCriteria.add(criteria);
          }
          return criteria;
      }
    
      protected Criteria createCriteriaInternal() {
          Criteria criteria = new Criteria();
          return criteria;
      }
    
      public void clear() {
          oredCriteria.clear();
          orderByClause = null;
          distinct = false;
      }
    
      protected abstract static class GeneratedCriteria {
          protected List<Criterion> criteria;
    
          protected GeneratedCriteria() {
              super();
              criteria = new ArrayList<Criterion>();
          }
    
          public boolean isValid() {
              return criteria.size() > 0;
          }
    
          public List<Criterion> getAllCriteria() {
              return criteria;
          }
    
          public List<Criterion> getCriteria() {
              return criteria;
          }
    
          protected void addCriterion(String condition) {
              if (condition == null) {
                  throw new RuntimeException("Value for condition cannot be null");
              }
              criteria.add(new Criterion(condition));
          }
    
          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));
          }
    
          protected void addCriterion(String condition, Object value1, Object value2, String property) {
              if (value1 == null || value2 == null) {
                  throw new RuntimeException("Between values for " + property + " cannot be null");
              }
              criteria.add(new Criterion(condition, value1, value2));
          }
    
          public Criteria andIdIsNull() {
              addCriterion("id is null");
              return (Criteria) this;
          }
    
          public Criteria andIdIsNotNull() {
              addCriterion("id is not null");
              return (Criteria) this;
          }
    
          public Criteria andIdEqualTo(Long value) {
              addCriterion("id =", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdNotEqualTo(Long value) {
              addCriterion("id <>", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdGreaterThan(Long value) {
              addCriterion("id >", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdGreaterThanOrEqualTo(Long value) {
              addCriterion("id >=", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdLessThan(Long value) {
              addCriterion("id <", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdLessThanOrEqualTo(Long value) {
              addCriterion("id <=", value, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdIn(List<Long> values) {
              addCriterion("id in", values, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdNotIn(List<Long> values) {
              addCriterion("id not in", values, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdBetween(Long value1, Long value2) {
              addCriterion("id between", value1, value2, "id");
              return (Criteria) this;
          }
    
          public Criteria andIdNotBetween(Long value1, Long value2) {
              addCriterion("id not between", value1, value2, "id");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeIsNull() {
              addCriterion("create_time is null");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeIsNotNull() {
              addCriterion("create_time is not null");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeEqualTo(Date value) {
              addCriterion("create_time =", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeNotEqualTo(Date value) {
              addCriterion("create_time <>", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeGreaterThan(Date value) {
              addCriterion("create_time >", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
              addCriterion("create_time >=", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeLessThan(Date value) {
              addCriterion("create_time <", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
              addCriterion("create_time <=", value, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeIn(List<Date> values) {
              addCriterion("create_time in", values, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeNotIn(List<Date> values) {
              addCriterion("create_time not in", values, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeBetween(Date value1, Date value2) {
              addCriterion("create_time between", value1, value2, "createTime");
              return (Criteria) this;
          }
    
          public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
              addCriterion("create_time not between", value1, value2, "createTime");
              return (Criteria) this;
          }
    }
    

}

```
</details>
  • java mapper

    List<JobLog> selectByExample(JobLogExample example);
    
    int updateByExampleSelective(@Param("record") JobLogrecord, @Param("example") JobLogExample example);
    
  • mybatis xml

    Example_Where_Clause
    <sql id="">
        <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>
    
    Update_By_Example_Where_Clause
    <sql id="Update_By_Example_Where_Clause">
        <where>
          <foreach collection="example.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>
    

4.常见的问题

posted @ 2022-05-26 09:20  Appinn  阅读(237)  评论(0编辑  收藏  举报