MyBatis 多表聯合查詢
阿新 • • 發佈:2018-12-17
最近在做在eclipse + maven搭建SSM框架下做一個簡單的後臺管理系統,因為是第一次搭建SSM專案,在mybatis進行多表連線查詢的時候遇到問題,不知道如何進行處理?在網上搜了一下解決方法是,以實現,記錄下自己的實現方案。
- 表之間的關係如下圖所示:
環境搭建的是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; } @Override public 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; //appid private 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 mapper
PUBLIC "-//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_project
where gid = #{gid}
</delete>
</mapper>
service 層程式碼
public interface ProjectService {
List<Project> selectAllProject();
}
service impl
@Service("projectService")
public class ProjectServiceImpl implements ProjectService {
@Autowired
public ProjectDao projectDao;
@Override
public List<Project> selectAllProject() {
// TODO Auto-generated method stub
return this.projectDao.selectAllProject();
}
}
controler層往前端傳的是json
@RequestMapping("/showProjectList")
@ResponseBody
public 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.初始化Table
var oTable = new TableInit();
oTable.Init();
//2.初始化Button的點選事件
operate.operateInit();
});
//table
var TableInit = function () {
var oTableInit = new Object();
//初始化Table
oTableInit.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');
}
//button
var 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; }
}