吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4366|回复: 3
收起左侧

[Java 转载] 对mybatis逆向工程生成example对象的应用

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

一、对example类的应用

[Java] 纯文本查看 复制代码
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. 将处理结果返回给上层,由上层封装到响应报文中返回给请求方
 *
 * [url=home.php?mod=space&uid=686208]@AuThor[/url] yangzhaoyunfei [email]yangzhaoyunfei@qq.com[/email]
 * [url=home.php?mod=space&uid=686237]@date[/url] 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 ),到数据库中查询结果.
     *
     * [url=home.php?mod=space&uid=952169]@Param[/url] 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是测试添加的虚拟字段,表中是没有的,[url=home.php?mod=space&uid=2660]@see[/url] 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

可以,不过我用的是mybatis-generator-core,这2中各有优势吧
reeye 发表于 2019-2-21 18:17
很厉害. 我是用mp的, 没了解过还有这样的用法. 赞一个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 04:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表