MyBatis 表连接查询写法|三种对应关系

简介: MyBatis 表连接查询写法|三种对应关系

前言

上篇博文把基础部分记录了,本篇是对 表连接查询 中一对一,一对多,多对多关系写法区别的记录总结。


表连接查询

前提最少是两张表,其中的子表设有外键

按对应关系可分为:

一对一

一对多

多对多

对于主外键的关系搞不清楚的可以参考我以往的博文:mysql一点通


一对一关系

有如下两张表格,t_people(人)与t_passport(护照):

f308993a75dd4af7976c9f88fb244ad9.png


793824d574a5462fad6f7bd008880294.png


一个人对应一本护照,同时一本护照对应一个人,而且人不一定有护照,有护照一定会有人存在。

因此外键应设在护照表中,那么就该创建类了:


// Passport:
public class Passport {
    private Integer passportId;
    private String passportSerial;
}
// People
public class People {
    private Integer peopleId;
    private String  peopleName;
    private Passport passport;
}

这样创建非常符合表之间的逻辑关系,但是创建方式并不唯一。

在Passport类中添加People属性也是可以的,即:

// Passport
public class Passport {
    private Integer passportId;
    private String passportSerial;
    private People people;
}
// People
public class People {
    private Integer peopleId;
    private String  peopleName;
}

那实际做项目时应该如何取舍?答案是根据需求:


如果是查询公民以及其对应的护照信息,那就用前者

如果是查询所有护照以及持有者的信息,那就用后者

因此在设计类时不要太死板,两种方法需要斟酌后选择

这里以查询公民以及其对应的护照信息为例,编写项目:


在mapper接口定义方法:

public interface PeopleMapper {
    List<People> selectAll();
}

在xml中编写sql:


<mapper namespace="com.qj.mapper.PeopleMapper">
    <resultMap id="peopleMap" type="People">
        <id property="peopleId" column="people_id"/>
        <result property="peopleName" column="people_name"/>
        <association property="passport" javaType="Passport">
            <id property="passportId" column="passport_id"/>
            <result property="passportSerial" column="passport_serial"/>
        </association>
    </resultMap>
    <select id="selectAll" resultMap="peopleMap">
        select *
        from t_people t1
                 left join t_passport t2 on t1.people_id = t2.people_id
    </select>
</mapper>

重点在于resultMap里的写法:


association 标签用于一对一关系:

propetry 后写属性名

javaType 后写该属性所属类的类型

编写测试类:

public static void main(String[] args) {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    PeopleMapper mapper = sqlSession.getMapper(PeopleMapper.class);
    mapper.selectAll().forEach(System.out::println);
    MybatisUtil.closeSqlSession(sqlSession);
}

这段代码:mapper.selectAll().forEach(System.out::println); 中的写法是在JDK1.8之后有的:


格式:集合.foreach(打印方法)

运行结果:

9d33555158734e9ebcd09a98deae0863.png


一对多关系

有如下两张表格,t_user(用户),t_order(订单):

9180529332c34d76a981d1415d7d30d6.png

12090ac4e98e4c9eab1c45896da2eb7f.png


用户可以下多个订单,一个订单对应一个用户,这就是一种一对多关系。


查询用户及其所有订单信息:

// Order
public class Order {
    private Integer orderId;
    private String orderName;
}
// User
public class User {
    private Integer uId;
    private String userName;
    private String userPwd;
    private List<Order> orders;
}

xml文件的写法:

<mapper namespace="com.qj.mapper.UserMapper">
    <resultMap id="userMap" type="User">
        <id property="uId" column="u_id"/>
        <result property="userName" column="u_username"/>
        <result property="userPwd" column="u_pwd"/>
        <collection property="orders" javaType="java.util.List" ofType="Order">
            <id property="orderId" column="order_id"/>
            <result property="orderName" column="order_name"/>
        </collection>
    </resultMap>
    <select id="selectAll" resultMap="userMap">
        select *
        from t_user t1
                 left join t_order t2
                           on t1.u_id = t2.user_id
    </select>
</mapper>

这里与一对一的区别就在于使用的标签不同:


collection 标签:

property后写属性名

javaType后写集合类型

ofType后写泛型的类型

测试结果:

ffa0ca51fcc7447daa600243dd8c91d2.png


多对多关系

有以下三张表格,表示了学生的选课情况:

3e5a82026c884e17b696dcd861b56796.png

9dfd1e799c67424d82eb7e6146c502c8.png

8154efa4ecc14faf8c1cb64b1b469c2a.png


一个学生可以选多个课程,而一个课程可以被多个学生选择,这就是典型的多对多关系。


而 多对多 与 一对多 关系在xml文件中resultMap的写法几乎一致,因此不做过多解释,看一下sql 语句与测试结果即可:


<select id="selectAll" resultMap="stuMap">
        select *
        from t_stu t1
                 left join t_sc t2 on t1.stu_id = t2.s_id
                 left join t_course t3 on t3.course_id = t2.c_id
    </select>

a5e61e1fdd844e7a874de07531da56f1.png


下篇总结 mybatis 动态sql、常用的标签以及缓存的有关知识,需要的小伙伴记得订阅专栏。



目录
相关文章
|
9月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
789 13
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
1338 9
|
10月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
591 1
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
547 18
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
1849 6
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
756 2
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
573 2
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
472 5
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
519 3
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
816 1