MyBatis关联映射
一、Dao层的接口的内容
//一对多关联查询 public SmbmsRoleEntity getAllByRoleId(Integer id); //多对一关联查询 查询所有用户信息 包含角色信息 public List<User> getUserList(); //多对多关联查询 //查询所有学生信息 以及授课教员 public List<Student> getStudentInfo(); //自查询 //查询 河南省下的所有子集 public City getCityAndChildCitys(Integer cid);
二、xml文件的内容
<mapper namespace="com.marketsys.dao.ProviderTest"> <!--由于是关联查询 返回的是多张表中的结果集 ,必须定义resultMap映射--> <!--一对多关联查询--> <!--查询经理角色以及该角色下的员工集合--> <resultMap id="ById" type="com.marketsys.entity.SmbmsRoleEntity"> <id property="rid" column="rid"></id> <result property="roleName" column="roleName"></result> <!--此处使用的是collection节点 ,由于Role类中插入的是List集合 ofType:为集合中的泛型--> <collection property="getRoleEntitys" ofType="com.marketsys.entity.User" select="getUser" column="rid"> <!--在collection中声明Role中的属性与列的映射--> <!--<id property="id" column="id"></id> <result property="userName" column="userName"></result>--> </collection> </resultMap> <!-- <select id="getAllByRoleId" parameterType="int" resultMap="ById"> select r.rid,roleName,u.id,userName from smbms_role r inner join smbms_user u on r.rid=u.userRole where r.rid=#{id} </select>--> <select id="getAllByRoleId" parameterType="int" resultMap="ById"> select * from smbms.smbms_role where rid=#{id} </select> <select id="getUser" resultType="com.marketsys.entity.User"> select * from smbms.smbms_user where userRole=#{rid}; </select> <!--多对一关联查询--> <!--查询所有用户信息 包含用户角色--> <resultMap id="userListAndRole" type="com.marketsys.entity.User"> <id column="id" property="id"></id> <result column="userName" property="userName"></result> <association property="role" javaType="com.marketsys.entity.SmbmsRoleEntity" select="getRole" column="userRole"> <id column="rid" property="rid"></id> <result column="roleName" property="roleName"></result> </association> </resultMap> <!--<select id="getUserList" resultMap="userListAndRole"> select u.id,u.userName,u.userRole,r.rid,r.roleName from smbms.smbms_user as u ,smbms.smbms_role as r where u.userRole=r.rid </select>--> <select id="getUserList" resultMap="userListAndRole"> select * from smbms.smbms_user </select> <select id="getRole" resultType="com.marketsys.entity.SmbmsRoleEntity"> select * from smbms.smbms_role where rid=#{userRole} </select> <!--多对多关联查询--> <!--查询所有学生信息 以及授课教员--> <resultMap id="studentInfoMapper" type="com.marketsys.entity.Student"> <id column="stuid" property="stuid"></id> <result column="stuname" property="stuname"></result> <collection property="teachers" ofType="com.marketsys.entity.Teacher"> <id column="tid" property="tid"></id> <result column="tname" property="tname"></result> </collection> </resultMap> <select id="getStudentInfo" resultMap="studentInfoMapper"> select * from student,teacher,stu_t where student.stuid=stu_t.stuid and teacher.tid=stu_t.tid; </select> <!--自关联查询--> <!--查询河南省下的所有子集--> <resultMap id="cityMapper" type="com.marketsys.entity.City"> <id column="cid" property="cid"></id> <result column="cname" property="cname"></result> <result column="pid" property="pid"></result> <collection property="childCitys" ofType="com.marketsys.entity.City" select="getCity" column="cid"> <id column="cid" property="cid"></id> <result column="cname" property="cname"></result> <result column="pid" property="pid"></result> </collection> </resultMap> <select id="getCityAndChildCitys" resultMap="cityMapper"> select * from city where cid=#{cid} </select> <select id="getCity" resultMap="cityMapper"> select * from city where pid=#{cid}; </select> </mapper>
三、关联查询测试类的内容
//一对一
@Testpublic void getUserListTest(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); ISmbmsUserDao mapper = sqlSession.getMapper(ISmbmsUserDao.class); List<SmbmsUser> userList = mapper.getUserList(); for(SmbmsUser user:userList){ System.out.println("用户:"+user.getUserName()+"\t角色:"+user.getRole().getRoleName()); }}
//一对多
public void getRoleAndUserTest(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); ISmbmsRoleDao mapper = sqlSession.getMapper(ISmbmsRoleDao.class); SmbmsRole role = mapper.getRoleAndUser(3); System.out.println("角色:"+role.getRoleName()); for(SmbmsUser user : role.getUserList()){ System.out.print("\t用户:"+user.getUserName()); }}
//多对一
@Testpublic void getRoleAndUserTest(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); ISmbmsRoleDao mapper = sqlSession.getMapper(ISmbmsRoleDao.class); SmbmsRole role = mapper.getRoleAndUser(3); System.out.println("角色:"+role.getRoleName()); for(SmbmsUser user : role.getUserList()){ System.out.print("\t用户:"+user.getUserName()); }}
//多对多 @Test public void test3(){ List<Student> studentInfo = providerTest.getStudentInfo(); for (Student student:studentInfo){ System.out.println("学生:"+student.getStuname()); for (Teacher teacher:student.getTeachers()){ System.out.println("\t教员:"+teacher.getTname()); } } } //自查询 @Test public void test4(){ City cityAndChildCitys = providerTest.getCityAndChildCitys(410000); System.out.println(cityAndChildCitys.toString()); }
四、关联查询含义
1.一对一
在任意一方引入对方主键作为外键。
2.一对多关联查询
一对多关联查询是指,在查询一对象的时候,同时将其所关联的多放对象也都查询出来。
3.多对一关联查询
这里的多对一关联查询是指,在查询多方对象的时候,同时将其所关联的一方对象也查询出来。
由于查询多方对象时也是一个一个查询,所以多对一关联查询,其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。
4.多对多关联查询
多对多关联关系,例如一个学生可以选多门课程,而一门课程可以由多个学生选择。多对多关系,其实是由两个互反的一对多关系组成。一般情况下,多对多关系都会通过一个中间表来建立
5.自关联查询
所谓自关联查询是指,自己即充当一方,又充当多方,是1:n或n:1的变型。例如,对于新闻栏目NewsLabel,可以充当一方,即父栏目,也可以充当多方,即子栏目。而反映到DB表中,只有一张表,这张表中具有一个外键,用于表示该栏目的父栏目。一级栏目没有父栏目,所以可以将其外键值设为0,而子栏目则具有外键值。
将自关联分为两种情况。一种是当作1:n,即当前类作为一方,其包含多方的集合域属性。一种是当作n:1,即当前类作为多方,其包含一方的域属性。