Two ways to configure mybatis cascade query (many people ask me, here is the answer)

Keywords: two ways of mybatis cascade query The


first

configuration way: 1. Define four entities. User Role Privilege Resource, the relationship between them is

2. Requirements: I find out the role corresponding to the user and the permissions and resources corresponding to the role through the username username

3. Entity

public class User implements Serializable {
private String id;
private String username;
private String password;

private Set<Role> role = new HashSet<Role>();

public class Role implements Serializable {
private String id;
private String name;
private String des;

private Set<Privilege> privilege = new HashSet<Privilege >();

public class Privilege implements Serializable { private String id; private String name; private String des;

private Set<Resource> resource = new HashSet<Resource>();  private Privilege parent;  private Set<Privilege> child = new HashSet<Privilege>();

public class Resource implements Serializable {
private String id;
private String uri;
private String des;


4.UserMapper.xml的查询方法为

        <resultMap type="user" id="userResult">
<id column="id" property="id"/>
<result column="username" property="username"/>
<collection property="role" javaType="java.util.Set" resultMap="roleResult"/>
</resultMap>

<resultMap type="role" id="roleResult">
<id column="rid" property="id"/>
<result column="rname" property="name"/>
<result column="rdes" property="des"/>
<collection property="privilege" javaType="java.util.Set" resultMap="privilegeResult"/>
</resultMap>

<resultMap type="privilege" id="privilegeResult">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<collection property="resource" javaType="java.util.Set" resultMap="resourceResult"/>
</resultMap>

<resultMap type="resource" id="resourceResult">
<id column="resid" property="id"/>
<result column="resuri" property="uri"/>
</resultMap>

<select id="findUserByUserName" parameterType="string" resultMap="userResult">
  select u.id,u.username,r.id as rid,r.name as rname,r.des as rdes,p.id as pid,p.name as pname,res.id as resid,res.uri as resuri
  from tb_user u
  left join user_role ur on ur.user_id=u.id
  join tb_role r on r.id=ur.role_id
  join role_privilege rp on rp.role_id=r.id
  join tb_privilege p on p.id=rp.privilege_id
  join tb_resource res on res.privilege_id=p.id
  where u.username=#{username}
</select>

5.UserMapper.java defines the method

@Component
public interface UserMapper {

User findUserByUserName(@Param(value="username")String username) ;

}



The second configuration method:

cascade (association) query, mybatis already has good support, and the configuration is quite simple, for example:

One is one-to-one, the other is one-to-many, association is used for the former, and collection is used for the latter. There are corresponding configurations below.



Of course, one-to-one can be directly configured together, so there is no need to query twice.


    <resultMap id="usersResult" type="com.zlwh.member.model.Users">
        <result property="id" column="id"/>
        <result property="loginName" column="login_name"/>
        < result property="userName" column="user_name"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <result property="status" column= "status"/>
        <result property="userType" column="user_type"/>


        <result property="imgStatus" column="img_status"/>
        <result property="identification" column="identification"/>
        <result property="certificateCode" column="certificate_code"/>
        <result property="countyCode" column="county_code"/>
        <result property="schoolId" column="school_id"/>
        <result property="classId" column="class_id"/>
        <result property="grade" column="grade"/>
        <result property="sex" column="sex"/>
        <result property="birthday" column="birthday"/>
        <result property="mobile" column="mobile"/>
        <result property="inviteCode" column="invite_code"/>
        <result property="subjectId" column="subject_id"/>
        <result property="certificationStatus" column="Certification_status"/>
        <result property="createTime" column="create_time"/>
        <result property="validTime" column="valid_time"/>
        <result property="institutionId" column="institution_id"/>
        <result property="depName" column="dep_name"/>
        <result property="jobName" column="job_name"/>
        <association column="school_id" property="school"
        javaType="com.zlwh.member.model.School"select="getSchoolById" />
    </resultMap>
  
         <resultMap id="schoolResult" type="com.zlwh.member.model.School">
        <result property="id" column="id"/>
        <result property="schoolName" column="school_name"/>
        <result property="schoolCode" column="school_code"/>
        <result property="county" column="county"/>
        <result property="address" column="address"/>
        <result property="phase" column="phase"/>
    </resultMap>
      
    <select id="getSchoolById" resultMap="schoolResult">
        SELECT * FROM school WHERE id = #{id}
    </select>
  
    <resultMap id="usersResultForT" type="com.zlwh.member.model.Users">
        <result property="id" column="id"/>
        <result property="loginName" column="login_name"/>
        <result property="userName" column="user_name"/>
        <result property="inviteCode" column="invite_code"/>
        <collection property="userSubscriptions" column="id" select="getUserSubscriptionsByUserId" ></collection>
    </resultMap>
  

  
    <resultMap id="userSubscriptionResult" type="com.zlwh.member.model.UserSubscription">
        <result property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="subscriptionId" column="subscription_id"/>
        <result property="beginDate" column="begin_date"/>
        <result property="endDate" column="end_date"/>
        <result property="status" column="status"/>
        <result property="createTime" column="create_time"/>
        <result property="orderId" column="order_id"/>
        <result property="orderPrice" column="order_price"/>
        <result property="payTime" column="pay_time"/>   
    </resultMap>
  
    <select id="getStudentsByInviteCode" resultMap="usersResultForT">
        <![CDATA[SELECT id,login_name,user_name,invite_code FROM users    WHERE invite_code = #{inviteCode} and member_type=1]]>
    </select>



<select id="getById" resultMap="usersResult">
        SELECT <include refid="commonColumns"/>
        <![CDATA[
            FROM users
            WHERE
                id = #{id}
        ]]>
    </select>

  
    <!-- Check all paid subscriptions-->
     <select id="getUserSubscriptionsByUserId" resultMap="userSubscriptionResult">
        SELECT * FROM user_subscription WHERE (status=1 or status=3) and user_id = #{userId} order by subscription_id asc
    </select>
  




    <!-- Commonly extracted columns for select query-->
    <sql id="commonColumns">
        <![CDATA[
            id ,
            login_name ,
            user_name ,
            password ,
            email ,
            status ,
            user_type ,
            member_type ,
            img_path ,
            img_status ,
            identification ,
            certificate_code ,
            county_code ,
            school_id ,
            class_id ,
            grade ,
            sex ,
            birthday ,
            mobile ,
            invite_code ,
            subject_id ,
            Certification_status ,
            create_time ,
            valid_time ,
            institution_id ,
            dep_name ,
            job_name
        ]]>
    </sql>

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326524158&siteId=291194637