一、目的
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=编辑工作者]]]