数据库多表查询 myBatis四表联查

查询目标

user表
数据库多表查询 myBatis四表联查_第1张图片
role表
数据库多表查询 myBatis四表联查_第2张图片
角色和菜单的关系
数据库多表查询 myBatis四表联查_第3张图片
menu表

数据库多表查询 myBatis四表联查_第4张图片
funs表(功能)
数据库多表查询 myBatis四表联查_第5张图片表和表的关系

	1.
		user对role 是多对一
		role对user是一对多
		即
		一个user对应一个role 一个role 对应多个user
	

	2.
		memu和role是多对多关系
		即
		一个role对应多个menu,
		一个menu对应多个role
	

	3.
		menue对fun 是一对多关系
		fun对menu 是多对一关系
		即
		一个menu对应多个fun
		 一个fun对应一个menu

实体类之间的关系

1.user和role
		user:因为一个user对应一个role,所以user中除了本表以外,还应该包含role对象的引用
		role:因为一个role对应多个user,所以role类中应该存放user的一个集合。
	2.role和menu两个实体类关系
		因为role和menu是多对多的关系,所以两个类中均应该含有对方的集合属性
	3.menu和funs俩个实体类关系
		menu:因为一个munu对应多个fun所以menu中应该含有fun的集合
		funs:因为funs对应一个menu,所以funs中含有一个menu引用

和四个表相对应的四个实体类
role

public class Role {
    private Integer roleId;
    private String  roleName;
    private List<User> users;
    private List<Menu> menus;

    public List<Menu> getMenus() {
        return menus;
    }

    public void setMenus(List<Menu> menus) {
        this.menus = menus;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}


user

public class User {
    private String id;
    private String username;
    private String password;
    private Integer roleId;
    private String iconURL;
    //role对象
    private Role role;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }

    public String getIconURL() {
        return iconURL;
    }

    public void setIconURL(String iconURL) {
        this.iconURL = iconURL;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

menu

public class Menu {
    private Integer menuId;
    private String menuName;
    private String menuURL;
    private Integer fatherId;

    private List<Role> roles;
    private List<Funs> funs;

    public Integer getMenuId() {
        return menuId;
    }

    public void setMenuId(Integer menuId) {
        this.menuId = menuId;
    }

    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }

    public String getMenuURL() {
        return menuURL;
    }

    public void setMenuURL(String menuURL) {
        this.menuURL = menuURL;
    }

    public Integer getFatherId() {
        return fatherId;
    }

    public void setFatherId(Integer fatherId) {
        this.fatherId = fatherId;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public List<Funs> getFuns() {
        return funs;
    }

    public void setFuns(List<Funs> funs) {
        this.funs = funs;
    }
}


funs

public class Funs {
    private Integer funId;
    private String funName;
    private String funURL;
    private Integer menuId;
    private Menu menu;

    public Integer getFunId() {
        return funId;
    }

    public void setFunId(Integer funId) {
        this.funId = funId;
    }

    public String getFunName() {
        return funName;
    }

    public void setFunName(String funName) {
        this.funName = funName;
    }

    public String getFunURL() {
        return funURL;
    }

    public void setFunURL(String funURL) {
        this.funURL = funURL;
    }

    public Integer getMenuId() {
        return menuId;
    }

    public void setMenuId(Integer menuId) {
        this.menuId = menuId;
    }

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }
}


mapper.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.openlab.mapper.UserMapper">
    <!--SQL语句进行四表联查-->
    <select id="queryByUserName" resultMap="userMapping">
        SELECT
            u.id,u.username,u.password,
            r.roleId,r.roleName,
            m.menuId,m.menuName,m.menuURL,
            f.funId,f.funName,f.funURL
        FROM
            user u
        LEFT JOIN role r
        ON u.roleId=r.roleId
        LEFT JOIN role_menu rm
        ON r.roleId = rm.roleId
        LEFT JOIN menu m
        ON rm.menuId=m.menuId
        LEFT JOIN funs f
        ON m.menuId=f.menuId
        WHERE u.username LIKE concat('%',#{username},'%')
    </select>
    
    <!--定义user的映射-->
    <resultMap id="userMapping" type="User">
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <association property="role" javaType="Role" resultMap="roleMapping"></association>
    </resultMap>
    
    <!--定义role的映射-->
    <resultMap id="roleMapping" type="Role">
        <id column="roleId" property="roleId"></id>
        <result column="roleName" property="roleName"></result>
        <collection property="menus" ofType="Menu" resultMap="menuMapping"></collection>
    </resultMap>
    
    <!--定义menu的映射-->
    <resultMap id="menuMapping" type="Menu">
        <id column="menuId" property="menuId"></id>
        <result column="menuName" property="menuName"></result>
        <result column="menuURL" property="menuURL"></result>
        <collection property="funs" ofType="Funs" resultMap="funsMapping"></collection>
    </resultMap>
    
    <!--定义funs的映射-->
    <resultMap id="funsMapping" type="Funs">
        <id column="funId" property="funId"></id>
        <result column="funName" property="funName"></result>
        <result column="funURL" property="funURL"></result>
    </resultMap>
</mapper>

四表联查测试代码

public class Test {
    @org.junit.Test
    public void testUserMapper() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(is).openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryByUserName("zhangsan");
        System.out.println("用户信息");
        System.out.println(user.getId()+"\t"+user.getUsername()+"\t"+user.getPassword());
         System.out.println("========================");
        System.out.println("角色信息");
        Role role =user.getRole();
        System.out.println(role.getRoleId()+"\t"+role.getRoleName());
        List<Menu> menus = role.getMenus();
        System.out.println("========================");
        System.out.println("角色对应菜单");
        System.out.println("========================");
        for (Menu menu : menus) {
            System.out.println("菜单:"+menu.getMenuId()+"\t"+menu.getMenuName()+"\t"+menu.getMenuURL());
            System.out.println(""+menu.getMenuName()+"菜单对应的功能表信息");
            List<Funs> funs = menu.getFuns();
            for (Funs fun : funs) {
                System.out.println(fun.getFunId()+"\t"+fun.getFunName()+"\t"+fun.getFunURL());
            }
            System.out.println("========================");
        }


    }
}

测试结果*

用户信息
00001	zhangsan	1231230
========================
角色信息
1	管理员
========================
角色对应菜单
========================
菜单:1	系统菜单	null
用户管理菜单对应的功能表信息
1	主页	index.jsp
2	头页面	header.jsp
3	菜单页面	menu.jsp
4	操作页面	body.jsp
5	底页面	footer.jsp
6	成功页面	ok.jsp
7	错误页面	error.jsp
8	角色错误页面	norole.jsp
========================
菜单:2	用户管理	null
用户管理菜单对应的功能表信息
========================
菜单:3	添加用户	register.jsp
用户管理菜单对应的功能表信息
50	添加用户页面	register.jsp
51	添加用户的动作	registerServlet.do
========================单:4	查询用户	body.jsp
用户管理菜单对应的功能表信息
60	查询用户页面	body.jsp
61	查询用户动作	registerServlet.do
62	显示用户页面	body.jsp
63	预更新用户查询动作	preUpdata.do
64	更新用户页面	updataUser.jsp
65	更新用户动作	updataUser.do
66	删除用户动作	deleteUser.do
========================
菜单:5	商品管理	null
用户管理菜单对应的功能表信息
========================
菜单:6	添加商品	addGoods.jsp
用户管理菜单对应的功能表信息
70	添加商品页面	addProduct.jsp
71	添加商品动作	addProduct.do
========================
菜单:7	查询商品	findGoods.jsp
用户管理菜单对应的功能表信息
80	查询商品页面	findProduct.jsp
81	查询商品动作	findProduct.do
82	预更新商品动作	preUpdataProduct.do
83	显示更新商品页面	updataProduct.jsp
84	更新商品动作	updataProduct.do
85	删除商品动作	deleteProduct.do
========================
菜单:8	查看购物车	null
用户管理菜单对应的功能表信息
========================
菜单:9	购物车	shopping.jsp
用户管理菜单对应的功能表信息
90	查看购物车页面	findcar.jsp
========================

Process finished with exit code 0

你可能感兴趣的:(数据库多表查询 myBatis四表联查)