流星的孤单 发表于 2019-2-15 09:24

对mybatis逆向工程生成example对象的应用

一、什么是example类
   mybatis的逆向工程中会生成实例及实例对应的example,example用于添加条件,相当where后面的部分,下图符上example和criteria的对象怎么new,其实example对象是mybatis的逆向工程生成的。
   mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的Example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。

一、对example类的应用

package com.example.demo.service;
import com.example.demo.common.ResponseBody;
import com.example.demo.dao.UserMapper;
import com.example.demo.entity.User;
import com.example.demo.utils.PageUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.Map;

/**
* Description:
* 1. 业务层负责处理上层转发下来的请求,进行参数判断,错误处理或抛出,业务逻辑处理,并向下层(持久层)请求需要的数据
* 2. 将处理结果(成功与否,提示信息,处理产生的数据)封装为请求体 (ResponseBody)
* 3. 将处理结果返回给上层,由上层封装到响应报文中返回给请求方
*
* @AuThor yangzhaoyunfei yangzhaoyunfei@qq.com
* @date 18-9-20
*/
@Service
public class UserService {
    @Autowired
    private UserMapper mapper;

    /**
   * example 极大方便了单表的 crud 对多表级联还是原生 sql 强大
   * Criterion 单个条件(单数)
   * Criteria 多个条件(复数)(其中的 Criterion(单) 通过 and / or 等相连,并被外围的一个括号包围),比如:
   * <p>
   * where Criteria1( Criterion1 and Criterion2 and ( Criterion3 or Criterion4) ) or Criteria2( Criterion5 or Criterion6 ... )
   *
   *
   * <p>
   * 1. example 上只能调用 and() / or() 添加复合查询条件 Criteria,
   * 2. 对 Criteria(复) 调用其他方法 添加 Criterion(单) 到 Criteria(复) 中
   * 3. example 携带所有组合的 Criteria(复) (各 Criteria(复)中有数个 Criterion(单),共可以拼成无限长的 where clause ),到数据库中查询结果.
   *
   * @Param paramsMap
   * @return
   */
    public ResponseBody getList(Map<String, Object> paramsMap) {
      //参数校验,错误处理/抛出,业务处理等
      Example example = new Example(User.class);

      //and()方法得到一个Criteria查询条件字句,用and与前面子句相连;Criteria字句字句内还可以放子句
      example.selectProperties("key", "id", "name", "age");//key是测试添加的虚拟字段,表中是没有的,@see User.key 属性

      //单个独立条件( `is_deleted` = 0 )
      example.and().andEqualTo("isDeleted", 0);

      /******************** 测试代码 **************/

      example.or().andEqualTo("age", 3);

//      example


      /******************** 测试代码 **************/


      if (paramsMap.get("keywords") != null && !"".equals(paramsMap.get("keywords"))) {
            //多列模糊搜索 and ( `name` like '%三%' or `nick_name` like '%三%' )
            example.and()
                  .orLike("name", "%" + paramsMap.get("keywords").toString() + "%")
                  .orLike("nickName", "%" + paramsMap.get("keywords").toString() + "%");
      }
      if (paramsMap.get("age") != null) {
            //单值限定 and ( `name` like '%三%' or `nick_name` like '%三%' ) and ( `age` = 3 )
            example.or().andEqualTo("age", Integer.parseInt(paramsMap.get("age").toString()));
      }
      if (paramsMap.get("order") != null && !"".equals(paramsMap.get("order"))) {
            //排序
            switch (paramsMap.get("order").toString()) {
                case "1":
                  //单列/多列(同向/异向)排序
                  example.orderBy("modifyByTime").desc().orderBy("age").orderBy("gender").asc();
                  break;
                case "2":
                  example.orderBy("modifyByTime").asc();
                  break;
                case "3":
                  example.orderBy("createByTime").desc();
                  break;
                case "4":
                  example.orderBy("createByTime").asc();
                  break;
                default:
                  example.orderBy("modifyByTime").desc();
            }

      } else {
            example.orderBy("modifyByTime").desc();
      }
      if (paramsMap.get("group") != null) {
            //分组

      }
      if (paramsMap.get("distinct") != null) {
            //去重
            example.setDistinct(true);
      }
      //设置选取那些列
      example.selectProperties("id");

      /********************** 分页部分 *******************/

      //分页参数,检查及处理
      int pageNum = null != paramsMap.get("currentPage") ? Integer.parseInt(paramsMap.get("currentPage").toString()) : 1;
      int pageSize = null != paramsMap.get("pageSize") ? Integer.parseInt(paramsMap.get("pageSize").toString()) : 10;

      /**
         * 获取第pageNum页(从1开始),pageSize条内容,默认会查询满足条件的总数count,然后limit分页
         * 紧跟着的第一个select方法会被分页,后面的不会被分页,除非再次调用PageHelper.startPage;
         * 实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,或者使用PageInfo类
         * 如:PageInfo page = new PageInfo(list);
         *
         */
      PageHelper.startPage(pageNum, pageSize, true, false, false);
      Page<User> page = (Page) mapper.selectByExample(example);

      //包装成我司需要的结构
      PageUtils pageUtils = new PageUtils(page.getResult(), page.getTotal(), pageSize, pageNum);

      return ResponseBody.ok(pageUtils);
    }
}


请大家不要吝啬手中的免费点评机会哦

呵呵0214 发表于 2019-2-15 16:19

可以用plus吧

流星的孤单 发表于 2019-2-15 16:32

呵呵0214 发表于 2019-2-15 16:19
可以用plus吧

可以,不过我用的是mybatis-generator-core,这2中各有优势吧

reeye 发表于 2019-2-21 18:17

很厉害. 我是用mp的, 没了解过还有这样的用法. 赞一个{:1_893:}
页: [1]
查看完整版本: 对mybatis逆向工程生成example对象的应用