Mybatis多表查询(一对一、一对多、多对多)

一、一对一表关系查询

表person表person

表cardid表idcard

根据表构建对应的domain实体对象

Person.class

package domain;

public class Person {
    private Integer pid;
    private String pname;
    private Idcard idcard;

    public Person() {
    }

    public Person(Integer pid, String pname, Idcard idcard) {
        this.pid = pid;
        this.pname = pname;
        this.idcard = idcard;
    }

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public Idcard getIdcard() {
        return idcard;
    }

    public void setIdcard(Idcard idcard) {
        this.idcard = idcard;
    }

    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", pname='" + pname + '\'' +
                ", idcard=" + idcard +
                '}';
    }
}

Idcard.class

package domain;

public class Idcard {
    private String cardid;
    private String address;

    public Idcard() {
    }

    public Idcard(String cardid, String address) {
        this.cardid = cardid;
        this.address = address;
    }

    public String getCardid() {
        return cardid;
    }

    public void setCardid(String cardid) {
        this.cardid = cardid;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Idcard{" +
                "cardid='" + cardid + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

1.基于Mapper方式

PersonDao接口

package dao;

import domain.Person;

public interface PersonDao {
    public Person selectOne(Integer pid);
}

(1)嵌套查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.PersonDao">
    <resultMap id="selectIdcard" type="domain.Person">
        <id property="pid" column="pid"></id>
        <result property="pname" column="pname"></result>
        <association property="idcard" column="cardid" select="selectBycardid" javaType="domain.Idcard"></association>
    </resultMap>
    <select id="selectBycardid" resultType="domain.Idcard">
        select * from idcard where cardid=#{cardid};
    </select>
    <select id="selectOne" resultMap="selectIdcard">
        select * from person where pid=#{pid}
    </select>
</mapper>

(2)联合查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.PersonDao">
    <resultMap id="selectIdcard" type="domain.Person">
        <id property="pid" column="pid"></id>
        <result property="pname" column="pname"></result>
        <association property="idcard" javaType="domain.Idcard">
            <id property="cardid" column="cardid"></id>
            <result property="address" column="address"></result>
        </association>
    </resultMap>
    <select id="selectOne" resultMap="selectIdcard">
        select a.pid,a.pname,a.cardid,b.address from person a inner join idcard b on a.cardid=b.cardid where pid=#{pid};
    </select>
</mapper>

2.基于Annotation方式

PersonDao接口

package dao;

import domain.Idcard;
import domain.Person;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

public interface PersonDao {
    @Results(
            id = "selectIdcard",
            value = {
                    @Result(property = "pid",column = "pid",id=true),
                    @Result(property = "pname",column = "pname"),
                    @Result(property = "idcard",javaType = Idcard.class,column = "cardid",one=@One(select = "selectcardid",fetchType = FetchType.LAZY))
            }
    )
    @Select("select * from person where pid=#{pid}")
    public Person selectOne(Integer pid);
    @Select("select * from idcard where cardid=#{cardid}")
    public Idcard selectcardid(String cardid);
}

注意:基于注解方式查询,只有嵌套查询方式。

二、一对多表关系查询

表dept表dept
表emp表emp
根据表构建对应的domain实体对象

Dept.class

package domain;

import java.util.List;

public class Dept {
    private Integer deptno;
    private String dname;
    private String loc;
    private List<Emp> empList;

    public Dept() {
    }

    public Dept(Integer deptno, String dname, String loc, List<Emp> empList) {
        this.deptno = deptno;
        this.dname = dname;
        this.loc = loc;
        this.empList = empList;
    }

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    public List<Emp> getEmpList() {
        return empList;
    }

    public void setEmpList(List<Emp> empList) {
        this.empList = empList;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname='" + dname + '\'' +
                ", loc='" + loc + '\'' +
                ", empList=" + empList +
                '}';
    }
}

Emp.class

package domain;

import java.sql.Date;

public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Date hiredate;
    private Float sal;
    private Float comm;
    private Dept dept;

    public Emp() {
    }

    public Emp(Integer empno, String ename, String job, Integer mgr, Date hiredate, Float sal, Float comm, Dept dept) {
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
        this.dept = dept;
    }

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Integer getMgr() {
        return mgr;
    }

    public void setMgr(Integer mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Float getSal() {
        return sal;
    }

    public void setSal(Float sal) {
        this.sal = sal;
    }

    public Float getComm() {
        return comm;
    }

    public void setComm(Float comm) {
        this.comm = comm;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", job='" + job + '\'' +
                ", mgr=" + mgr +
                ", hiredate=" + hiredate +
                ", sal=" + sal +
                ", comm=" + comm +
                ", dept=" + dept +
                '}';
    }
}

1.基于Mapper方式

DeptDao接口

package dao;

import domain.Dept;

public interface DeptDao {
    public Dept selectOne(Integer deptno);
}

(1)嵌套查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.DeptDao">
    <resultMap id="selectDept" type="domain.Dept">
        <id property="deptno" column="deptno"></id>
        <result property="dname" column="dname"></result>
        <result property="loc" column="loc"></result>
        <collection property="empList" column="deptno" javaType="list" ofType="domain.Emp" select="selectEmp"></collection>
    </resultMap>
    <select id="selectEmp" resultType="domain.Emp">
        select * from emp where deptno=#{deptno}
    </select>
    <select id="selectOne" resultMap="selectDept">
        select * from dept where deptno=#{deptno}
    </select>
</mapper>

(2)联合查询

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.DeptDao">
    <resultMap id="selectOne" type="domain.Dept">
        <id property="deptno" column="deptno"></id>
        <result property="dname" column="dname"></result>
        <result property="loc" column="loc"></result>
        <collection property="empList" javaType="list" ofType="domain.Emp">
            <id property="empno" column="empno"></id>
            <result property="ename" column="ename"></result>
            <result property="job" column="job"></result>
            <result property="mgr" column="mgr"></result>
            <result property="hiredate" column="hiredate"></result>
            <result property="sal" column="sal"></result>
            <result property="comm" column="comm"></result>
        </collection>
    </resultMap>
    <select id="selectOne" resultMap="selectOne">
        select a.deptno,a.dname,a.loc,b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,b.comm from dept a inner join emp b on a.deptno=b.deptno where a.deptno=#{deptno}
    </select>
</mapper>

2.基于Annotation方式

DeptDao接口

package dao;

import domain.Dept;
import domain.Emp;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

public interface DeptDao {
    @Results(
            id = "selectDept",
            value = {
                    @Result(property ="deptno",column = "deptno"),
                    @Result(property = "dname",column = "dname"),
                    @Result(property = "loc",column = "loc"),
                    @Result(property = "empList",column = "deptno",javaType = List.class,many = @Many(select = "selectEmp",fetchType = FetchType.LAZY))
            }
    )
    @Select("select * from dept where deptno=#{deptno}")
    public Dept selectOne(Integer deptno);
    @Select("select * from emp where deptno=#{deptno}")
    public Emp selectEmp(Integer deptno);
}

三、多对多表关系查询

多对多表关系查询与一对多查询类似,不过多赘述。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值