美文网首页
原生一对多查询

原生一对多查询

作者: _FireFly_ | 来源:发表于2020-11-13 09:16 被阅读0次

查询一个dept部门的部门信息和该部门下所有员工信息(这是一对多,一个部门下有多个员工)

Emp

package domain;

public class Emp {

    //自有属性
    private Integer empno;
    private String ename;
    private Float sal;
    //关联属性  deptno-->外键-->对象
    private Dept dept;

    public Emp() {}
    public Emp(Integer empno, String ename, Float sal, Dept dept) {
        this.empno = empno;
        this.ename = ename;
        this.sal = sal;
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empno=" + empno +
                ", ename='" + ename + '\'' +
                ", sal=" + sal +
                ", 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 Float getSal() {
        return sal;
    }
    public void setSal(Float sal) {
        this.sal = sal;
    }
    public Dept getDept() {
        return dept;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }

}

Dept

package domain;

import java.util.List;

public class Dept {

    //自有属性
    private Integer deptno;
    private String dname;
    private String loc;
    //为了根据deptno部门编号查询 部门中所有的人更加方便
    //也存储一个关联属性     一个部门中有好多员工  List<Emp>
    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;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptno=" + deptno +
                ", dname='" + dname + '\'' +
                ", loc='" + loc + '\'' +
                ", 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;
    }

}

DeptDao

public class DeptDao {

    private SqlSession sqlSession = MyUtil.getSqlSession(true);

    //设计一个方法 根据给定的deptno部门编号 查询部门信息+这个部门中的所有员工信息
    public Dept selectOne(Integer deptno){
        return sqlSession.selectOne("selectOne",deptno);
    }

    //设计一个方法 查询所有部门的信息 + 每一个部门中的所有员工信息
    public List<Dept> selectAll(){
        return sqlSession.selectList("selectAll");
    }
}

DeptMapper.xml

<?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">

    <!-- 方式一 利用两条语句 分别查询 也出现N+1问题 设置延迟加载的方式解决 -->
    <!--<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" javaType="list" ofType="domain.Emp" select="selectEmpForDept" column="deptno"></collection>-->
    <!--</resultMap>-->
    <!--<select id="selectEmpForDept" resultType="domain.Emp">-->
        <!--select empno,ename,sal,deptno from emp where deptno = #{deptno}-->
    <!--</select>-->

    <!-- 方式二 利用联合查询 一次性将所有记录都查到 直接赋值就可以啦 -->
    <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" javaType="list" ofType="domain.Emp">
            <id property="empno" column="empno"></id>
            <result property="ename" column="ename"></result>
            <result property="sal" column="sal"></result>
        </collection>
    </resultMap>

    <!--========================================================-->
    <select id="selectOne" resultMap="selectDept">
        <!-- 方式一 -->
        <!--select deptno,dname,loc from dept where deptno = #{deptno}-->

        <!-- 方式二 -->
        select e.empno,e.ename,e.sal,d.deptno,d.dname,d.loc from emp e right outer join dept d on e.deptno = d.deptno where d.deptno = #{deptno}
    </select>

    <select id="selectAll" resultMap="selectDept">
        <!-- 方式一 -->
        <!--select deptno,dname,loc from dept-->

        <!-- 方式二 -->
        select e.empno,e.ename,e.sal,d.deptno,d.dname,d.loc from emp e right outer join dept d on e.deptno = d.deptno
    </select>
</mapper>

EmpDao

package dao;

import domain.Emp;
import org.apache.ibatis.session.SqlSession;
import util.MyUtil;

import java.util.List;

public class EmpDao {

    //一个sqlSession对象
    private SqlSession sqlSession = MyUtil.getSqlSession(true);


    //设计一个方法 提供一个empno员工编号 查询员工的信息+部门信息
    public Emp selectOne(Integer empno){
        return sqlSession.selectOne("selectOne",empno);
    }

    //设计一个方法 提供一个查询所有员工信息+部门信息
    public List<Emp> selectAll(){
        return sqlSession.selectList("selectAll");
    }
}

EmpMapper.xml

<?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.EmpDao">

    <!--自定义规则 方式一 两条语句查询-->
    <!--<resultMap id="selectEmp" type="domain.Emp">-->
        <!--<id property="empno" column="empno"></id>-->
        <!--<result property="ename" column="ename"></result>-->
        <!--<result property="sal" column="sal"></result>-->
        <!--<association property="dept" javaType="domain.Dept" select="selectDeptForEmp" column="deptno"></association>-->
    <!--</resultMap>-->
    <!--<select id="selectDeptForEmp" resultType="domain.Dept">-->
        <!--select deptno,dname,loc from dept where deptno = #{deptno}-->
    <!--</select>-->

    <!--自定义规则 方式二 一条语句查询 联合-->
    <resultMap id="selectEmp" type="domain.Emp">
        <id property="empno" column="empno"></id>
        <result property="ename" column="ename"></result>
        <result property="sal" column="sal"></result>
        <association property="dept" javaType="domain.Dept">
            <id property="deptno" column="deptno"></id>
            <result property="dname" column="dname"></result>
            <result property="loc" column="loc"></result>
        </association>
    </resultMap>

    <!--=======================================================-->
    <select id="selectOne" resultMap="selectEmp">
        <!--方式一-->
--         select empno,ename,sal,deptno from emp where empno = #{empno}
        <!--方式二-->
        select e.empno,e.ename,e.sal,d.deptno,d.dname,d.loc from emp e left outer join dept d on e.deptno = d.deptno where e.empno = #{empno}
    </select>
    <select id="selectAll" resultMap="selectEmp">
        <!--方式一-->
--         select empno,ename,sal,deptno from emp
        <!--方式二-->
        select e.empno,e.ename,e.sal,d.deptno,d.dname,d.loc from emp e left outer join dept d on e.deptno = d.deptno
    </select>
</mapper>

configuration.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/testmybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--<mapper resource="mapper/EmpMapper.xml"></mapper>-->
        <mapper resource="mapper/DeptMapper.xml"></mapper>
    </mappers>
</configuration>

相关文章

  • 原生一对多查询

    查询一个dept部门的部门信息和该部门下所有员工信息(这是一对多,一个部门下有多个员工) Emp Dept Dep...

  • 原生一对多查询

    查询一个emp员工的所有信息 包括员工所在部门信息 (这是一对一,一个员工只对应一个部门) 实体Emp 实体De...

  • Django-关系映射

    关系映射 一对一映射 语法 查询 一对多映射 语法 查询 多对多映射 语法 查询 自定义查询对象

  • SpringBoot+Spring JPA基础使用

    Spring JPA集成基础查询实例复杂查询+分页一对多查询及多对多查询 1. Spring JPA集成 1.1 ...

  • 关系的种类对于性能的影响

    一对多单向只有一个查询: 一对一双向同样只有一个查询: 多对一(维表为多端)双向,4个查询: 多对多双向,5个查询...

  • 旧不更新--后台一对多表查询

    关键字:mybaits关联查询,mybaits一对多查询,一个表单里面有多个附件,mapper.xml中一对多查询...

  • mysql ---多对多

    flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询(venv) $ pip install...

  • Django模型层之多表操作(三)

    基于对象的跨表查询 一对多查询(publish与book) 一对一查询(Author 与 AuthorDetail...

  • 黑马SQL笔记 - 基础篇 - 4. 多表查询

    多表关系 一对多 多对多 一对一 连接查询 自连接:当前表与自身的连接查询,自连接必须使用表别名内连接:相当于查询...

  • mybatis CURD及进阶语句示例

    目录 插入 删除 修改 查询 1. 查询全部 2. 多条件查询 3. 模糊查询 4. 一对多查询 5. 多...

网友评论

      本文标题:原生一对多查询

      本文链接:https://www.haomeiwen.com/subject/mlbavktx.html