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