MyBatis 三表外關(guān)聯(lián)查詢的實現(xiàn)(用戶、角色、權(quán)限)
一、數(shù)據(jù)庫結(jié)構(gòu)

二、查詢所有數(shù)據(jù)記錄(SQL語句)

SQL語句:
SELECT u.*, r.*, a.* FROM
(
(
( user u INNER JOIN user_role ur ON ur.user_id = u.user_id )
INNER JOIN role r ON r.role_id = ur.role_id
)
INNER JOIN role_authority ra ON ra.role_id = r.role_id
)
INNER JOIN authority a ON ra.authority_id = a.authority_id
三、詳細代碼(第一中方式)
1、實體類entity
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class AuthorityEntity implements Serializable {
private Integer authorityId;
private String authorityName;
private String authorityDescription;
}
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class RoleEntity implements Serializable {
private Integer roleId;
private String roleName;
private String roleDescription;
}
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
public class UserEntity implements Serializable {
private Integer userId;
private String userName;
private String userSex;
private Date userBirthday;
private String userAddress;
private List<RoleEntity> roleEntityList;
private List<AuthorityEntity> authorityEntityList;
}
2、數(shù)據(jù)訪問層dao、Mapper
package cn.lemon.demo.dao;
import cn.lemon.demo.entity.UserEntity;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface IUserDao {
/**
* 查詢所有關(guān)聯(lián)的數(shù)據(jù)
*
* @return
*/
List<UserEntity> selectAllUserRoleAuthority();
}
<?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="cn.lemon.demo.dao.IUserDao">
<select id="selectAllUserRoleAuthority" resultMap="userMap">
SELECT u.*, r.*, a.* FROM
(
(
( user u INNER JOIN user_role ur ON ur.user_id = u.user_id )
INNER JOIN role r ON r.role_id = ur.role_id
)
INNER JOIN role_authority ra ON ra.role_id = r.role_id
)
INNER JOIN authority a ON ra.authority_id = a.authority_id
</select>
<resultMap id="userMap" type="cn.lemon.demo.entity.UserEntity">
<id property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="userSex" column="user_sex"/>
<result property="userBirthday" column="user_birthday"/>
<result property="userAddress" column="user_address"/>
<collection property="roleEntityList" ofType="cn.lemon.demo.entity.RoleEntity" resultMap="roleMap"/>
<collection property="authorityEntityList" ofType="cn.lemon.demo.entity.AuthorityEntity" resultMap="authorityMap"/>
</resultMap>
<resultMap id="roleMap" type="cn.lemon.demo.entity.RoleEntity">
<id property="roleId" column="role_id"/>
<result property="roleName" column="role_name"/>
<result property="roleDescription" column="role_description"/>
</resultMap>
<resultMap id="authorityMap" type="cn.lemon.demo.entity.AuthorityEntity">
<id property="authorityId" column="authority_id"/>
<result property="authorityName" column="authority_name"/>
<result property="authorityDescription" column="authority_description"/>
</resultMap>
</mapper>
3、業(yè)務(wù)層service
package cn.lemon.demo.service;
import cn.lemon.demo.entity.UserEntity;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public interface IUserService {
List<UserEntity> selectAllUserRoleAuthority();
}
package cn.lemon.demo.service.impl;
import cn.lemon.demo.dao.IUserDao;
import cn.lemon.demo.entity.UserEntity;
import cn.lemon.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public List<UserEntity> selectAllUserRoleAuthority() {
return userDao.selectAllUserRoleAuthority();
}
}
4、測試類
package cn.lemon.demo.service.impl;
import cn.lemon.demo.entity.UserEntity;
import cn.lemon.demo.service.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceImplTest {
@Autowired
private IUserService userService;
@Test
public void selectAllUserRoleAuthority() {
List<UserEntity> userEntities = userService.selectAllUserRoleAuthority();
for (UserEntity userEntity : userEntities) {
System.out.println(
"用戶姓名:" + userEntity.getUserName() +
"用戶地址:" + userEntity.getUserAddress() +
"權(quán)限列表:" + userEntity.getAuthorityEntityList() +
"角色列表:" + userEntity.getRoleEntityList());
System.out.println("--------------------------------------");
}
}
}
四、詳細代碼(第二中方式)
1、實體類entity (實體類可以省略不寫)
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class UserEntity implements Serializable {
private Long userId;
private String userName;
private String userSex;
private Date userBirthday;
private String userAddress;
}
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class RoleEntity implements Serializable {
private Long roleId;
private String roleName;
private String roleDescription;
}
package cn.lemon.demo.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class AuthorityEntity implements Serializable {
private Long authorityId;
private String authorityName;
private String authorityDescription;
}
2、數(shù)據(jù)訪問層dao、Mapper
package cn.lemon.demo.dao;
import java.util.List;
import java.util.Map;
public interface IUserDao {
List<Map> selectAllUserRoleAuthority();
}
<?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="cn.lemon.demo.dao.IUserDao">
<!--查詢 用戶信息,角色信息,權(quán)限信息-->
<select id="selectAllUserRoleAuthority" resultType="java.util.Map">
SELECT
u.user_id userId,
u.user_name userName,
u.user_sex userSex,
u.user_birthday userBirthday,
u.user_address userAddress,
r.role_name roleName,
r.role_description roleDescription,
a.authority_name authorityName,
a.authority_description authorityDescription
FROM
(
(
( USER u INNER JOIN user_role ur ON u.user_id = ur.user_id )
INNER JOIN role r ON r.role_id = ur.role_id
)
INNER JOIN role_authority ra ON ra.role_id = r.role_id
)
INNER JOIN authority a ON a.authority_id = ra.authority_id
</select>
</mapper>
3、業(yè)務(wù)層service (接口及實現(xiàn)類)
package cn.lemon.demo.service;
import java.util.List;
import java.util.Map;
public interface IUserService {
List<Map> selectAllUserRoleAuthority();
}
package cn.lemon.demo.service.impl;
import cn.lemon.demo.dao.IUserDao;
import cn.lemon.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public List<Map> selectAllUserRoleAuthority() {
return userDao.selectAllUserRoleAuthority();
}
}
4、控制層controller
package cn.lemon.demo.controller;
import cn.lemon.demo.service.IUserService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping(value = "/")
public class SystemController {
@Autowired
private IUserService userService;
/**
* 跳轉(zhuǎn)頁面
*
* @return
*/
@RequestMapping(value = "index")
public String index() {
return "index";
}
/**
* 查詢所有關(guān)聯(lián)的數(shù)據(jù) 用戶信息,角色信息,權(quán)限信息
* @return
*/
@RequestMapping(value = "selectAll",method = RequestMethod.POST)
@ResponseBody
public String selectAll(){
List<Map> mapList = userService.selectAllUserRoleAuthority();
JSONObject json = new JSONObject();
json.put("mapList",mapList);
System.out.println(json.toJSONString());
return json.toJSONString();
}
}
5、前端頁面 index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁</title>
<script type="text/javascript" th:src="@{/static/js/jquery-1.11.3.min.js}"></script>
</head>
<body>
<div id="head">
<table width="100%" align="center" border="2px" cellspacing="2px">
<thead>
<tr>
<th>用戶編號</th>
<th>用戶姓名</th>
<th>用戶性別</th>
<th>用戶生日</th>
<th>用戶地址</th>
<th>角色名稱</th>
<th>角色描述</th>
<th>權(quán)限名稱</th>
<th>權(quán)限描述</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
<script type="text/javascript">
$(function () {
$.ajax({
type: "post",
url: '/selectAll',
contentType: "application/json;charset=utf-8",
dataType: 'json',
//async: false,/*表示請求為同步方式*/
success: function (data) {
//在<tbody>中追加數(shù)據(jù)
for (var i = 0; i < data.mapList.length; i++) {
$("#tbody").append("<tr><td>" + data.mapList[i].userId + "</td>" +
"<td>" + data.mapList[i].userName + "</td>" +
"<td>" + data.mapList[i].userSex + "</td>" +
"<td>" + data.mapList[i].userBirthday + "</td>" +
"<td>" + data.mapList[i].userAddress + "</td>" +
"<td>" + data.mapList[i].roleName + "</td>" +
"<td>" + data.mapList[i].roleDescription + "</td>" +
"<td>" + data.mapList[i].authorityName + "</td>" +
"<td>" + data.mapList[i].authorityDescription + "</td>" +
"</tr>");
}
},
error: function () {
window.alert("查詢失敗");
}
});
});
</script>
</body>
</html>
運行 localhost:8080 顯示:

到此這篇關(guān)于MyBatis 三表外關(guān)聯(lián)查詢的實現(xiàn)(用戶、角色、權(quán)限)的文章就介紹到這了,更多相關(guān)MyBatis 外關(guān)聯(lián)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于QueryWrapper,實現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式
- Mybatis多表關(guān)聯(lián)查詢的實現(xiàn)(DEMO)
- Mybatis 一對多和多對一關(guān)聯(lián)查詢問題
- mybatis-plus多表關(guān)聯(lián)查詢功能的實現(xiàn)
- mybatis如何使用注解實現(xiàn)一對多關(guān)聯(lián)查詢
- MyBatis實踐之動態(tài)SQL及關(guān)聯(lián)查詢
- Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解
- Mybatis實現(xiàn)一對一、一對多關(guān)聯(lián)查詢的方法(示例詳解)
- Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
- MyBatis的關(guān)聯(lián)查詢實現(xiàn)(一對一、一對多、多對多)
相關(guān)文章
MyBatis寫入Json字段以及Json字段轉(zhuǎn)對象示例詳解
這篇文章主要給大家介紹了關(guān)于MyBatis寫入Json字段以及Json字段轉(zhuǎn)對象的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
SpringBoot集成Quartz實現(xiàn)持久化定時接口調(diào)用任務(wù)
Quartz是功能強大的開源作業(yè)調(diào)度庫,幾乎可以集成到任何?Java?應(yīng)用程序中,從最小的獨立應(yīng)用程序到最大的電子商務(wù)系統(tǒng),本文將通過代碼示例給大家介紹SpringBoot集成Quartz實現(xiàn)持久化定時接口調(diào)用任務(wù),需要的朋友可以參考下2023-07-07
SpringBoot詳解MySQL如何實現(xiàn)讀寫分離
當響應(yīng)的瓶頸在數(shù)據(jù)庫的時候,就要考慮數(shù)據(jù)庫的讀寫分離,當然還可以分庫分表,那是單表數(shù)據(jù)量特別大,當單表數(shù)據(jù)量不是特別大,但是請求量比較大的時候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務(wù)...如果還是很慢,那就要分庫分表了...我們這篇就簡單講一下讀寫分離2022-09-09
項目打包成jar后包無法讀取src/main/resources下文件的解決
本文主要介紹了項目打包成jar后包無法讀取src/main/resources下文件的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2022-04-04

