使用mybatis进行四表联查

一、问题背景

先数据库有用户表user、角色表role、菜单表menu、功能表funs和角色菜单关系表role_menu。
各表的字段及数据如下
用户user表
在这里插入图片描述
角色role表
在这里插入图片描述
角色菜单关系表role_menu
在这里插入图片描述
菜单menu表
在这里插入图片描述
功能funs表
在这里插入图片描述

二、实际问题

  1. 表与表之间的关系
  2. 类与类之间的关系
  3. 四表连查 user、role、menu、funs、role_menu,通过username来进行查询用户信息、对应的角色信息、角色对应的菜单信息及菜单底下的功能。

三、问题解决

一、数据库的表之间的关系

	1.一个user对应一个role 一个role 对应多个user
		user对role 是多对一关系
		role对user是一对多关系
	2.一个role对应多个menu,一个menu对应多个role
		memu和role是多对多关系
	3.一个menu对应多个fun 一个fun对应一个menu
		menue对fun 是一对多关系
		fun对menu 是多对一关系

二、pojo实体类的关系

	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引用

各实体类的属性及互相持有的引用如下
用户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;
    }
}

角色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;
    }
}

菜单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;
    }
}

四、sql语句与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>

五、测试

Junit测试

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();
        }


    }
}

测试结果如下图

"C:\Program Files\Java\jdk1.8.0_77\bin\java" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=54629:D:\IDEA\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\plugins\junit\lib\junit-rt.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_77\jre\lib\rt.jar;C:\Users\上杉\IdeaProjects\JavaBaseTest\MavenDemo\target\classes;D:\IDEA\IntelliJ IDEA 2017.3.4\lib\hamcrest-core-1.3.jar;D:\IDEA\IntelliJ IDEA 2017.3.4\lib\junit-4.12.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\junit\junit\4.11\junit-4.11.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\generator\mybatis-generator-maven-plugin\1.3.5\mybatis-generator-maven-plugin-1.3.5.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-plugin-api\3.3.9\maven-plugin-api-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-model\3.3.9\maven-model-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-utils\3.0.22\plexus-utils-3.0.22.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\apache\maven\maven-artifact\3.3.9\maven-artifact-3.3.9.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\eclipse\sisu\org.eclipse.sisu.plexus\0.3.2\org.eclipse.sisu.plexus-0.3.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\enterprise\cdi-api\1.0\cdi-api-1.0.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\annotation\jsr250-api\1.0\jsr250-api-1.0.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\javax\inject\javax.inject\1\javax.inject-1.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\eclipse\sisu\org.eclipse.sisu.inject\0.3.2\org.eclipse.sisu.inject-0.3.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-component-annotations\1.5.5\plexus-component-annotations-1.5.5.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\codehaus\plexus\plexus-classworlds\2.5.2\plexus-classworlds-2.5.2.jar;E:\Maven\apache-maven-3.5.2\mavenworkspace\org\mybatis\generator\mybatis-generator-core\1.3.5\mybatis-generator-core-1.3.5.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.openlab.test.Test,testUserMapper
----用户表信息----
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

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis Plus提供了多种方式进行多表联查,以下是一种常见的四表联查方法示例: 假设我们有四个表:A、B、C、D,它们的关系如下所示: A.id -> B.a_id B.id -> C.b_id C.id -> D.c_id 首先,我们需要定义四个相应的实体类,并在每个实体类中定义对应的Mapper类。 然后,在需要进行四表联查的Mapper接口中,我们可以使用MyBatis Plus提供的Wrapper类来进行联查,示例代码如下: ``` @Mapper public interface FourTableMapper extends BaseMapper<A> { @Select("SELECT a.*, b.*, c.*, d.* " + "FROM a " + "LEFT JOIN b ON a.id = b.a_id " + "LEFT JOIN c ON b.id = c.b_id " + "LEFT JOIN d ON c.id = d.c_id " + "WHERE a.id = #{id}") FourTableDTO selectFourTableById(@Param("id") Long id); } ``` 上述示例中,我们使用了LEFT JOIN关键字来进行联查,并使用MyBatis Plus提供的BaseMapper类作为父接口。同时,我们在接口方法中定义了一个FourTableDTO的返回类型,该类型是我们自己定义的一个DTO类,用于封装四个实体类的查询结果。 请注意,上述示例中使用了@Select注解,这是MyBatis的注解方式,而非MyBatis Plus的方式。如果你希望使用MyBatis Plus的方式进行SQL操作,可以参考如下代码: ``` @Mapper public interface FourTableMapper extends BaseMapper<A> { default FourTableDTO selectFourTableById(Long id) { return this.selectFourTableById(new QueryWrapper<A>().eq("a.id", id)); } @Select("SELECT a.*, b.*, c.*, d.* " + "FROM a " + "LEFT JOIN b ON a.id = b.a_id " + "LEFT JOIN c ON b.id = c.b_id " + "LEFT JOIN d ON c.id = d.c_id " + "${ew.customSqlSegment}") FourTableDTO selectFourTableById(@Param(Constants.WRAPPER) Wrapper<A> wrapper); } ``` 上述代码中,我们使用了BaseMapper类提供的默认方法,并使用MyBatis Plus提供的Wrapper类来进行联查。其中,${ew.customSqlSegment}表示Wrapper中自定义的SQL语句。 希望这个示例能够帮助你进行四表联查的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值