MyBatis关联关系映射详解

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

目录

前言

一、 什么是关联关系映射?

二、MyBatis的关系映射方式

1.基于XML配置的关系映射

2.基于注解的关系映射

三、如何使用MyBatis进行关系映射?

四、关于关系映射的一些建议

五、关联关系映射

1.一对一关联关系映射

嵌套查询

嵌套结果映射

2.一对多关联关系映射

嵌套查询

嵌套结果映射

3.多对多关联关系映射

嵌套查询

嵌套结果映射

4.Vo类是什么 

六、总结


前言

在使用MyBatis进行数据库操作时,关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联,并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射,包括一对一、一对多和多对多关系的处理方法。

一、 什么是关联关系映射?

关联关系映射是指在数据库表之间建立关联关系,并将这种关系映射到对象之间的关系。在关系型数据库中,我们通常使用外键来建立表与表之间的关联。

在 MyBatis 中,通过 association 元素来处理对象与对象之间关联关系,association 元素提供了一系列属性用于维护数据表之间的关系。association 元素是 resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果映射方式。

二、MyBatis的关系映射方式

MyBatis提供了两种主要的关系映射方式:基于XML配置基于注解

1.基于XML配置的关系映射

在基于XML配置的方式中,我们需要编写一个XML文件来描述数据库表和Java对象之间的映射关系。这个XML文件通常包含以下几个部分:

  • 数据库连接信息:包括数据库的URL、用户名、密码等。
  • SQL语句:包括查询、插入、更新、删除等操作的SQL语句。
  • 结果映射:将查询结果映射到Java对象的属性上。

通过这个XML文件,MyBatis可以根据配置信息自动生成对应的SQL语句,并将查询结果映射到Java对象上。

2.基于注解的关系映射

在基于注解的方式中,我们可以使用注解来描述数据库表和Java对象之间的映射关系。通过在Java对象的属性上添加注解,我们可以指定该属性对应的数据库字段名、数据类型等信息。

相比于XML配置方式,基于注解的方式更加简洁和灵活。但是需要注意的是,注解方式不支持动态SQL语句的生成,因此在一些复杂的场景下可能不太适用。

三、如何使用MyBatis进行关系映射?

要使用MyBatis进行关系映射,我们需要完成以下几个步骤:

  1. 引入MyBatis的依赖:在项目的配置文件中添加MyBatis的依赖,以便能够使用MyBatis的功能。
  2. 配置数据库连接信息:在配置文件中添加数据库的连接信息,包括URL、用户名、密码等。
  3. 编写SQL语句:根据业务需求,编写对应的SQL语句,包括查询、插入、更新、删除等操作。
  4. 定义Java对象:定义与数据库表对应的Java对象,并在对象的属性上添加注解或在XML文件中进行配置。
  5. 执行数据库操作:通过MyBatis提供的API,执行数据库操作,包括查询、插入、更新、删除等操作。

四、关于关系映射的一些建议

  • 尽量使用基于注解的关系映射方式,因为它更加简洁和灵活。
  • 在编写SQL语句时,尽量使用参数化查询,以避免SQL注入攻击。
  • 在定义Java对象时,尽量使用包装类而不是基本类型,以避免空指针异常。
  • 在执行数据库操作时,尽量使用事务来保证数据的一致性和完整性。

五、关联关系映射

数据库表

MyBatis关联关系映射详解,MyBatis,mybatis,spring,intellij-idea,maven,junit

1.一对一关联关系映射

一对一关联关系是指两个表之间的关系是一对一的。在数据库中,我们可以通过外键来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理一对一关系。

嵌套查询

嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。

<select id="getUserWithAddress" resultMap="userResultMap">
  SELECT * FROM user
  WHERE id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <association property="address" javaType="Address">
    <id property="id" column="address_id"/>
    <result property="city" column="city"/>
    <result property="street" column="street"/>
  </association>
</resultMap>

嵌套结果映射

嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。

<select id="getUserWithAddress" resultMap="userResultMap">
  SELECT u.id, u.name, a.id as address_id, a.city, a.street
  FROM user u
  JOIN address a ON u.address_id = a.id
  WHERE u.id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.UserVo">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <collection property="addresses" ofType="Address">
    <id property="id" column="address_id"/>
    <result property="city" column="city"/>
    <result property="street" column="street"/>
  </collection>
</resultMap>

2.一对多关联关系映射

一对多关联关系是指一个表的一条记录对应多个关联表的记录。在数据库中,我们可以通过外键来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理一对多关系。

嵌套查询

嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。

<select id="getUserWithOrders" resultMap="userResultMap">
  SELECT * FROM user
  WHERE id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <collection property="orders" ofType="Order">
    <id property="id" column="order_id"/>
    <result property="name" column="order_name"/>
  </collection>
</resultMap>

嵌套结果映射

嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。

<select id="getUserWithOrders" resultMap="userResultMap">
  SELECT u.id, u.name, o.id as order_id, o.name as order_name
  FROM user u
  JOIN orders o ON u.id = o.user_id
  WHERE u.id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <collection property="orders" ofType="Order">
    <id property="id" column="order_id"/>
    <result property="name" column="order_name"/>
  </collection>
</resultMap>

3.多对多关联关系映射

多对多关联关系是指两个表之间的关系是多对多的。在数据库中,我们需要通过中间表来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理多对多关系。

嵌套查询

嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。

<select id="getUserWithRoles" resultMap="userResultMap">
  SELECT * FROM user
  WHERE id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <collection property="roles" ofType="Role">
    <id property="id" column="role_id"/>
    <result property="name" column="role_name"/>
  </collection>
</resultMap>

嵌套结果映射

嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。

<select id="getUserWithRoles" resultMap="userResultMap">
  SELECT u.id, u.name, r.id as role_id, r.name as role_name
  FROM user u
  JOIN user_role ur ON u.id = ur.user_id
  JOIN role r ON ur.role_id = r.id
  WHERE u.id = #{id}
</select>

<resultMap id="userResultMap" type="com.ctb.vo.User">
  <id property="id" column="id"/>
  <result property="name" column="name"/>
  <collection property="roles" ofType="Role">
    <id property="id" column="role_id"/>
    <result property="name" column="role_name"/>
  </collection>
</resultMap>

4.Vo类是什么 

VO类是指值对象(Value Object),它是一种在计算机编程中常用的概念。值对象是一种用于封装数据的对象,它的主要作用是表示某个特定的值或一组相关的值。

在软件开发中,我们经常需要处理各种数据,比如用户信息、订单信息等。而值对象就是用来表示这些数据的。它通常包含一些属性(比如姓名、年龄、价格等),这些属性的值可以根据需要进行修改。

与值对象相关的一个重要概念是不可变性。值对象通常是不可变的,也就是说一旦创建了一个值对象,它的属性值就不能再被修改。这样可以确保值对象的数据始终保持一致性,避免了数据被意外修改的风险。

值对象在软件开发中有很多应用场景,比如在领域驱动设计中,可以用值对象来表示领域中的概念;在数据传输中,可以用值对象来封装需要传输的数据;在函数式编程中,值对象可以作为函数的参数或返回值。

下面简单编写一下VO类,以及编写测试类一对多的关系(其它就不过多赘述了)

package com.ctb.vo;

import com.ctb.model.User;
import com.ctb.model.UserRole;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 彪
 * @remark
 * @create  
 */
public class UserVo extends User{
    private List<UserRole> userroles = new ArrayList<>();

    public List<UserRole> getUserRoles() {
        return userRole;
    }

    public void setUserRoles(List<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
}

 测试类

package com.ctb.biz;

import com.ctb.vo.UserVo;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author 彪
 * @remark
 * @create  
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserBizTest {
    @Autowired
    private UserBiz userBiz;
    @Test
    public void selectByUid() {
    //获取用户信息
       UserVo userVo = userBiz.selectByUid(7);
        System.out.println(userVo);
//获取角色信息
        userVo.getUserRole().forEach(System.out::println);

    }
}

六、总结

        关联关系映射是MyBatis中非常重要的概念之一。通过合理地使用关联关系映射,我们可以更加方便地进行数据库操作,并提高代码的可读性和可维护性。在实际开发中,我们应根据具体的业务需求来选择合适的关联关系映射方式,并合理地设计数据库表结构。 文章来源地址https://www.toymoban.com/news/detail-698568.html

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

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

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

相关文章

  • MyBatis的关联映射

    结果映射(resultMap)–主要使用这两个标签 association – 一个复杂类型的关联;许多结果将包装成这种类型 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用 collection – 一个复杂类型的集合 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射

    2023年04月25日
    浏览(41)
  • Mybatis的关系关联配置

    目录 前言 一. Mybatis关系关联配置的优劣 1.1 MyBatis中的关系关联配置具有以下好处: 1.2 然而,MyBatis中的关系关联配置也存在一些缺点: 二. 关联关系的方向 单向关联 双向关联 三. 一对一关联配置 四. 一对多关联配置 五. 多对多关联配置 MyBatis是一个流行的Java持久化框架,它

    2024年02月09日
    浏览(41)
  • Mybatis中的关系映射

    目录 前言 1.一对一的映射关系 1.1 创建模型类和Vo类  1.2 配置当前模型类的mapper.xml 1.3 开始测试 2.一对多的映射关系 2.1 创建模型类和Vo类 2.2 配置当前模型类的mapper.xml 2.3 开始测试 3.多对多的映射关系 总结  注意点:  一对一映射(One-to-One Mapping) : 一对一关系指的是两个

    2024年02月09日
    浏览(36)
  • Mybatis中表关系查询结果集映射

    resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。Re

    2024年02月16日
    浏览(64)
  • MyBatis中的关联关系以及多表连接

    目录 一对一 一对多 多对多 关联关系总结 一对一 一张表的一条记录对应查询到另一张表的一条记录,重要的是实体中的一个对象也要包含另一个对象 实例,一个乘客查询到一本护照 实体类 dao层 mapper语句 测试层 一对多 mapper语句 实体类 dao层 测试层 多对多 dao层 测试层 m

    2024年02月13日
    浏览(36)
  • 【MyBatis】自定义resultMap三种映射关系

    目录 一、一对一映射(One-to-One) 1.1 表关系 1.2 resultMap设置自定义映射  二、一对多映射(One-to-Many) 2.1 创建实体 2.2 级联方式处理映射关系 2.3 定义SQL 2.4 OrderMapper接口 2.5 编写业务逻辑层 2.6 Junit测试 三、多对多映射(Many-to-Many) 3.1 表关系 3.2 创建实体 3.3 处理映射关系、

    2024年02月10日
    浏览(45)
  • Mybatis学习笔记,包含mybatis基本使用、关系映射、动态SQL、分页插件等等

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

    2024年02月15日
    浏览(47)
  • 如何在MyBatis中处理复杂结果集映射关系

    在开发中,我们不是总是对单表进行操作的场景。按照数据库表的设计原则,要符合一定的范式,那么就需要对某一种场景的表进行拆分。 在业务上,可能是属于同一个业务。但是,在数据库中表的存储这块,可能就会涉及到表的拆分。 这里设计到表的创建直接创建两张表

    2024年02月05日
    浏览(46)
  • MyBatis中至关重要的关系映射----全方面介绍

    目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType: resultMap: 二,一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三,一对多关联查询 3.1 嵌套结果集编写  3.3 案例演示 四,多对多关联查询  4.1 嵌套结果集编写  4.2 案例演示      在关系型数

    2024年02月09日
    浏览(37)
  • Mybatis的三种映射关系以及联表查询

    目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现类 4、测试 1、MyBatis中表之间

    2024年02月10日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包