mybtisplus 改写多表关联查询

最近搭建新项目的时候,由于该系统好多功能基本一直,需要关联查询。但是使用mybatisplus的经验不不多,感觉使用原本的映射关联查询挺麻烦的,所改了一种查法记录一下,只是对应我的业务,觉得符合的可以改改用

1:需要建两个注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Notjion {
    /*该字段不参与反射*/
    String value() default "";
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface One {
    /*多表查询*/


    /*对应表名*/
    String table();

    /*返回字段*/
    String file();

    /*原表字段*/
    String onetoone();

    /*对应字段*/
    String rt() ;
}

mapper层

@Component
public interface Mapper {


    /*统一dao,由于对象映射无法处理,只能用map*/

    @Select("${name}")
    List<Map<Object,Object>> selecton(String name);

    @Select("${name}")
    Long seleccout(String name);



}

条件对象,自己根据自己的应用丰富

@Data
public class Condition {

    /*多条件查询*/
    private Integer limit;

    private Integer page;

    private String condtidions;

    private String orderby;

}

操作


public class OneBin {

    /*
    *
    * 组装多表查询,只适合当前查询,没做其他处理,请勿乱引用
    * 规则,对应的表名和对象要一至,还没做驼峰处理,大写变小写变‘_’自己处理一下
    * 传入表名对应的对象,
    *
    *
    * */

    public static Map<String,String> reflectObj(Class clz, Condition condition) {
        Map<String ,String> map=new HashMap<>();
        /*条数*/
        StringBuffer stringBuffercount=new StringBuffer("select count(*)");
        /*数据sql*/
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("select ");
        try {
            /*对象属性*/
            Field[] fields = clz.getDeclaredFields();

            /*需要关联的字段*/
            List<Field> list=new ArrayList<>();

            /*拼接返回值*/
            for (int i = 0; i <fields.length ; i++) {
                One ones=fields[i].getAnnotation(One.class);
                if(ones!=null){
                    list.add(fields[i]);
                }
                /*不参与任何业务字段*/
                if(null!=fields[i].getAnnotation(Notjion.class)){
                    continue;
                }
                if(fields.length-1==i) {
                    if(fields[i].getType().getName().equals("java.util.Date")){
                        String data="p."+fields[i].getName();
                        stringBuffer.append("date_format("+data+", '%Y-%m-%d %H:%i:%s')"+data );
                    }
                    else { stringBuffer.append("p."+fields[i].getName());}
                }else {
                    /*sql特殊字段处理*/
                    if(fields[i].getType().getName().equals("java.util.Date")){
                        String data="p."+fields[i].getName();
                        stringBuffer.append("date_format("+data+", '%Y-%m-%d %H:%i:%s')"+fields[i].getName()+"," );
                    }
                    else {
                        stringBuffer.append("p."+fields[i].getName()+",");
                    }
                }
            }
            StringBuffer stringBufferleft=new StringBuffer();
            for (int i = 0; i <list.size() ; i++) {
                One one=list.get(i).getAnnotation(One.class);
                String tableName="c"+i;
                if(i==list.size()-1){
                    stringBuffer.append(tableName+"."+one.file());
                }else {
                    stringBuffer.append(tableName+"."+one.file()+",");
                }
                stringBufferleft.append( " left join "+one.table()+" " +tableName+ " on"+" p."+one.onetoone()+" = "+tableName+"."+one.rt());

            }
            stringBuffer.append(" from "+clz.getSimpleName().toLowerCase() +" p ").append(stringBufferleft.toString()+" where 1=1 ");
            stringBuffercount.append(" from "+clz.getSimpleName().toLowerCase() +" p ").append(stringBufferleft.toString()+" where 1=1 "
            );
            /*拼接条件*/
           if(null!=condition){
                if(null!=condition.getCondtidions()){
                    stringBuffer.append(" " +condition.getCondtidions()+" "+condition.getOrderby());
                    stringBuffercount.append(" "+condition.getCondtidions());
                }
                if(null!=condition.getLimit()){
                    stringBuffer.append(" limit " +(condition.getPage()-1)*condition.getLimit()+", "+condition.getLimit());
                }

            }
        }catch (Exception e){
            e.printStackTrace();
        }
        /*要执行sql*/
        map.put("sql",stringBuffer.toString());

        /*条数配合layui需要*/
        map.put("count",stringBuffercount.toString());
        return map;
    }

个人总结,可以根据自己的需求进行修改

使用案例对象


@Data
public class Userreg {
  private Long gid;
  private Date creadate;
  private String appkey;
  private String version;
  private String register;
  private String channelid;
  private String deviceid;
  private String accountid;
  private String accname;
  private String devicemodel;
  private String devicesystem;
  private String ip;

  @TableField(exist = false)
  @Notjion
  @One(table = "channel",file = "name",onetoone = "channelid",rt = "id")
  private String name;

//  @TableField(exist = false)
//  @Notjion
//  @One(table = "game",file = "gname",onetoone = "appkey",rt = "id")
//  private String game;

}```

service层

```java

  #兼容分页,多哦条件查询
  Condition condition=new Condition();
        condition.setPage(page);
        condition.setLimit(toal);
        if(null!=date && date.length()>0){
           stringBuffer.append(" and p.creadate BETWEEN '"+date+" 00:00:00 ' and '"+date+" 23:59:59'");
        }
        if(null!=deviceid && deviceid.length()>0){
            stringBuffer.append(" and p.deviceid='"+deviceid+"'");
        }
        if(null!=appkey&&appkey.length()>0){
            stringBuffer.append(" and p.appkey='"+appkey+"'");
        }
        if(null!=accname&&accname.length()>0){
            stringBuffer.append(" and p.accname='"+accname+"'");
        }
        condition.setOrderby( "ORDER BY p.creadate DESC" );
        condition.setCondtidions(stringBuffer.toString());
        Map<String,String> map=OneBin.reflectObj(clz,condition);
        List list=mapper.selecton(map.get("sql"));
        Reson reson = new Reson();
        reson.setData(list);
        reson.setCode("0");
        reson.setCount(mapper.seleccout(map.get("count")));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tiny(泰尼)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值