最近在做在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; }
}
最後的實現效果如下:
bootstrap 參考地址:https://www.cnblogs.com/landeanfen/p/4976838.html
本文實現方法參考文章:https://blog.csdn.net/u012661010/article/details/76408566