Mybatis之高级映射【一对一映射】
1.一对一映射
两表关联查询。有两种方案:映射文件中输出映射使用resultType或者resultMap。
需求:查询人员信息并关联其部门。
数据库两张表:
人员表:
部门表:
(1.)使用resultType映射:
a.建立部门表的pojo:
package com.example.data;
public class Dept {
private String id;
private String deptName;
private String parentId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
@Override
public String toString() {
return "Dept{" +
"id='" + id + '\'' +
", deptName='" + deptName + '\'' +
", parentId='" + parentId + '\'' +
'}';
}
}
b.建立新的pojo类userdept,将人员表user和部门表dept中的属性合并在一起,以便将查询出来的记录映射到该pojo上。
(用到了extends )
package com.example.data;
public class UserDept extends Dept{
private String id;
private String name;
private String sex;
private String age;
private String remark;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "UserDept{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", remark='" + remark + '\'' +
'}';
}
}
c.编写Mapper.xml:
<!--查询人员信息并关联其部门-->
<!--resultType映射的实体类就是构建的user跟dept的组合类-->
<select id="selectMessage" resultType="com.example.data.UserDept">
<![CDATA[ select * from bank_user,bank_dept where bank_user.dept_id=bank_dept.id ]]>
</select>
d.编写Mapper.java:
//查询人员信息并关联其部门
public List<UserDept> selectMessage()throws Exception;
输出结果日志:
(1.)使用resultMap映射:(两种方式)
方式一:嵌套结果
resultMap不需要构造新的pojo,只需将查询出来的记录的值通过resultMap映射到指定到pojo的属性上。
a.建立人员表的pojo:
package com.example.data;
public class User {
private String id;
private String deptId;
private String name;
private String sex;
private String age;
private String remark;
/** * User表中有一个dept_id字段,要在User类中定义一个dept属性, * 用于维护dept和user之间的一对一关系 */
private Dept dept;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeptId() {
return deptId;
}
public void setDeptId(String deptId) {
this.deptId = deptId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", deptId='" + deptId + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age='" + age + '\'' +
", remark='" + remark + '\'' +
", dept=" + dept +
'}';
}
}
b.编写Mapper.xml:
<select id="selectByResultMap" resultMap="selectRstMap">
<![CDATA[ select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id ]]>
</select>
<!--定义resultmap id:指定查询列中的唯一标识,连接select查询标签内的resultmap。如果多个列组成唯一标识,配置多个id type:返回对象类型。(接口中要定义的对象) id标签:主键标签。 column:查询出的列名(给数据库中的列名定义的别名) property:对应type所指定的java实体类POJO中的属性名 -->
<resultMap type="com.example.data.User" id="selectRstMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<!--定义association:一对一映射(将另一张表要查询的信息映射到对象属性传出到一个对象上, 那个对象就拥有要查询的两张表的信息) property:把一对一映射的查询信息封装到对象属性上,封装的对象就是javaType里定义的pojo javaType:property属性的类型 -->
<association property="dept" javaType="com.example.data.Dept">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
c.编写Mapper.java:
//resultmap:查询人员信息并关联其部门
public List<User> selectByResultMap();
输出结果日志:
方式二:嵌套查询
与方式一不同点在Mapper.xml:
<select id="selectByResultMap" resultMap="selectRstMap">
<![CDATA[ select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id ]]>
</select>
<!--定义resultmap-->
<resultMap type="com.example.data.User" id="selectRstMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="sex" property="sex"/>
<!--association:一对一映射 column:(dept_id)user表中的字段,用来与dept表关联 select:定义与select标签连接的标识,select元素通过id引用此名字 -->
<association property="dept" column="dept_id" select="getDept"/>
</resultMap>
<!--id:连接association里select定义的名字-->
<select id="getDept" resultType="com.example.data.Dept">
SELECT dept_name name FROM bank_dept WHERE id=#{id}
</select>
输出结果日志:每个id查询一次,最终汇总
总结:
resultType:pojo中没有包括查询出来的所以列名,则需要增加列名对应的属性(整合所有要查询的信息封装到对象),完成映射。
resultMap:不需要建立新的pojo,但需要在mapper.xml文件中建立association一对一映射。
高级映射:【一对多映射】 【多对多映射】
还没有评论,来说两句吧...