三、mybatis多对多关联

一、目的

1、第一篇 mybatis基本的CURD,第二篇 mybatis 多级关联映射配置

使用典型的案例 用户-角色 来实现基于mybatis的多对多关联

二、三张表

user(用户表)role(角色表)user_role(中间表)

user表对应的domain--User.java

package com.bjx.domain;

import java.util.List;

public class User{
	private int id;
	private String name;
	private String phone;
	private String address;
	private int age;
	private String hobby;
	private List<News> news;
    //xml映射使用方法一:通过中间表获取角色
	private List<UserRole> userRole;
    //xml映射使用方法二:直接关联角色,这种方法更简洁
    private List<Role> roles;
    //getter、setter方法省略

role表对应的domain--Role.java

package com.bjx.domain;

public class Role {
	private int role_id;
	private String rolename;
    // getter、setter方法省略

user_role中间表对应的domain--UserRole.java

package com.bjx.domain;

public class UserRole {
	private int u_r_id;
	private int uid;
	private int rid;
	private Role role;
//getter、setter方法省略

三、UserMapping.xml映射文件

<!--
 获取指定用户以及对应的角色(多对多)
 方法一:
 这是相对复杂一点的写法,但是表之间的关联关系表达的更清晰、易懂
 -->
    <resultMap type="com.bjx.domain.User" id="resultUserAndRole" autoMapping="true">
		<id column="userid" property="id"></id>
		<collection property="userRole" ofType="com.bjx.domain.UserRole">
			<id property="u_r_id" column="u_r_id" />
			<association property="role" javaType="com.bjx.domain.Role">
				<id property="role_id" column="role_id" />
				<result property="rolename" column="rolename"/>
			</association>
		</collection>
	</resultMap>
	
	<select id="userRole" resultMap="resultUserAndRole" parameterType="Integer">
		select u.name,u.id userid,u.phone,
		r.rolename,r.role_id
		from user u left join user_role ur on u.id=ur.uid
		left join role r on ur.rid=r.role_id where u.id=#{id}; 
	</select>
<!--
 获取指定用户以及对应的角色(多对多)
 方法二:用户表直接关联角色表
 查询语句时不变的
 -->
<resultMap type="com.bjx.domain.User" id="resultUserAndRole">
	<id column="userid" property="id"></id>
	<collection property="roles" ofType="com.bjx.domain.Role">
		<id property="role_id" column="role_id" />
		<result property="rolename" column="rolename" />
	</collection>
</resultMap>

四、Dao文件

package com.bjx.dao;

import java.util.List;

import com.bjx.domain.User;

public interface UserDao {
	
	//获取指定用户及其角色
	public User userRole(int id);
}

五、调用

如何生成sqlSession省略

@Test
public void getUserAndrole() {
	UserDao userDao = sqlSession.getMapper(UserDao.class);
	User userRole = userDao.userRole(1);
	System.out.println(userRole);
}

六、结果打印

第一种方法获取的结果:
User [id=2, name=nz, phone=18326552894, address=null, age=0, hobby=null, news=null, userRole=[UserRole [u_r_id=0, uid=0, rid=0, role=Role [role_id=3, rolename=开发人员]], UserRole [u_r_id=0, uid=0, rid=0, role=Role [role_id=2, rolename=编辑工作者]]]]

第二种方法获取的结果:
User [id=2, name=null, phone=null, address=null, age=0, hobby=null, news=null, roles=[Role [role_id=3, rolename=开发人员], Role [role_id=2, rolename=编辑工作者]]]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值