zoukankan      html  css  js  c++  java
  • mybatis-plus注解版实现多表联查(sql)

    mybatis注解版实现多表联查

    需求:

    用户有角色,角色有权限,需要一次取用户信息包含角色信息及其对应权限

    实体类:

    package cn.zytao.taosir.common.model.user;
    
    import java.io.Serializable;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import com.baomidou.mybatisplus.annotations.TableField;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    @Data
    @ApiModel(value="用户实体")
    public class User implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -2389902440625641568L;
    
        @ApiModelProperty(name ="id",value = "ID主键")
        private String id;
    
        @ApiModelProperty(name ="username",value = "用户名")
        private String username;
    
        @ApiModelProperty(name ="password",value = "密码")
        private String password;
    
        @ApiModelProperty(name ="nickname",value = "昵称")
        private String nickname;
        
        @ApiModelProperty(name ="isInsiders",value = "是否内部人员")
        private int isInsiders;
    
        @ApiModelProperty(name ="phone",value = "联系电话")
        private String phone;
    
        @ApiModelProperty(name ="email",value = "邮箱")
        private String email;
    
        @ApiModelProperty(name ="qq",value = "QQ")
        private String qq;
    
        @ApiModelProperty(name ="wechat",value = "微信")
        private String wechat;
    
        @ApiModelProperty(name ="question",value = "找回密码问题")
        private String question;
    
        @ApiModelProperty(name ="answer",value = "找回密码答案")
        private String answer;
    
        @ApiModelProperty(name ="createTime",value = "创建时间")
        private Date createTime;
    
        @ApiModelProperty(name ="updateTime",value = "更新时间")
        private Date updateTime;
        
        @TableField(exist = false)
        private Set<Role> roles=new HashSet<>();
    }
    用户
    package cn.zytao.taosir.common.model.user;
    
    import java.io.Serializable;
    import java.util.HashSet;
    import java.util.Set;
    
    import com.baomidou.mybatisplus.annotations.TableField;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    /**
     * 
     * @author taosir
     *
     */
    @Data
    @ApiModel(value="角色实体")
    public class Role implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 4710406435745633366L;
    
        @ApiModelProperty(name ="id",value = "ID主键")
        private String id;
        
        @ApiModelProperty(name ="roleCode",value = "角色代码")
        private String roleCode;
        
        @ApiModelProperty(name ="roleName",value = "角色名称")
        private String roleName;
        
        @TableField(exist = false)
        private Set<Permission> permissions=new HashSet<>();
    }
    角色
    package cn.zytao.taosir.common.model.user;
    
    
    import java.io.Serializable;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    @Data
    @ApiModel(value="权限实体")
    public class Permission implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1545962188193104351L;
    
        @ApiModelProperty(name ="id",value = "ID主键")
        private String id;
        
        @ApiModelProperty(name ="permissionCode",value = "权限代码")
        private String permissionCode;
        
        @ApiModelProperty(name ="permissionName",value = "权限名称")
        private String permissionName;
        
        @ApiModelProperty(name="path",value="映射路径")
        private String path;
    }
    权限
    package cn.zytao.taosir.common.model.user;
    
    import java.io.Serializable;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    @Data
    @ApiModel(value="用户角色关系表")
    public class UserRole implements Serializable{
        /**
         * 
         */
        private static final long serialVersionUID = 6163369825048118489L;
        @ApiModelProperty(name ="id",value = "ID主键")
        private String id;
        @ApiModelProperty(name ="username",value = "用户名")
        private String username;
        @ApiModelProperty(name ="roleCode",value = "角色代码")
        private String roleCode;
    }
    用户角色关系
    package cn.zytao.taosir.common.model.user;
    
    import java.io.Serializable;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    @Data
    @ApiModel(value="角色权限关系表")
    public class RolePermission implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -7522662317811377590L;
        @ApiModelProperty(name ="id",value = "ID主键")
        private String id;
        @ApiModelProperty(name ="roleCode",value = "角色代码")
        private String roleCode;
        @ApiModelProperty(name ="permissionCode",value = "权限代码")
        private String permissionCode;
    }
    角色权限关系

    注解是swagger2的,无需关注。另外有个 @TableField(exist = false) 该注解标识这个字段非数据库字段

    持久层处理:

    @Select("select * from  role where role_code in(select role_code from user_role where username = #{username})")
        Set<Role> getUserRoles(String username);
    @Select("select * from permission where permission_code in (select permission_code from role_permission where role_code = #{roleCode})")
        Set<Permission> getRolePermissions(String roleCode);

    第一个sql为获取用户所拥有角色,第二个sql为获取角色所拥有权限

    yml的配置上:

    mybatis-plus:
      type-aliases-package: cn.zytao.taosir.common.model.user
      configuration:
        map-underscore-to-camel-case: true

    映射实体类,开起对下划线转大写的处理

    业务处理上:

        public User findByUsername(String username) {
            User user = userMapper.findByUsername(username);
            Set<Role> roles = userMapper.getUserRoles(username);
            for (Role role : roles) {
                role.setPermissions(roleMapper.getRolePermissions(role.getRoleCode()));
            }
            user.setRoles(roles);
            return user;
        }

    这样就可以很方便的解决多表的联查~因为本人比较懒,不想写配置版,也不喜欢在注解上用@Results来标示结果集

    仍在不断学习中,如有不妥还望指教~

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/it-taosir/p/9992246.html
Copyright © 2011-2022 走看看