MyBatis联表查询

一对一关系

数据库中我有两张表t_user和t_dept,t_user表中的每个记录在t_dept中有且只有一条记录与之对应。这种对应关系就是1对1关系。下面来查询每个员工的信息和部门信息。
部门对象:

	private int deptno;
	private String deptname;
	private int deptdesc;

员工对象:

	private int no;
	private String name;
	private int age;
	private Dept dept;

创建这两个对象必须要有无参构造方法,set/get方法。底层还是用的反射实例化的对象。
映射文件配置:

<!-- 定义接收数据库参数类型 -->
<resultMap type="user" id="relaMap">
		<id column="no" property="no"/>
		<result column="name" property="name"/>
		<result column="age" property="age"/>
		<association property="dept" javaType="Dept">
			<id column="deptno" property="deptno"/>
			<result column="deptname" property="deptname"/>
			<result column="deptdesc" property="deptdesc"/>
		</association>
	</resultMap>
	<select id="queryByRe" resultMap="relaMap">
		SELECT t_user.no
		,t_user.name
		,t_user.age
		,t_dept.deptno
		,t_dept.deptname
		,t_dept.deptdesc
		FROM t_user
		LEFT JOIN t_dept
		ON t_user.deptno=t_dept.deptno
	</select>

测试结果:
在这里插入图片描述

一对多关系

上述一对一关系中,一个员工的部门只会有一个,但是反过来,一个部门肯定有多个员工,这种情况下就是一对多关系。下面来对一对多关系的查询。
部门对象:

	private int deptno;
	private String deptname;
	private int deptdesc;
	//list用来放多个员工对象正好体现一对多关系
	private List<User> users;

员工对象:

	private int no;
	private String name;
	private int age;
	//方便测试还是用原来的,这个可有可无
	private Dept dept;

映射文件的配置:

		<!-- 定义返回值dept的接受类型 -->
		<resultMap type="dept" id="reladMap">
		<id column="deptno" property="deptno"/>
		<result column="deptname" property="deptname"/>
		<result column="deptdesc" property="deptdesc"/>
		<collection property="users" ofType="user">
			<id column="no" property="no"/>
			<result column="name" property="name"/>
			<result column="age" property="age"/>
		</collection>
 	</resultMap>
	
	<select id="queryByRed" resultMap="reladMap">
		SELECT 
		u.no
		,u.name
		,u.age
		,d.deptno
		,d.deptname
		,d.deptdesc
		FROM t_user u
		LEFT JOIN t_dept d
		ON u.deptno=d.deptno
	</select>

最后得到测试结果:
在这里插入图片描述

多对多关系

多对多关系就是双向的一对多。

posted @ 2019-07-15 15:26  不生产bug只搬运bug  阅读(186)  评论(0编辑  收藏  举报