关于 Mybatis一对一关系的映射
先准备两张表 , 数据库使用的Mysql
CREATE TABLE person(
pno INT(10) PRIMARY KEY AUTO_INCREMENT ,
pname VARCHAR(20)
)
CREATE TABLE card(
cno INT(10) PRIMARY KEY AUTO_INCREMENT ,
cname VARCHAR(20) ,
pno INT(10) REFERENCES person(pno)
)
创建两个实体类
人的实体类
public class Person {
private Integer pno;
private String pname;
public Integer getPno() {
return pno;
}
public void setPno(Integer pno) {
this.pno = pno;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String toString() {
return "Person [pno=" + pno + ", pname=" + pname + "]";
}
}
身份证实体类
public class Card {
private Integer cno;
private String cname;
private Person person;
public Integer getCno() {
return cno;
}
public void setCno(Integer cno) {
this.cno = cno;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public String toString() {
return "Card [cno=" + cno + ", cname=" + cname + ", person=" + person + "]";
}
}
提示: 尽量把实体类名和数据库中的表名一致 , 实体类中的属性名和表中属性名一致
然后呢就可以写对于数据库操作的接口 , 和对映的映射文件了
先写一个对于人的简单查询
人的操作接口
public interface PersonMapper {
/**
* @category 无条件查询所有的Person数据
* @return
*/
public List<Person> findAll();
/**
* @category 根据人的pno查询
* @param pno
* @return
*/
public Person find(Integer pno);
}
PersonMapper 映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义dtd文件 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 接口操作与数据操作绑定 cn.hong.mapper.PersonMapper 是你的PersonMapper接口路径 -->
<mapper namespace="cn.hong.mapper.PersonMapper">
<!-- 将实体类和数据库中的表绑定 -->
<resultMap type="cn.hong.bean.Person" id="pMap">
<!-- 主键 property指定实体类属性 | column指定数据库表中的属性 | javaType实体类中属性的类型 -->
<id property="pno" column="pno" javaType="Integer"/>
<!-- 普通属性 property指定实体类属性 | column指定数据库表中的属性 | javaType实体类中属性的类型 -->
<result property="pname" column="pname" javaType="String"/>
</resultMap>
<!-- 接口查询操作 id为接口内的方法名 | resultMap为实体和数据对应值 -->
<select id="find" resultMap="pMap">
<!-- 注意SQL语句不能以;结尾否则会报错 -->
SELECT * FROM PERSON
<where>
<if test="pno!=null">
and pno=#{pno}
</if>
</where>
</select>
</mapper>
身份证接口
public interface CardMapper {
/**
* @category 查询Card
* @param Integer
* @return Card
*/
public Card find(Integer no);
}
接口对应的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义dtd文件 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 接口操作与数据操作绑定 cn.hong.mapper.CardMapper 是你的CardMapper接口路径 -->
<mapper namespace="cn.hong.mapper.CardMapper">
<!-- 将实体类和数据库中的表绑定 -->
<resultMap type="cn.hong.bean.Card" id="cMap">
<!-- 主键 property指定实体类属性 | column指定数据库表中的属性 | javaType实体类中属性的类型 -->
<id property="cno" column="cno" javaType="Integer"/>
<!-- 普通属性 property指定实体类属性 | column指定数据库表中的属性 | javaType实体类中属性的类型 -->
<result property="cname" column="cname" javaType="String"/>
<!-- association 指类属性 | property指实体类中的Person类属性 | column指的是数据库中标的属性 |
select 调用 cn.hong.mapper.PersonMapper 空间中的 find 并不是接口中的find方法 -->
<association property="person" column="pno" select="cn.hong.mapper.PersonMapper.find" />
</resultMap>
<!-- 接口查询操作 id为接口内的方法名 | resultMap为实体和数据对应值 -->
<select id="find" resultMap="cMap">
<!-- 注意SQL语句不能以;结尾否则会报错 -->
SELECT * FROM Card
<where>
<if test="pno!=null">
and pno=#{pno}
</if>
</where>
</select>
</mapper>
以上对于mybatis一对一配置的一种方法 , 相比于其他方法这种更加难一点 , 难理解这个其他的也就没问题了!
如果觉得帮到了你就点个赞吧