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