最近搭建新项目的时候,由于该系统好多功能基本一直,需要关联查询。但是使用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")));