Mybatis级联查询、多表查询?来看看我怎么简单实现

Mybatis级联查询、多表查询

Posted by LY on November 17, 2018

在这里小小推荐下我的个人博客

csdn:雷园的csdn博客

个人博客:雷园的个人博客

简书:雷园的简书

前言

1.在这里说几句废话哈。。。

2.依旧感谢各位的阅读和关注。刚加入不久,非常感谢能支持我、关注我的朋友们。一定不让大家失望,一定会持续不断的更新更多的相关文章。

3.希望大家一如既往关注、支持我!!!

步入正题

1.不知道大家步入编程行业多久了,不过我相信既然大家有兴趣点进来,对于单表的操作肯定是没有任何问题的。在这里我们就不对单表的操作做过多的赘述。

2.相信大家无在编码、写项目的时候,一定不会是知识简单的单表操作。一定会存在多表关联的问题,所以我们今天就来简单的说一下mybatis的级联查询。不得不说mybatis确实是个不错的选择,当然也可以选择使用我之前说过的mybatis-plus,详情可以看我的另一篇文章,Mybatis-Plus来学习一下!当然大家有什么看不懂的地方可以私信或者评论告诉我,我会一一解答。

编码

1.假如我们现在有角色(Roles)、权限(Permission)、用户(User)三张表,三者实体类如下,因为我加入了lombok,所以省略掉了所有的封装方法,详细的使用方法可以在文章下方查看更多:

// User用户
import lombok.Data;
/**
 * @author 来自底层程序员的仰望
 * @since 2018-11-16
 */
@Data
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String username;
    private String num;
    private String password;
    private String phone;
    private String sex;
    private Integer star;
}

// Roles角色
import lombok.Data;
/**
 * @author 来自底层程序员的仰望
 * @since 2018-11-16
 */
@Data
public class Roles  implements Serializable{
    private static final long serialVersionUID = 1L;
    private String id;
    private String roles;
    private String username;
}

// Permission权限
import lombok.Data;
/**
 * @author 来自底层程序员的仰望
 * @since 2018-11-16
 */
@Data
public class Permissions implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String permissions;
    private String roles;
}

2.如果我们是网站的管理员,我们需要查看所有的角色以及它对应的权限,应该怎么做呢,相信sql语句大家都会写:

    <select id="getRolesPermissionsList" resultType="RolesPermissions">
        select
            r.id as rolesId,
            r.roles as rolesName,
            r.studentNum as userName,
            p.id as permissionsId,
            p.permissions as permissions
        from roles r,permissions p
        where r.roles=p.roles;
    </select>

呐,这是最简单的两表联查,那么我们怎么对查询到的数据进行封装呢,一般来说我们需要封装这样的一个vo类RolesPermissions.java,并且为其封装个一个对应的构造方法:

import lombok.Data;
@Data
public class RolesPermissions {
    private String rolesId;
    private String permissionId;
    private String roles;
    private String username;
    private String permissions;
    public RolesPermissions(String rolesId, String permissionId, String roles, String username, String permissions) {
        this.rolesId = rolesId;
        this.permissionId = permissionId;
        this.roles = roles;
        this.username = username;
        this.permissions = permissions;
    }
}

是不是显得特别臃肿而且我们已经有了Roles和Permission为什么不直接拿来用呢,所以我认为更好的方式是这样的:

    <!-- Mapper.xml -->
	<resultMap id="rolesPermissions" type="com.leiyuan.vo.RolesPermissions">
        <association property="roles" javaType="com.leiyuan.entity.Roles">
            <id property="id" column="rolesId"/>
            <result property="roles" column="rolesName"/>
            <result property="studentNum" column="userName"/>
        </association>
        <association property="permissions" javaType="com.leiyuan.entity.Permissions">
            <id property="id" column="permissionsId"/>
            <result property="roles" column="rolesName"/>
            <result property="permissions" column="permissions"/>
        </association>
    </resultMap>
    <select id="getRolesPermissionsList" resultMap="rolesPermissions">
        select
            r.id as rolesId,
            r.roles as rolesName,
            r.studentNum as userName,
            p.id as permissionsId,
            p.permissions as permissions
        from roles r,permissions p
        where r.roles=p.roles;
    </select>
import lombok.Data;
// vo
@Data
public class RolesPermissions {
    private Roles roles;
    private Permissions permissions;
}

这样的话是不是清楚了许多,在xml中的对应关系更加明确易懂,方便查看和修改!!!

3.以上是简单的两表联查,那么如果是一对多的关系应该如何处理呢?User和Roles 的关系就是一对多的关系,因为一个用户可能不仅仅拥有一个角色,他可能即是版主又是吧主。也就是说这个vo类中会包含有一个实体类以及一个列表,那我们接着往下来!

4.我们先来封装一个vo类

import lombok.Data;
import java.util.List;
@Data
public class UserRoles {
    private User user; // 用户的详细信息
    private List<Roles> rolesList; // 用户的角色列表
}

5.可以看到上面的vo类包含有一个实体类User以及一个集合rolesList,接下来我们写mapper.xml

    <resultMap id="userRoles" type="com.leiyuan.vo.UserRoles">
        <association property="user" javaType="com.leiyuan.entity.User">
            <id property="id" column="userId"/>
            <result property="username" column="username"/>
            <result property="num" column="userNum"/>
            <result property="password" column="userPassword"/>
            <result property="phone" column="userPhone"/>
            <result property="sex" column="userSex"/>
            <result property="star" column="userStar"/>
        </association>
        <!-- 角色列表 -->
        <collection property="rolesList" ofType="com.leiyuan.entity.Roles">
            <id property="id" column="rolesId"/>
            <result property="roles" column="roles"/>
            <result property="username" column="username"/>
        </collection>
    </resultMap>
    <select id="getUserRolesList" resultMap="userRoles">
        select
            u.id as userId,
            u.username as username,
            u.num as userNum,
            u.password as userPassword,
            u.phone as userPhone,
            u.sex as userSex,
            u.star as userStar,
            r.id as rolesId,
            r.roles as roles 
        from user u
            left outer join roles r on u.username=r.username
            where u.id=#{userId}
    </select>
		<!-- 上面的 userId是我传过来的用户id-->

结束语

1.首先我们需要搞清楚mybatis的映射关系而且必须学会sql的内连接、左连接、右连接,才能实现我们需要的多表查询。

2.干货不断,希望大家多多支持,私信或者评论我,说说自己想要了解的内容!!!