关于 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一对一配置的一种方法 , 相比于其他方法这种更加难一点 , 难理解这个其他的也就没问题了!

 

如果觉得帮到了你就点个赞吧