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>
最后得到测试结果:
多对多关系
多对多关系就是双向的一对多。