一. MyBatis的一对一映射
在业务开发中,常常会遇到关联联系的,如表与表之间的一对一关系。如,员工与员工的身份证号, 这就是典型的一对一。 可以与Hibernate的一对一 区别理解。
Hibernate的一对一映射地址为: https://blog.csdn.net/yjltx1234csdn/article/details/83241189
员工表 User:
身份证表 IdCard:
其中,IdCard 表中的 uid 并不是外键,只是User 表中id 相对应的那个字段, 值完全一样,但并不用外键,避免删除和修改时与User 表有太大的影响。
其所对应的实体类为:
User.java
package com.yjl.pojo; /** @author:yuejl @date: 2019年6月15日 上午11:11:02 @Description Mybatis 使用的基本类 User */ public class User { /** * @param id id编号,自增 * @param name 姓名 * @param age 年龄 * @param sex 性别 * @param description 描述 */ private Integer id; private String name; private Integer age; private String sex; private String description; //引入id card 的关联类型. private IdCard idCard; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", description=" + description + ", idCard=" + idCard + "]"; } }
IdCard.java 类:
package com.yjl.pojo; /** @author: yuejl @date: 2019年7月5日 下午12:41:47 @Description 类的相关描述 */ public class IdCard { /** * @param uid 身份证唯一标识符 * @param idNum 身份证标识符 */ private Integer id; private String idNum; //引入员工的属性 private User userId; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getIdNum() { return idNum; } public void setIdNum(String idNum) { this.idNum = idNum; } public User getUserId() { return userId; } public void setUserId(User userId) { this.userId = userId; } @Override public String toString() { return "IdCard [id=" + id + ", idNum=" + idNum + ", userId=" + userId + "]"; } }
二. ResultMap 元素
resultMap 中所具有的元素有:
<resultMap> <!--构造函数--> <constructor> <!--主键的--> <idArg /> <!--普通属性--> <arg/> </constructor> <!--属性主键--> <id /> <!--普通属性 result--> <result /> <!--一对一关联查询--> <association /> <!---一对多关联查询--> <collection /> <!--鉴别器--> <discriminator javaType=""> <case value=""></case> </discriminator> </resultMap>
id,result 前面已经讲解过了, 下面讲解一下 constructor 和 association, collection和discriminator 后面章节会讲。
constructor 为构造参数, 在User 表中添加 构造方法, 参数为 id,普通属性有 name 和sex。 手动添加空构造方法。
public User(){ } public User(Integer id,String name,String sex){ this.id=id; this.name=name; this.sex=sex; }
接口为:
public User getById(int id);
则以前的id,result 为:
<resultMap type="user" id="userResultMap"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> </resultMap> <!-- 嵌套结果 --> <select id="getById" parameterType="int" resultMap="userResultMap"> select * from user where id=#{id} </select>
则可以改成:
<resultMap type="user" id="userResultMap"> <constructor> <!--顺序与构造方法的参数顺序必须一样。 javaType 必须填写。--> <idArg javaType="int" column="id" /> <arg javaType="string" column="name"/> <arg javaType="string" column="sex"/> </constructor> </resultMap>
其中, javaType 如果是Integer, 则可以写成’int’, 如果类型是 int,则可以写成’_int’ ,字符串 为’string’.
注意,不要用name 节点. 3.4.3版本之后,才添加了注解。