Mybatis多对多关联查询

无论是将多对多分解成两个多对一还是直接多对多,都需要中间表的存在,起到关联作用,中间表设置两个外键(将中间表的两个属性都设置为主键),关联两个主表的主键


1.将多对多分解成两个多对一

(1)属性

user表:id、username

role表:id、name

mapping_ur表:userid、roleid

User.java:userid、username、mapping_UR(类型:List<Mapping_UR>)

Role.java:roleid、name、mapping_UR(类型:List<Mapping_UR>)

Mapping_UR.java:role(类型:Role)、user(类型:User)

(2)UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserMapper">
	<!-- 多对多关系映射,使用1对多和多对1嵌套实现,注意映射关系的三张表的主键名称要不相同(uid,rid,urid),否则只能查到1条记录 -->
	<resultMap type="com.pojo.User" id="userMap">
		<id column="id" property="userid"></id>
		<result column="username" property="username" />
		<result column="password" property="password" />
		<collection property="mapping_UR" column="id"
			ofType="com.pojo.Mapping_UR">
			<association column="roleid" property="role" javaType="com.pojo.Role">
				<id column="id" property="roleid"></id>
				<result column="name" property="name" />
			</association>
			<!--  加上后可通过mapping_UR获取user本身
			<association column="userid" property="user" javaType="com.pojo.User">
				<id column="id" property="userid"></id>
				<result column="username" property="username" />
				<result column="password" property="password" />
			</association>
			 -->
		</collection>
	</resultMap>

	 <select id="getusers" resultMap="userMap">
    	select * from user left join mapping_ur on user.id=mapping_ur.userid left join role on mapping_ur.roleid=role.id
    </select>
    
    <select id="getUserByid" resultMap="userMap">
    	select * from user left join mapping_ur on user.id=mapping_ur.userid left join role on mapping_ur.roleid=role.id
		where user.id=#{userid}
    </select>
    
    <select id="getUserByusername" resultMap="userMap">
    	select * from user left join mapping_ur on user.id=mapping_ur.userid left join role on mapping_ur.roleid=role.id
    	where username=#{username}
    </select>
    
    <delete id="deleteuser" parameterType="int">
    	delete from user where user.id=#{userid}
    </delete>
    
    <delete id="deleteuserrole" parameterType="int">
    	delete from mapping_ur where userid=#{0} and roleid=#{1}
    </delete>
    
    <insert id="adduserrole" parameterType="int">
    	 insert into mapping_ur (userid,roleid)
	  	 values (#{0},#{1})
    </insert>
    
    <insert id="adduser" useGeneratedKeys="true" keyProperty="userid" parameterType="com.pojo.User">
    	 insert into user (username,password)
	  	 values (#{username},#{password})
    </insert>
    
    <update id="updateuser" parameterType="com.pojo.User">
    	update user set
    		username=#{username},password=#{password}
    	where user.id=#{userid}
    </update>
    
    <delete id="deleteuseroles" parameterType="int">
    	delete from mapping_ur where userid=#{userid}
    </delete>
</mapper>


2.直接多对多关联

(1)属性

(表的属性根据下面可以清晰获得)

User.java:id、username、password、roleSet(类型:Set<Role>)

Role.java:id、name

(2)UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jay.demo.dao.UserDao">
	<resultMap id="userMap" type="com.jay.demo.bean.User">
		<id property="id" column="USER_ID" />
		<result property="username" column="USER_USERNAME" />
		<result property="password" column="USER_PASSWORD" />
		<!-- 进行 多表关联插叙,先关联user和role -->
		<collection property="roleSet" column="roleid"
			ofType="com.jay.demo.bean.Role">
			<id property="id" column="ROLE_ID" />
			<result property="name" column="ROLE_NAME" />
		</collection>
	</resultMap>

	<sql id="select-base-01">
		SELECT
		u.USER_ID,
		u.USER_USERNAME,
		u.USER_PASSWORD,
		r.ROLE_ID,
		r.ROLE_NAME,
		FROM
		tbl_user as u,
		tbl_role as r,
		tbl_role_user as ru
		WHERE
		u.USER_ID = ru.USER_ID
		AND
		r.ROLE_ID =
		ru.ROLE_ID
	</sql>

	<select id="findUserByUsername" parameterType="string"
		resultMap="userMap">
		<include refid="select-base-01" />
		AND
		u.USER_USERNAME = #{username}
		<!-- select * from tbl_user u, tbl_role r, tbl_role_user tu where u.user_id 
			= tu.user_id and r.role_id = tu.role_id and user_username=#{username} -->
	</select>

</mapper>





猜你喜欢

转载自blog.csdn.net/zzhao114/article/details/55106270