最近在做在eclipse + maven搭建SSM框架下做一个简单的后台管理系统,因为是第一次搭建SSM项目,在mybatis进行多表连接查询的时候遇到问题,不知道如何进行处理?在网上搜了一下解决方法是,以实现,记录下自己的实现方案。

  1. 表之间的关系如下图所示:

环境搭建的是eclipse + maven+SpringMVC + Spring + MyBatis,前端用到的是bootstrap框架。
因为是第一次做SSM项目没有用到 mybatis 的自动生成工具 mybatis generator 生成的实体类、mapper 接口、以及 mapper xml 文件。都是自己写的。

Project 类

import java.util.List;import org.apache.ibatis.type.Alias;/*** @author  作者:* @date 创建时间:2018年10月19日 * @version 1.0 * @author*/
@Alias("Project")
public class Project {private String gid        ;private String activity  ;private String activity_end;private String src ;private String src2;private String src3;private String msgSuc;private String msgSuc1;private String jdr;private String createtime;private List<Lottery> lotterys;//这个是一个重点与Lottery实体类进行关联public String getGid() {return gid;}public void setGid(String gid) {this.gid = gid;}public String getActivity() {return activity;}public void setActivity(String activity) {this.activity = activity;}public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}public String getActivity_end() {return activity_end;}public void setActivity_end(String activity_end) {this.activity_end = activity_end;}public String getSrc2() {return src2;}public void setSrc2(String src2) {this.src2 = src2;}public String getSrc3() {return src3;}public void setSrc3(String src3) {this.src3 = src3;}public String getMsgSuc() {return msgSuc;}public void setMsgSuc(String msgSuc) {this.msgSuc = msgSuc;}public String getMsgSuc1() {return msgSuc1;}public void setMsgSuc1(String msgSuc1) {this.msgSuc1 = msgSuc1;}public String getJdr() {return jdr;}public void setJdr(String jdr) {this.jdr = jdr;}public String getCreatetime() {return createtime;}public void setCreatetime(String createtime) {this.createtime = createtime;}public List<Lottery> getLottery() {return lotterys;}public void setLottery(List<Lottery> lotterys) {this.lotterys = lotterys;}@Overridepublic String toString() {return "Project [gid=" + gid + ", activity=" + activity + ", activity_end=" + activity_end + ", src=" + src+ ", src2=" + src2 + ", src3=" + src3 + ", msgSuc=" + msgSuc + ", msgSuc1=" + msgSuc1 + ", jdr=" + jdr+ ", createtime=" + createtime + "]";}public Project(String gid, String activity, String activity_end, String src, String src2, String src3,String msgSuc, String msgSuc1, String jdr) {super();this.gid = gid;this.activity = activity;this.activity_end = activity_end;this.src = src;this.src2 = src2;this.src3 = src3;this.msgSuc = msgSuc;this.msgSuc1 = msgSuc1;this.jdr = jdr;}public Project() {super();}}

Lottery类

import org.apache.ibatis.type.Alias;/*** @author  作者:* @date 创建时间:2018年10月19日 * @version 1.0 * @author*/
@Alias("Lottery")
public class Lottery {private String id;  private String project_id; private String url; private String settingId;private String title; private String settingTitle;private String days_newCust; private String days_oldCust;private String appid; //appidprivate String appSecret; private String awardType; private String status;private String mete;private String mutex;private String createtime;/private String jdr;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getProject_id() {return project_id;}public void setProject_id(String project_id) {this.project_id = project_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getSettingId() {return settingId;}public void setSettingId(String settingId) {this.settingId = settingId;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getSettingTitle() {return settingTitle;}public void setSettingTitle(String settingTitle) {this.settingTitle = settingTitle;}public String getDays_newCust() {return days_newCust;}public void setDays_newCust(String days_newCust) {this.days_newCust = days_newCust;}public String getDays_oldCust() {return days_oldCust;}public void setDays_oldCust(String days_oldCust) {this.days_oldCust = days_oldCust;}public String getAppid() {return appid;}public void setAppid(String appid) {this.appid = appid;}public String getAppSecret() {return appSecret;}public void setAppSecret(String appSecret) {this.appSecret = appSecret;}public String getAwardType() {return awardType;}public void setAwardType(String awardType) {this.awardType = awardType;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getMete() {return mete;}public void setMete(String mete) {this.mete = mete;}public String getMutex() {return mutex;}public void setMutex(String mutex) {this.mutex = mutex;}public String getCreatetime() {return createtime;}public void setCreatetime(String createtime) {this.createtime = createtime;}public String getJdr() {return jdr;}public void setJdr(String jdr) {this.jdr = jdr;}public Lottery() {super();}public Lottery(String id, String project_id, String url, String settingId, String title, String settingTitle,String days_newCust, String days_oldCust, String appid, String appSecret, String awardType, String status,String mete, String mutex, String jdr) {super();this.id = id;this.project_id = project_id;this.url = url;this.settingId = settingId;this.title = title;this.settingTitle = settingTitle;this.days_newCust = days_newCust;this.days_oldCust = days_oldCust;this.appid = appid;this.appSecret = appSecret;this.awardType = awardType;this.status = status;this.mete = mete;this.mutex = mutex;this.jdr = jdr;}}

project 与 lottery 是1:1的关系,在 project zhong 加入一个lottery属性,对应一对一的关系。

然后就是mapper接口与xml文件

mapper :ProjectDao

public interface ProjectDao {//查询项目信息列表List<Project> selectAllProject();}

xml ProjectDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.**.mapper.ProjectDao"><resultMap id="queryForListMap" type="com.**.pojo.Project">  <id column="gid" property="gid" jdbcType="VARCHAR"/>  <result column="activity" property="activity" jdbcType="VARCHAR"/>  <result column="activity_end" property="activity_end" jdbcType="VARCHAR"/>  <result column="msgSuc" property="msgSuc" jdbcType="VARCHAR"/>  <result column="msgSuc1" property="msgSuc1" jdbcType="VARCHAR"/>  <collection property="lotterys" javaType="java.util.List" ofType="com.**.pojo.Lottery">  <id column="r_id" property="id" jdbcType="VARCHAR" />  <result column="r_settingId" property="settingId" jdbcType="VARCHAR" />  <result column="r_title" property="title" jdbcType="VARCHAR" />  <result column="r_settingTitle" property="settingTitle" jdbcType="VARCHAR" />  <result column="r_days_newCust" property="days_newCust" jdbcType="VARCHAR" />  <result column="r_days_oldCust" property="days_oldCust" jdbcType="VARCHAR" />  <result column="r_awardType" property="awardType" jdbcType="VARCHAR" />  <result column="r_mete" property="mete" jdbcType="VARCHAR" />  </collection>  </resultMap>  <!--用户表列名片段--><sql id="userColumn">gid, activity, activity_end, src,src2,src3,msgSuc,msgSuc1,jdr,createtime</sql><select id="selectAllProject" resultMap="queryForListMap">select p.gid, p.activity, p.activity_end, p.src,p.src2,p.src3,p.msgSuc,p.msgSuc1,p.jdr,l.id r_id,l.settingId r_settingId, l.title r_title,l.settingTitle r_settingTitle,l.days_newCust r_days_newCust,l.days_oldCust r_days_oldCust,l.appid,l.appSecret,l.awardType r_awardType,l.status,l.mete r_mete,l.mutex from system_project  p left join system_lottery l on p.gid=l.project_id</select><delete id="deleteByPrimaryKey" parameterType="java.lang.String" >delete from system_projectwhere gid = #{gid}</delete>
</mapper>

service 层代码

public interface ProjectService {List<Project> selectAllProject();
}

service impl

@Service("projectService")
public class ProjectServiceImpl implements ProjectService {@Autowiredpublic ProjectDao projectDao;@Overridepublic List<Project> selectAllProject() {// TODO Auto-generated method stubreturn this.projectDao.selectAllProject();}}

controler层往前端传的是json

     @RequestMapping("/showProjectList")@ResponseBodypublic String GetDepartment(){List<Project> list = projectService.selectAllProject();Gson gson = new Gson();System.err.println("**********list*********"+gson.toJson(list));System.err.println("**********list*********"+gson.toJson(list));System.err.println("**********list*********"+gson.toJson(list));return  gson.toJson(list);}

传的json是复杂的嵌套类型如下图:

前端用到的了bootstrap框架

<script type="text/javascript">$(function () {//1.初始化Tablevar oTable = new TableInit();oTable.Init();//2.初始化Button的点击事件operate.operateInit();});//tablevar TableInit = function () {var oTableInit = new Object();//初始化TableoTableInit.Init = function () {$('#tb_departments').bootstrapTable({url: '${pageContext.request.contextPath}/showProjectList',         //请求后台的URL(*)method: 'get',                      //请求方式(*)toolbar: '#toolbar',                //工具按钮用哪个容器striped: true,                      //是否显示行间隔色cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)pagination: true,                   //是否显示分页(*)paginationLoop: false,sortable: true,                     //是否启用排序sortOrder: "asc",                   //排序方式queryParams: oTableInit.queryParams,//传递参数(*)sidePagination: "client",           //分页方式:client客户端分页,server服务端分页(*)pageNumber:1,                       //初始化加载第一页,默认第一页pageSize: 15,                       //每页的记录行数(*)pageList: [15],                    //可供选择的每页的行数(*)search: true,                       //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大strictSearch: false,showColumns: false,                  //是否显示所有的列showRefresh: true,                  //是否显示刷新按钮minimumCountColumns: 1,             //最少允许的列数clickToSelect: false,                //是否启用点击选中行uniqueId: "gid",                     //每一行的唯一标识,一般为主键列showToggle:false,                    //是否显示详细视图和列表视图的切换按钮cardView: false,                    //是否显示详细视图detailView: false,                  //是否显示父子表undefinedText:'-',                   //当数据为 undefined 时显示的字符columns: [{checkbox: false,title: '序号',field: '',align: 'center',formatter: function (value, row, index) {return index + 1;}}, {field: 'lotterys',title: '名称',formatter: uidHandle,//自定义方法设置uid跳转链接sortable:false}, {field: 'activity',title: '活动ID'}, {field: 'activity_end',title: '结束日期'}, {field: 'lotterys',title: '标识',formatter : function(value,row, index){ //主要配置在这里 return  value[0].settingId; }}, {field: 'lotterys',title: '名称',sortable:false,formatter : function(value,row, index){ //主要配置在这里 return  value[0].title; }}, {field: 'lotterys',title: '天数',formatter : function(value,row, index){ //主要配置在这里 return  value[0].days_newCust; }}, {field: 'lotterys',title: '类型',formatter : function(value,row, index){ //主要配置在这里 return  value[0].awardType; }}, {field: 'lotterys',title: '金额/收益率',formatter : function(value,row, index){ //主要配置在这里 return  value[0].mete; }}, {field: 'dataBtn',title: '操作',formatter: dataFun}]});};//条件查询oTableInit.queryParams = function (params) {var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的limit: params.limit,   //页面大小offset: params.offset,  //页码search: params.search,settingTitle: $("#txt_search_name").val(),//后台请求传的查询参数activity:$("#txt_search_id").val(),activity_end:$("txt_search_time").val(),};return temp;};return oTableInit;};function serachUser() {$("#tb_departments").bootstrapTable('refresh');}//buttonvar operate = {// 初始化按钮事件operateInit : function() {},}//自定义图事件//自定义跳转var uidHandle = function (value,row,index) {var html = "<a href='${pageContext.request.contextPath}/goLook?gid=" + row.gid + "'>" + value[0].settingTitle + "</a>";return html;}//自定义按钮var dataFun = function (value,row,index) {var html = "<a class='btn btn-default' href=' ${pageContext.request.contextPath}/updateByPrimaryGid?gid=" + row.gid + "'><span class='glyphicon glyphicon-edit' aria-hidden='true'></span></ a><a class='btn btn-default'  onclick='confirmdelete()' href='${pageContext.request.contextPath}/deleteByPrimaryKey?gid=" + row.gid + "'><span class='glyphicon glyphicon-remove' aria-hidden='true'></span></ a>";return html;}function confirmdelete(){if (!confirm("确认要删除?")) {  window.event.returnValue = false;  }  }</script>

对于嵌套的json boostrap有处理方法需要如下操作:

{field: 'lotterys',title: '类型',formatter : function(value,row, index){ //主要配置在这里 return  value[0].awardType; }}

最后的实现效果如下:

bootstrap 参考地址:https://www.cnblogs.com/landeanfen/p/4976838.html
本文实现方法参考文章:https://blog.csdn.net/u012661010/article/details/76408566

利用SSM(springmvc+spring+mybatis)实现多表联合查询相关推荐

  1. MyBatis框架 多表联合查询实现

    三种方式: ①业务装配 对两个表编写单表查询语句,在业务层(Serivce)把查询的两个结果进行关联 ②使用Auto Mapping特性 在实现两表联合查询时通过别名完成映射,使用Maybatis的& ...

  2. springboot+mybatis+mysql 多表联合查询

    ###springboot+mybatis+mysql 多表查询 这里有两张表 用户表和用户信息表user.info 两个实体类展示他们一对一的关系 通过springboot注解的方式实现多表联合查询 ...

  3. mybatis学习五-mybatis的多表联合查询

    1. 一对一的关系 首先先看数据库 tb_user tb_orders 执行这条sql: 也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id 也就是说, 从后面看, 就是每 ...

  4. 1 (SSM) springMVC + spring + Mybatis(MySQL)学习笔记 ------ 阶段成果笔记

    学习了一段时间spring,springMVC和Mybatis,从开始学到现在熬了好多夜晚,好几个深夜和bug作战,真是难受. 打算写系列学习笔记,第一篇从一个小的成果说起吧,刚刚学的看这篇可能有点吃 ...

  5. SSH(Struts,Spring,Hibernate )和SSM(SpringMVC,Spring,MyBatis )的区别,抽丝剥茧的给你讲清楚

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  6. 01-Intellij IDEA搭建SSM(SpringMVC+Spring+Mybatis+Maven)框架(下)

    SSM入门实战(登录功能的实现) (1)数据库文件--->user.sql /*Navicat Premium Data TransferSource Server : MySQLSource ...

  7. SSM springmvc spring mybatis Java 集代码生成器 后台框架源码

    A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 (单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用 ...

  8. Java SSM springmvc spring mybatis 集代码生成器 后台框架源码

    A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 (单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用 ...

  9. ssm(springMVC + spring+MyBatis) 小例

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 整体环境参见本人另一文:http://blog.csdn.net/jiangyu1013/artic ...

最新文章

  1. Prime Path(bfs)广度优先搜索
  2. java search 不能使用方法_elasticsearch(七)java 搜索功能Search Request的介绍与使用...
  3. linux图形图像三剑客,就linux三剑客简单归纳
  4. 【数据分析】Python数据分析学习路线个人总结
  5. 推荐一个C++练手项目,面试也可用
  6. Laravel源码学习文章汇总
  7. 等高线地图_高中地理——每日讲1题(北美洲的气候、等高线的阅读)
  8. ZooKeeper官方文档学习笔记01-zookeeper概述
  9. C++读写文件总结 .
  10. 计算机竞赛acm试题,ACM-ICPC 2018 总决赛赛题
  11. CDN架构原理、流量模型、网络调优
  12. 【谷月老师讲WPS】用 Windows 11 的 WSL 安装 WPS for Linux
  13. 广州地铁的速度与激情
  14. 将 MySQL 数据库恢复到某个时间点
  15. 无法定位程序输入点于动态链接库怎么办
  16. 批处理对文件夹、所有子文件夹内的文件重命名、删除
  17. coap协议详解 服务器,COAP协议解析和简单打包实现
  18. Django搭建网站的个人笔记记录
  19. 基于QT的天气查询系统设计
  20. Qt6 QML Book/图形效果/粒子群组

热门文章

  1. c语言n层文字塔程序的结构图,精馏塔中由塔顶向下的第n-1,n,n+1层塔板,其气相组成关系为( )...
  2. ISP——坏点矫正(Defective Pixel Correction,DPC)
  3. 什么叫高内聚、低耦合?
  4. 什么是私域裂变营销?
  5. LOL IXTAL CUP 第一日 冠军杯赛 407的夺冠之路
  6. 电脑长期未用或深度放电,电池欠压充不上电(充电指示灯不亮)
  7. 晋丰佳创:抖音短视频里的版面内容复杂吗?这样设计的原因是什么
  8. 解决pycharm导入自己写的模块飘红问题
  9. 5G NGC — NRF 网络注册功能
  10. V853 替换开机启动LOGO