mybatis级联查询的两种配置方式(很多人问我,这里给出答案)

关键字:mybatis级联查询的两种方式


[color=red]第一种配置方式:[/color]

1.定义四个实体。User Role Privilege Resource,他们之间的对于关系为

2.需求:我通过用户名username查找出该用户对应的角色以及角色对应的权限和资源

3.实体

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定义方法

@Component
public interface UserMapper {

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

}


[color=red]第二种配置方式:[/color]

级联(关联)查询,mybatis已经有了很好的支持,配置也相当简单,示例:

一种是一对一的,一种是一结多的, association用于前者,collection用于后者。下面都有相应配置。



当然一对一的,可以直接配置在一起,就不用两次查询了。


<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="memberType" column="member_type"/>
<result property="imgPath" column="img_path"/>
<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>


<!-- 查所有已支付的订阅 -->
<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>





<!-- 用于select查询公用抽取的列 -->
<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值