MyBatis 多表查询

1.多表设计 多表查询

a.多表设计

(1)一对一

  在任意一方设计外键保存另一张表的主键,维系表和表的关系

(2)一对多

  在多的一方设计外键保存一的一方的主键,维系表和表的关系

(3)多对多

  设计一张第三方关系表,存储两张表的主键的对应关系,将一个多对多拆成两个一对多来存储

b.多表查询

笛卡尔积查询

内连接查询

外连接查询

  左外连接查询

  右外连接查询

  全外连接查询

2.MyBatis中的一对一查询

create table room(id int primary key,name varchar(255));
insert into room values (1,‘mhw‘),(2,‘兰花屋‘),(3,‘桃花屋‘);
create table grade(id int primary key,name varchar(255), rid int);
insert into grade values (999,‘向日葵班‘,2),(888,‘玫瑰花班‘,3),(777,‘菊花班‘,1);

在通过MyBatis实现一对一的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,

在一对一的bean中,如果包含了另一个表的对应对象,则可以在resultMap中通过association标签来声明映射方式:

配置方式:

    <!-- 一对一查询 -->
    <resultMap type="cn.tedu.mybatis.beans.Grade" id="gradeRM">
        <id column="gid" property="id"/>
        <result column="gname" property="name"/>
        <association property="room" javaType="cn.tedu.mybatis.beans.Room">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
        </association>
    </resultMap>

    <select id="queryO2O" resultMap="gradeRM">
        select grade.id as gid,grade.name as gname
                ,room.id as rid,room.name as rname
        from
            room,grade
        where
            room.id = grade.rid;
    </select>
    

测试类:

    // 根据配置文件创建sqlSessionFactory
    private SqlSessionFactory factory = null;
    @Before
    public void before() throws Exception{
        //1.读取MyBatis核心配置文件
        InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
        //2.根据配置文件创建sqlSessionFactory
        factory = new SqlSessionFactoryBuilder().build(in);
    }

    /**
     * 多表查询:一对一
     */
    @Test
    public void test13(){
        //1.创建sqlSession
        SqlSession session = factory.openSession();
        //2.执行操作
        List<Grade> list = session.selectList(
                "cn.tedu.mybatis.beans.UserMapper.queryO2O");
        //3.打印结果
        System.out.println(list);
    }

3.MyBatis中的一对多查询

create table dept(id int primary key,name varchar(255));
insert into dept values (1,‘财务部‘),(2,‘行政部‘),(3,‘人事部‘),(4,‘销售部‘);
create table emp(id int primary key,name varchar(255), deptid int);
insert into emp values (999,‘孙悟空‘,4),(888,‘萨达姆‘,3),(777,‘哈利波特‘,1),(666,‘特朗普‘,2);

在通过MyBatis实现一对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在一对多的bean中,

如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式:

    <!-- 一对多查询 -->
    <resultMap type="cn.tedu.mybatis.beans.Dept" id="deptRM">
        <id column="did" property="id"/>
        <result column="dname" property="name"/>
        <collection property="empList" ofType="cn.tedu.mybatis.beans.Emp">
            <id column="eid" property="id"/>
            <result column="ename" property="name"/>
        </collection>
    </resultMap>

    <select id="queryO2M" resultMap="deptRM">
        select
            dept.id as did,
            dept.name as dname,
            emp.id as eid,
            emp.name as ename
        from
            dept inner join emp on dept.id = emp.deptid;
    </select>

测试类:

    /**
     * 多表查询:一对多
     */
    @Test
    public void test14(){
        //1.创建sqlSession
        SqlSession session = factory.openSession();
        //2.执行操作
        List<Dept> list = session.selectList(
                "cn.tedu.mybatis.beans.UserMapper.queryO2M");
        //3.打印结果
        System.out.println(list);
    }

3.MyBatis中的多对多查询

create table stu(id int primary key,name varchar(255));
insert into stu values (1,‘小新‘),(2,‘小白‘),(3,‘美伢‘),(4,‘风间‘);
create table teacher(id int primary key,name varchar(255));
insert into teacher values (999,‘孙悟空‘),(888,‘猪八戒‘),(777,‘萨达姆‘),(666,‘哈利波特‘);
create table stu_teacher (sid int,tid int);
insert into stu_teacher values (1,999),(1,888),(2,999),(2,777),(3,666),(4,888),(4,666);

在通过MyBatis实现多对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在多对多的bean中,

如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式

    <!-- 多对多查询  -->
    <resultMap type="cn.tedu.mybatis.beans.Teacher" id="teacherRM">
        <id column="tid" property="id"/>
        <result column="tname" property="name"/>
        <collection property="stuList" ofType="cn.tedu.mybatis.beans.Stu">
            <id column="sid" property="id"/>
            <result column="sname" property="name"/>
        </collection>
    </resultMap>

    <select id="queryM2M" resultMap="teacherRM">
        select
            stu.id as sid,
            teacher.id as tid,
            stu.name as sname,
            teacher.name as tname
        from
            stu,teacher,stu_teacher
        where
            stu.id = stu_teacher.sid
            and
            teacher.id = stu_teacher.tid;
    </select>

测试类:

    /**
     * 多表查询:多对多
     */
    @Test
    public void test15(){
        //1.创建sqlSession
        SqlSession session = factory.openSession();
        //2.执行操作
        List<Teacher> list = session.selectList(
                "cn.tedu.mybatis.beans.UserMapper.queryM2M");
        //3.打印结果
        System.out.println(list);
    }

原文地址:https://www.cnblogs.com/chuijingjing/p/9860708.html

时间: 2024-08-05 01:03:55

MyBatis 多表查询的相关文章

mybatis 关联表查询

这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例:其中get和set的方法我就没有生成了,请自行生成: 实体类: public class User { private String id; private String name; private String password; private Product product; } publi

Mybatis关联表查询_5

使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明. 创建表和数据 创建教师表,班级表,学生表, 假设一个老师只负责教一个班,那么老师和班级之间的关系是一对一的关系. 假设一个班级有多个学生,那么班级和学生之间的关系是一对多的关系. CREATE TABLE teacher( t_id number(5) PRIMARY KEY, t_name VARCHAR2(20) ); CREATE TABLE class( c_id number(5)

mybatis 联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN

Mybatis多表查询之一对一查询的多种实现-XML配置

Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码.R

千字文带你入门-MyBatis多表查询

MyBatis多表操作 经过了 MyBatis 基本增删改查的学习,而在实际的项目中,我们往往会接触到多表的操作,什么是多表呢, 在实际生活中,每个实体之间往往是存在关系的,而我们的项目却是要依赖数据库将这些实体之间的关系串联起来,从而实现我们的业务,所以这部分,我们着重讲解如何使用 MyBatis 框架处理多张数据表之间的联系,帮助我们更加理解数据库的映射关系 (一) 表间关系 A:一对多 用户和订单/理财产品 一个用户可以买好几个批次的理财产品 部门和员工 一个部门可以有很多员工 B:多对一

mybatis多表查询,自动生成id

主要是在配置文件中,配置好所要包含的字段. 类关系:account----role,1对1 account包含role类 java类: public class Account{ private Integer accountId; private String username; private String password; private Role role; } public class Role { private Integer id; private Integer leave;

mybatis多表查询

1.在类的属性里定义另一个关联类,在mapper.xml里写result-mapper加association 2.表很多的话,可以在数据库里建视图view,把不同表里需要的字段写到一张视图里 写pojo类的时候直接根据视图来写,这样操作起来方便 3.把要用的字段写一个封装类,在select里多写几个语句,把查出来的结果再封装到这个类里 暂时只有这三个思路,有更好的办法再补充吧...

MyBatis框架——多表查询

MyBatis多表查询, 从表中映射主表,使用 association 标签,通过设置 javaType 属性关联实体类: 主表映射从表,使用 collection 标签,通过 ofType 属性关联实体类.    示例: 1.创建数据库 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50620 Source Host : 127.0.0.1:3306 Source Databas

mybatis之联表查询

今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springMVC+mybatis,所以很自然的就想到了联表查询. 一开始认为mybatis编写语句很简单,但是在编写的时候遇到了一些细节问题,所以发文记录一下. 先说一下背景: 框架:spring+springMVC+mybatis 表结构: 1.主表 2.从表 从表的uid对应主表的id,并将主表的id设为主