tk.Mybatis通过泛型扩展通用查询单表API接口

需求原因

现在有单表查询需求,但是表数量众多,查询字段不确定,还需要使用时间区间进行查询(使用的时间字段可能会更新,也可能会增加其他查询条件)。

 

思路

构造一个基类保存查询参数和查询泛型。使用公共方法,查询任意字段的值和时间字段的区间,可在子类扩展任意查询方法

 

查询基类

QueryBase

package cn.?.model;

import lombok.Data;

import java.util.List;

/**
 * @author XiongJl
 * @date 2020/7/27 15:48
 */
@Data
public class QueryBase {
    public T t;
    public List params;
    public String startTime;
    public String endTime;
    /**
     * 哪个字段需要查询时间段
     */
    public String betweenParam;

    public T getObj(){
        return t;

    }
    public QueryBase(T obj){
        this.t = obj;
    }
    public QueryBase(){};
}

 

子类继承基类时指定查询的实体类

QueryPerson

指定查询Person表

package cn.?.model;

import cn.?.entity.Person;
import lombok.Data;

import java.util.List;

/**
 * 用于查询的组合实体类
 * @author XiongJL
 * @date 2020/7/27 15:04
 */
@Data
public class QueryPerson extends QueryBase{
}

QueryCity

package cn.?.model;

import cn.?.entity.City;
import lombok.Data;

/**
 * 用于查询的组合实体类
 * @author XiongJL
 * @date 1111/11/11 11:11
 */
@Data
public class QueryCity extends QueryBase{
}

Mapper

PersonMapper , CityMapper雷同

package cn.?.mapper;

import cn.?.entity.Person;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

/**
 * @author XiongJl
 * @date 2020/6/22 10:57
 */
@Repository
public interface PersonMapper extends Mapper {

}

查询工具类

QueryUtil

package cn.?.basic.common;

import cn.aps.common.exception.MyTransactionException;
import cn.aps.common.utils.ResultUtil;
import cn.aps.entity.Result;
import cn.aps.model.QueryBase;
import com.alibaba.druid.util.StringUtils;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @author XiongJl
 * @date 2020/7/28 8:52
 */
public class QueryUtil {
    /**
     * 通常处理查询方法
     *
     * 查询实体类
     * @param q 请求的参数实体类
     * @param example {@link Example} 对应的实体类Example对象
     * @param mapper 对应实体类的mapper接口
     * @return 返回Result对象,可以根据自己需求变更返回内容
     */
    public static Result commonQueryResult(QueryBase q, Mapper mapper, Example example) {
        boolean isAnyCondition = false;
        // 0x1 :获取对象Clazz
        if (q==null){
            return ResultUtil.fail("查询条件为空");
        }
        List params = q.getParams();
        // 0x2 :构造查询语句
        Object obj = q.getObj();
        Example.Criteria criteria = example.createCriteria();
        try {
            if (params!=null && params.size()>0){
                Class clazz = obj.getClass();
                Field[] fields = clazz.getDeclaredFields();
                for (int i=0;i

 

 

正戏:

调用

Controller

    
    @AutoWired
    PersonMapper personMapper;
    @AutoWired
    CityMapper cityMapper;

    /**
     * 获取Person
     * 根据起使时间、任意字段条件的AND拼接查询
     * @param qPerson 用于查询的组合实体类
     * @return
     */
    @PostMapping("/getPerson")
    public Result getPerson( QueryPerson qPerson) {
        Example example = new Example(Person.class);
        return QueryUtil.commonQueryResult(qPerson,personMapper,example);
    }

    /**
     * 获取City
     * 根据起使时间、任意字段条件的AND拼接查询
     * @param qCity 用于查询的组合实体类
     * @return
     */
    @PostMapping("/getCity")
    public Result getPerson(QueryCity qCity ) {
        Example example = new Example(City.class);
        return QueryUtil.commonQueryResult(qCity,cityMapper,example);
    }

 

 

再增加单表的查询或者增加查询条件可以新增子类,和子类的查询方法,

 

 

 

 

 

你可能感兴趣的:(tk.Mybatis通过泛型扩展通用查询单表API接口)