欢迎大家关注我的以下主页,尤其是今日头条!!!谢谢🙏🙏🙏
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.干货不断,希望大家多多支持,私信或者评论我,说说自己想要了解的内容!!!