Mybatis-多表联查

这篇具有很好参考价值的文章主要介绍了Mybatis-多表联查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在数据库查询中,很多时候不只是查询一张表,而是需要将多张表结合起来才能获得需要的数据,下面介绍在mybatis中怎么实现多表联查(前提是所有的依赖均已配置完成)

一、步骤一:创建pojo实体类

将需要用到的表全部创建成java的实体类,导入lombok依赖(自动生成get、set等方法)
User 用户表 Order 订单表

@Data
public class User {
    private Integer ID;
    private String username;
    private String PASSWORD;
    private String sex;
    private Date brithday;
    private String address;
}

二、步骤二:明确两个实体类之间的关系

一个用户可以有多条订单,而一条订单只属于一个用户
所以;:用户对订单是1对多的关系
 
在设计数据库时(黄色部分):在多的一方(tb_order)中添加一个外键,与tb_user的主键对应(图中为uid)
 
在设计java对象时(红色部分): 需要根据题目进行pojo类的编写(具体看步骤三)

mybatis多表联合查询,Mybatis,mybatis,java,数据库


三、步骤三:修改pojo实体类

先分析清楚题目 如:

①:根据id查询订单以及订单的所属用户信息
=> 返回的数据是tb_order表中的数据+tb_user表中的数据,需要修改的实体类是Order,因为是根据order的id查询的


//需要在Order的实体类中引入User对象
public class Order {
    private Integer id;
    private Integer userid;
    private Date createtime;
    private String state;

//    多对一
    private User user = new User();
}

②:根据用户id查询她的各类订单
=>返回的数据是tb_user+tb_order表中的数据,但是不同与上面的是:由于订单有多条所以订单需要用集合来装,而查询出的数据是要根据用户的id查询所有需要修改User类

// 需要在User表中的实体类中引入数据类型为Order的集合
public class User implements Serializable {
    private Integer ID;
    private String username;
    private String PASSWORD;
    private String sex;
    private Date brithday;
    private String address;

//    一对多
    private List<Order> orders = new ArrayList<>();
}


四、步骤四:编写Mapper接口

public interface UserMapper {
//    通过订单id查询订单详情以及所属用户
    Order selectOrderAndInfoById(@Param("oid") int id);
//    通过用户id查询该用户的所有订单
    User selectByUserIdForOrder(@Param("uid") int id);
//    根据id查询用户
    User selectUserByid(@Param("uid") int id);
}

五、步骤五:编写Mapper映射文件

需要指定该映射文件是步骤四的Mapper,在namespace中指定

重点来了:

题目1:通过订单id查询订单详情以及所属用户

需要知道的是我们关联的是两张表,如果直接用下面的sql语句则只能查出订单的信息而订单所属用户则为空,这是因为在执行过程中Order会自动映射到tb_order的内容,但是在Order表中定义的User对象则无法自动映射到tb_user表中的内容

SELECT  u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,o.id oid,o.userid,o.createtime,o.state
FROM tb_user u JOIN tb_order o
ON u.ID  = o.userid
WHERE u.id= #{uid}

所以我们得手动映射User类,需要使用到resultMap
总体代码如下:

 <!--  todo  根据id查询订单以及对应的用户 -->
    <sql id="selectById">
        u.ID ,u.username,u.PASSWORD,u.sex,u.brithday,u.address,
        o.id oid,o.userid,o.createtime,o.state
    </sql>
    <resultMap id="selectParent" type="Order">
        <id property="id" column="oid"/>
        <result property="userid" column="userid"/>
        <result property="createtime" column="createtime"/>
        <result property="state" column="state"/>
    </resultMap>
    <resultMap id="selectChildren" type="Order" extends="selectParent">
        <association property="user" javaType="User" select="selectUserByid" column="userid"/>
    </resultMap>
    <select id="selectOrderAndInfoById" resultMap="selectChildren">
        SELECT
        <include refid="selectById"/>
        FROM tb_user u JOIN tb_order o
        ON u.ID = o.userid
        WHERE o.id = #{oid}
    </select>

    <!--    根据id查询用户-->
    <select id="selectUserByid" resultType="User">
        SELECT * FROM tb_user WHERE ID = #{uid}
    </select>

selectParent为手动映射的Order类的Map,selectChildren为手动映射的User类的Map,由于需要返回的订单类的数据所有type中填写Order类,children继承了parent那么children中也会有parent的映射,所有selectChildren的map中就有了Order+User的映射
mybatis多表联合查询,Mybatis,mybatis,java,数据库
这个时候再<select>标签resultMap中只需要传入selectChildren就可以了

<association property="user" javaType="User" select="selectUserByid" column="userid"/>

association :因为在Order类中的User对象是个,所以使用该关键字
property:对应Order表中的创建的User对象名
javaType:property对应的数据类型
select:就是指映射user对象去改方法中找,刚刚selectUserByid方法返回的就是一个User对象,这样就免去了手动一 一映射的麻烦
column:但是selectUserByid需要传入一个参数,这里传入的userid是从Order中查询得到的然后再传给该方法去查询对应的User


题目2:通过用户id查询用户信息以及她所有的订单

学会了上面的知识后,这里就只是发生了一点点的变化

同样也是,是根据用户的id查询所以需要在User类中进行操作,而一个用户有多条订单,所以需要在用户类User中定义一个Order类型的集合,mybatis也只能映射User类和tb_user表,无法映射Order类和tb_order表,所以我们也需要手动映射

总体代码如下:

 <!--    todo 根据用户id查询订单 -->

    <resultMap id="Userparent" type="User">
        <id column="ID" property="ID"/>
        <result column="username" property="username"/>
        <result column="PASSWORD" property="PASSWORD" />
        <result column="sex" property="sex" />
        <result column="brithday" property="brithday" />
        <result column="address" property="address" />

        <collection property="orders" ofType="Order" >
            <id column="oid" property="id"/>
            <result column="userid" property="userid"/>
            <result column="createtime" property="createtime"/>
            <result column="state" property="state" />
        </collection>

    </resultMap>
    <select id="selectByUserIdForOrder" resultMap="Userparent" parameterType="int">
        SELECT <include refid="selectById"/>
        FROM tb_user u JOIN tb_order o
        ON u.ID  = o.userid
        WHERE u.id= #{uid}
    </select>

与上面不同的是集合映射使用关键字collection ,并且返回类型不再使用type而是使用ofType来指定
前面题目一映射是使用的继承,现在题目二映射是直接在父映射中继续映射,并且没有使用方法文章来源地址https://www.toymoban.com/news/detail-606209.html


六、补充

id 唯一标识符
type 写返回的类的类名
<result/> 对非主键的映射
<id/> 对主键的映射
property 关联属性名 也就是User类中定义的各属性
column 关联属数据库的字段
javaType 关联属性的数据类型 在集合属性时不要写,但是在题目一的情况下就需要使用
ofType 关联属性的数据类型 在集合属性时写,但是在题目一的情况下就不要使用

到了这里,关于Mybatis-多表联查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

    🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 在项目开发中,在进行数据库表结构设计时,会根据业务需求以及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联

    2024年02月10日
    浏览(48)
  • 【Java】Mybatis查询数据库返回JSON格式的字段映射到实体类属性

    今天遇到了一个bug,大概就是数据库(Mysql)中有一个 type 类型字段,数据类型为json,大概是这样的:[“苹果”,“香蕉”,“葡萄”]的数据格式,这个bug的问题所在呢就是查询后这个json格式的数据无法映射到我们实体类的属性上,解决方案如下: 实体类的配置: @TableField

    2024年02月15日
    浏览(48)
  • Mybatis——多表查询

    目录 一、简介 二、业务环境的准备 2.1、准备工作: 2.2、SQL 三、一对一和一对多 Sql语句: POJO  OrderMapper OrderMapper.xml  Test测试类 运行结果 MyBatis 是一个优秀的持久层框架,它提供了强大的支持来执行数据库操作,包括多表查询。多表查询是指从多个数据库表中检索数据的过

    2024年02月02日
    浏览(50)
  • MyBatis多表查询

    目录 1. 多表关系回顾 2. 一对一查询 2.1 一对一多表查询方式一:基于标签进行手动结果映射封装  2.2 一对一多表查询方式二 - 通过标签来封装属性中所关联的对象 3. 一对多查询 4. 多对多查询 在项目开发当中一对一关系的表不常见,因为一对一关系的两张表通常会合并为一

    2024年02月10日
    浏览(36)
  • 【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

    SSM( S pring、 S pringMVC、 M yBatis) Apache Shiro SpringBoot 事务 :若将 N 个 数据库操作 (CRUD)放到同一个事务中,则这 N 个数据库操作最终要么全都生效,要么全都不生效 🍀 开启事务【 START TRANSACTION 】 🍀 回滚事务:若事务中的某个数据库操作失败,其他所有数据库操作都需要

    2024年02月08日
    浏览(80)
  • MyBatis多表查询+动态sql

    在全局配置文件中中设置MyBatis执行日志 假设有一个用户表和文章表,实体类中一个关联关系。 用户实体类 文章实体类 如果想查询的结果包含UserInfo的信息就需要使用,⼀对⼀映射要使⽤ association 标签,因为一篇文章只能对应一个作者。 Controller控制器代码 Service服务层代码

    2023年04月19日
    浏览(34)
  • MyBatis多表查询和注解开发

    一对一查询的模型 用户表和订单表的关系为, 一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 一对一查询的语句 对应的sql语句: 查询的结果如下: 创建Order和User实体 创建OrderMapper接口 配置OrderMappe

    2024年02月04日
    浏览(46)
  • MyBatis查询数据库

    1.定义 :         MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。         MyBatis去除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。         MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO (Plain Old Java

    2024年02月04日
    浏览(42)
  • mybatis xml多表查询,子查询,连接查询,动态sql

    student_type 表 student 表 Student 类 一个学生只有一个年级 Type 类 一个年级有多个学生,所以用 list 下列代码中: 1 resultMap 里面property对应实体类属性,column对应数据库字段名 2 主键用 id 标签 其他用result 3 关联查询(子查询和连接查询) 连接查询查一次 4 一个年级多个学生,所以

    2024年01月21日
    浏览(59)
  • MyBatis(多表查询,动态SQL的使用)

    目录 多表查询  查询文章详情 查询一个用户底下的所有文章 动态SQL的使用 if 标签 trim 标签  where 标签 set 标签 foreach 标签 现在有俩张表,一张是 文章表 ,一张是 用户表 .如下: 我们现在想查询得到一张表,表里面的内容和文章表大多一致,只是要 在文章表的基础上添加用户表中

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包