Mybatis plus+QueryWrapper+Swagger2实现所有类超级查询 后台解放

第一,实体类举例:

package com.sinday.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.Data;

@ApiModel(value="zql_company")
@Data
@TableName(value = "zql_company")
public class ZqlCompany implements Serializable {

    @TableId(value = "userid", type = IdType.AUTO)
    @ApiModelProperty(value="")
    private Integer userid;

    /**
     * 公司名称
     */
    @TableField(value = "companyname")
    @ApiModelProperty(value="公司名称")
    private String companyname;

    /**
     * 企业性质
     */
    @TableField(value = "pattern")
    @ApiModelProperty(value="企业性质")
    private String pattern;

    private static final long serialVersionUID = 1L;
}

第二,自己写的帮助类获取注解(存在字段属性与数据库不一致的情况,所以我们要使用 注解获取数据库字段

mybatis-plus注解实体对象中有三种 

表名:@TableName(value = "zql_company")

id列名:@TableId(value = "userid")

普通列名:@TableField(value = "companyname")

我们要获取了上方三种属性,就能拼接sql了

        获取注解id:

 public static Map<String, String>getDeclaredFieldsInfoId(Object instance) {

        Map<String, String> fieldMap=new HashMap<>();
        Map<String, String> map =new HashMap();
        Class<?> clazz = instance.getClass();
        Field[] fields = clazz.getDeclaredFields();
        boolean b =false;
        for(int i =0; i < fields.length; i++){
            if(!fieldMap.containsValue(fields[i].getName())){
                //                Field field=clazz.getDeclaredField(fields[i].getName());
                boolean annotationPresent = fields[i].isAnnotationPresent(TableId.class);
                if(annotationPresent){
                    String name = fields[i].getAnnotation(TableId.class).value();
                    map.put(fields[i].getName(),name);
                }
            }
        }
        //System.out.println(JSON.toJSONString(map));
        return map;
    }

        获取注解列名:

public static Map<String, String>getDeclaredFieldsInfo2(Object instance) {

    Map<String, String> fieldMap=new HashMap<>();
    Map<String, String> map =new HashMap();
    Class<?> clazz = instance.getClass();
    Field[] fields = clazz.getDeclaredFields();
    boolean b =false;
    for(int i =0; i < fields.length; i++){
            if(!fieldMap.containsValue(fields[i].getName())){
    //                Field field=clazz.getDeclaredField(fields[i].getName());
                boolean annotationPresent = fields[i].isAnnotationPresent(TableField.class);
                if(annotationPresent){
                    String name = fields[i].getAnnotation(TableField.class).value();
                    map.put( fields[i].getName(),name);
                }
            }
        }
       // System.out.println(JSON.toJSONString(map));
    return map;
    }

        获取注解表名:

public static String getDeclaredFieldsInfoTableName(Object instance) {
        Map<String, String> fieldMap=new HashMap<>();
        
        Map<String, String> map =new HashMap();
        Class<?> clazz = instance.getClass();
        String name = clazz.getAnnotation(TableName.class).value();
        System.out.println("name:"+name);
        return name;
    }

接下来就是拼接QueryWrapper

注意:我这里是数字就是eq也就是 = 查询,汉字就是 like 查询

    public  static QueryWrapper getQuerwapperByT(Object t,QueryWrapper queryWrapper){
        //获取实际对象属性与值
        Map<String, String> entiys = new HashMap<String, String>();
        entiys = JSON.parseObject(JSON.toJSONString(t), new TypeReference<Map<String, String>>() {
        });//获取实际对象属性与值

        //获取非id字段数据库对应字段
        Map<String, String> fieldMap=getDeclaredFieldsInfo2(t);
        //结束获取非id字段数据库对应字段

        //获取id字段数据库对应字段
        Map<String, String> field_idMap=getDeclaredFieldsInfoId(t);
        //结束获取id字段数据库对应字段
        for (String sx:entiys.keySet()){
            int s=0;
            try {
                double abc=Double.parseDouble(entiys.get(sx));
            }catch (Exception e){
                s=1;
            }
            if(entiys.get(sx)!=null&&!entiys.get(sx).trim().equals("")
                    &&!entiys.get(sx).trim().equals("0")
                    &&!entiys.get(sx).trim().equals("0.0")){

                if(s==0||null!=field_idMap.get(sx)){//数字或者id
                    queryWrapper.eq(field_idMap.get(sx),entiys.get(sx));
                }else{
                    queryWrapper.like(fieldMap.get(sx),entiys.get(sx));
                }


            }
        }
        return queryWrapper;
    }

最后调用这个方法:

@PostMapping("/selectC")
    @ApiOperation(value = "企业查询")
    @ResponseBody
    @CrossOrigin
    public Object selectC(HttpSession session, HttpServletResponse response, HttpServletRequest req,
                         @RequestBody @ApiParam zqlCompany dq) throws NoSuchFieldException {



        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper=sindayHelp.getQuerwapperByT(dq,queryWrapper);

        List<ZqlCompany> zs=new ArrayList<>();

        //这里我写的是通用查询方法,具体的我会在下面贴出来
         String json= JSON.toJSONString(zqlTongYong.selectCom(sindayHelp.getDeclaredFieldsInfoTableName(dq.getZqlCompany()),queryWrapper)) ;
        zs=JSON.parseArray(json,ZqlCompany.class);
       
        return  conMessBack.suss("suss","查询成功",new fxlei(zs));
    }

直接写的通用查询类,传QueryWrapper和表名,表名获取方式上面写了

package com.sinday.mapper;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

@Mapper
public interface ZqlTongYong {
    @Select("select  * from ${tableName_s} ${ew.customSqlSegment}")
    List<Map<String,String>> selectCom(@Param("tableName_s")String tableName, @Param(Constants.WRAPPER) QueryWrapper wrapper);
}

这样,你就只需要传实体对象就能完成所有查询操作,任何表或实体对象都可以用这一个方法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值