MyBatis-Plus多表联合查询并且分页(3表联合)
这3张表的关系是模型表Model ===>训练表Training===》应用表Application(大概的逻辑是:选择应用,然后训练,然后成为模型)
首先我们先建立实体Model(我使用的data注解不需要getset @TableField(exist=false)注解下的属性是相关联表的属性)
packagecn.com.befery.dataai.po; importjava.util.Date; importorg.springframework.boot.jackson.JsonComponent; importcom.baomidou.mybatisplus.annotations.TableField; importcom.baomidou.mybatisplus.annotations.TableId; importcom.baomidou.mybatisplus.annotations.TableName; importcom.baomidou.mybatisplus.enums.IdType; importlombok.Data; @JsonComponent() @Data @TableName("ai_model") publicclassModel{ @TableId(value="model_id",type=IdType.AUTO) privateLongmodelID; privateLongapplicationId; privateLongtrainingId; privateStringmodelName; //描述 privateStringmodelDescribe; privateStringmodelType; privateDatecreateDate; privateStringfilePath; privateStringfileName; privateStringdaimension;//维度 privateLongstatus; @TableField(exist=false) privateStringapplicationName; @TableField(exist=false) privateStringtrainingName; @TableField(exist=false) privateStringorder; @TableField(exist=false) privateStringorderdir;//升序或降序 }
然后是第二个相关联的表应用表application表
packagecn.com.befery.dataai.po; importjava.io.Serializable; importjava.util.Date; importcom.baomidou.mybatisplus.annotations.TableField; importcom.baomidou.mybatisplus.annotations.TableId; importcom.baomidou.mybatisplus.annotations.TableName; importcom.baomidou.mybatisplus.enums.IdType; importlombok.Data; @Data @TableName("ai_application") publicclassApplicationimplementsSerializable{ privatestaticfinallongserialVersionUID=1L; @TableId(value="application_id",type=IdType.AUTO) privateLongapplicationID; privateStringapplicationName; privateStringfilePath; privateStringfileName; privateLonguserId; privateDatecreateDate; privateIntegerstatus; privateStringdimension;//维度 @TableField(exist=false) privateStringuserName;//关联用户表的名称字段 @TableField(exist=false) privateStringorder; @TableField(exist=false) privateStringmodelName; @TableField(exist=false) privateStringtrainingName; @TableField(exist=false) privateStringorderdir;//升序或降序 }
然后是相关联的第3张表训练表traning
packagecn.com.befery.dataai.po; importjava.io.Serializable; importjava.util.Date; importcom.baomidou.mybatisplus.annotations.TableField; importcom.baomidou.mybatisplus.annotations.TableId; importcom.baomidou.mybatisplus.annotations.TableName; importcom.baomidou.mybatisplus.enums.IdType; importlombok.Data; @Data @TableName("ai_training") publicclassTrainingimplementsSerializable{ privatestaticfinallongserialVersionUID=1L; @TableId(value="training_id",type=IdType.AUTO) privateLongtrainingID; privateLongserverId;//服务器ID privateLongapplicationId;//应用ID privateStringtrainingModel;//训练模型 privateStringtrainingName;//训练名称 privateStringdimensionInput;//输入维度 privateStringdimensionOutput;//输出维度 privateDatecreateDate; privateIntegerstatus; @TableField(exist=false) privateStringapplicationName; @TableField(exist=false) privateStringserverName; @TableField(exist=false) privateStringmodelName; @TableField(exist=false) privateStringorder;//排序字段 @TableField(exist=false) privateStringorderdir;//升序或降序 }
然后是DAO层:
packagecn.com.befery.dataai.dao; importjava.util.List; importorg.apache.ibatis.annotations.Param; importcom.baomidou.mybatisplus.mapper.BaseMapper; importcom.baomidou.mybatisplus.plugins.pagination.Pagination; importcn.com.befery.dataai.po.Model; publicinterfaceModelDaoextendsBaseMapper{ List selectModelPage(Paginationpage,@Param(value="model")Modelmodel); }
然后是xml(sql语句使用了别名,别名和实体中的一致,包括之后的前后台交互,都取一致的名字,规范避免出错)【我之所以使用$符号是因为如果使用#号他会当作字符串识别,他不会当作关键字识别,我使用#号不行】
SELECT model.`model_id`, model.`model_name`asmodelName, model.`status`asstatus, t.`training_name`astrainingName, ap.`application_name`asapplicationName, model.`create_date`ascreateDate FROM ai_modelmodel LEFTJOINai_trainingt ONt.`training_id`=model.`training_id` LEFTJOINai_applicationap ONap.`application_id`=t.`application_id` 1=1 andmodel.`model_name`like'%${model.modelName}%' orderby${model.order}${model.orderdir}
然后就是service:
packagecn.com.befery.dataai.service; importjavax.servlet.http.HttpServletRequest; importorg.springframework.web.multipart.MultipartFile; importcom.baomidou.mybatisplus.plugins.Page; importcom.baomidou.mybatisplus.service.IService; importcn.com.befery.dataai.po.Model; importcn.com.befery.dataai.vo.ResultCode; publicinterfaceModelServiceextendsIService{ //分页 Page selectModelPage(intpageNo,intpageSize,Modelmodel); }
然后就是serviceImpl:(此处将接口中的 pageNo和pageSize封装成到 分页辅助类page
@Service @Transactional publicclassModelServiceImplextendsServiceImplimplementsModelService{ @Autowired privateModelDaomodelDao; @Override publicPage selectModelPage(intpageNo,intpageSize,Modelmodel){ //TODOAuto-generatedmethodstub Page page=newPage (pageNo,pageSize); returnpage.setRecords(this.baseMapper.selectModelPage(page,model)); } }
然后就是Controller:
简单说一下下面的参数:
1.orderNO(排序用的):是前台传过来的,根据orderNO(类似下标)找到前台定义好的数据库字段
2.order(排序用的):根据orderNO(类似下标)找到前台定义好的数据库字段
3.orderdir(排序用的:是asc 还是desc)
4.search(前台模糊查询使用的):前台传的名字,来进行模糊查询
/** *@authorzhangxuewei三表查询 *@paramparam *@paramrequest *@return */ @ResponseBody @RequestMapping(value="/modelPage") publicResponseDatamodlePage(SearchParamparam,HttpServletRequestrequest){ logger.info("modlePage..........."); StringorderNO=request.getParameter("order[0][column]"); Stringorder=request.getParameter("columns["+orderNO+"][name]"); Stringorderdir=request.getParameter("order[0][dir]"); Stringsearch=request.getParameter("search[value]"); intpageNo=param.getStart()/param.getLength()+1; intpageSize=param.getLength(); Modelmodel=newModel(); model.setModelName(search); model.setOrder(order); model.setOrderdir("asc".equals(orderdir)?"asc":"desc"); PagepageDate=modelService.selectModelPage(pageNo,pageSize,model); returnresponseData(param.getDraw(),pageDate); }
这个是分页返回公共类
packagecn.com.befery.dataai.controller; importorg.springframework.stereotype.Controller; importcom.baomidou.mybatisplus.plugins.Page; importcn.com.befery.dataai.vo.ResponseData; @Controller publicclassBaseController{ /** * *@paramdraw重构次数 *@parampage分页数据 *@return */ publicResponseDataresponseData(Stringdraw,Page>page){ ResponseDatares=newResponseData(); res.setData(page.getRecords()); res.setDraw(draw); res.setRecordsFiltered((int)page.getTotal()); res.setRecordsTotal((int)page.getTotal()); returnres; } }
这个是ResponseDate实体类
packagecn.com.befery.dataai.vo; importjava.util.List; //@JsonInclude(Include.NON_NULL) publicclassResponseData{ /** * */ //privatestaticfinallongserialVersionUID=1L; privateStringdraw; privateintrecordsTotal; privateintrecordsFiltered; @SuppressWarnings("rawtypes") privateListdata; }
这是前端的html
应用列表 .dataTables_wrapper.dataTables_length{ float:left; padding-bottom:0px; padding-top:10px; padding-left:20px; } .tabletbodytrtd:FIRST-CHILD{ text-align:center; } .tabletbodytrtd{ text-align:center; } .dataTables_wrapper.dataTables_filter{ padding-bottom:10px; } .mt-20{ margin-top:10px; } .page-container{ padding:20px; padding-top:0px; } .form-horizontal.form-label{ text-align:left; width:140px; padding-right:0px; } 首页 > 模型和测试管理 >模型列表 ${model}<#else>#if>"class="clpd-5bg-1bk-graymt-20"> 测试模型