MyBatis (三)关联查询

devtools/2025/3/19 8:02:26/

目录

 一 学习自定义结果集

1 驼峰命名规则

2 自定义映射规则

二 指定一对一的关联封装进行查询

三 指定一对多的关联封装进行查询


 一 学习自定义结果集

解决和数据库对不上的数据被封装为空:

1 驼峰命名规则

在xml文件中:

# 启用驼峰命名自动转换(数据库下划线字段 -> Java驼峰属性)
mybatis.configuration.map-underscore-to-camel-case=true

2 自定义映射规则

默认疯转原则(resultType):JavaBean中的属性名,去数据库表中找对应的值--一一映射封装

自定义映射规则(resultMap):我们告诉Mybatis如何将结果封装到Bean中

实现:

添加方法

java">    Emp getEmpMethod(Integer id);

配置Mapper XML 映射文件相关信息

java">    <!--column为数据库字段名,property为封装属性名--><!--id声明主键映射规则,result映射其他字段映射规则--><resultMap id="EmpChange" type="org.example.mybatis01.bean.Emp"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><result property="gender" column="gender"/></resultMap><select id="getEmpMethod" resultMap="EmpChange">select *from first_tb where id = #{id}</select>

测试:

java">package org.example.mybatis01;import org.example.mybatis01.bean.Emp;
import org.example.mybatis01.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredEmpMapper empMapper;@Testvoid testAddEmp() {Emp getByChange = empMapper.getEmpMethod(1);System.out.println("empById"+getByChange);}
}

二 指定一对一的关联封装进行查询

两个一一对应的数据库(一个订单查一个客户)

两个JavaBean类

java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {private Integer id;private String customerName;private String phone;
}
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.math.BigDecimal;@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Order {private Long id;private String address;private BigDecimal amount;private Integer customerId;//订单对应的客户private Customer customer;}

对应的接口

java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis01.bean.Order;@Mapper
public interface OrderMapper {// 查询订单信息按照idOrder getOrderById(Long id);
}
java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;@Mapper
public interface CustomerMapper {}

配置Mapper XML 映射文件相关信息

column的名称应该实际上与你查询时所指定的字段名称所对应,因为查询过程中可能会出现更改过程,与数据库的字段名不一定相同,但是表名不需要更改指定(查询时修改的表名)

举例说明:在我的SQL查询语句当中我为了区分两张表当中id的不同我,将customer的customer_id属性,设置了别名,故上面的column字段属性当中也需要对应修改,property是建立联系的表名

java"><?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="org.example.mybatis01.mapper.OrderMapper"><resultMap id="OrderMethod" type="org.example.mybatis01.bean.Order"><id property="id" column="id"/><result property="address" column="address"/><result property="amount" column="amount"/><result property="customerId" column="customer_id"/><association property="customer" javaType="org.example.mybatis01.bean.Customer"><id property="id" column="c_id"/><result property="customerName" column="customer_name"/><result property="phone" column="phone"/></association></resultMap><select id="getOrderById" parameterType="long" resultMap="OrderMethod">select o.*,c.customer_name,c.phone,c.id as c_idfrom orders oleft join customer c on o.customer_id = c.idwhere o.id = #{id}</select></mapper>

测试使用:

java">package org.example.mybatis01;import org.example.mybatis01.bean.Order;
import org.example.mybatis01.mapper.OrderMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredOrderMapper orderMapper;@Testvoid test02() {Order orderById = orderMapper.getOrderById(3L);System.out.println(orderById);}}

运行结果:

查询出商品所对应的用户(我们是使用商品对应的客户号与对应的客户id进行匹配)一个订单查一个客户

三 指定一对多的关联封装进行查询

定义基础的JavaBean类

java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {private Integer id;private String customerName;private String phone;List<Order> orders;
}
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.math.BigDecimal;@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Order {private Long id;private String address;private BigDecimal amount;private Integer customerId;//订单对应的客户private Customer customer;}

接口类的定义:

java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis01.bean.Customer;@Mapper
public interface CustomerMapper {Customer getCustomerByOrderId(Integer id);}

配置Mapper XML 映射文件相关信息

参数当中的collection是为了解决返回集合的情况,ofType指定的时其中的返回值类型

<?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="org.example.mybatis01.mapper.CustomerMapper"><resultMap id="CustomMethod" type="org.example.mybatis01.bean.Customer"><id property="id" column="id"/><result property="customerName" column="customer_name"/><result property="phone" column="phone"/><collection property="orders" ofType="org.example.mybatis01.bean.Order"><id property="id" column="o_id"/><result property="address" column="address"/><result property="amount" column="amount"/><result property="customerId" column="customer_id"/></collection></resultMap><select id="getCustomerByOrderId" resultMap="CustomMethod">select c.*, o.*from orders oleft join customer c on c.id = o.customer_idwhere c.id = 1;</select></mapper>

测试方法:

java">package org.example.mybatis01;import org.example.mybatis01.bean.Customer;
import org.example.mybatis01.mapper.CustomerMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredCustomerMapper customerMapper;@Testvoid test02() {Customer customerByOrderId = customerMapper.getCustomerByOrderId(1);System.out.println(customerByOrderId);}}

运行结果:

实现目的:


http://www.ppmy.cn/devtools/168283.html

相关文章

饮食巧搭配,助力老人对抗进行性核上性麻痹

进行性核上性麻痹是一种较为罕见且复杂的神经系统退行性疾病&#xff0c;严重影响老人的生活自理能力与生活质量。在治疗的同时&#xff0c;合理的饮食搭配对缓解症状、维持身体机能至关重要。 由于疾病导致老人身体机能衰退&#xff0c;日常活动能力下降&#xff0c;却仍需充足…

【Spring】第三弹:基于 XML 获取 Bean 对象

一、获取 Bean 对象 1.1 根据名称获取 Bean 对象 由于 id 属性指定了 bean 的唯一标识&#xff0c;所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。 1.确保存在一个测试类&#xff1a; public class HelloWorld {public void sayHello(){System.out.println(&quo…

linux 基础网络配置文件

使用“ifconfig”命令查看网络接口地址 直接执行“iconfg”命令后可以看到ens33、10、virbr0这3个网络接口的信息&#xff0c;具体命令如下 ifconfig ##查看网络接口地址 ens33:第一块以太网卡的名称 lo:“回环”网络接口 virbr0:虚拟网桥的连接接口 查看指…

理解Akamai EdgeGrid认证在REST API中的应用

在我们高度互联的世界中&#xff0c;快速且安全地将内容传递给用户是重中之重。Akamai 就是应运而生的佼佼者。作为内容分发和云服务的领导者&#xff0c;他们提供了一个名为 EdgeGrid 的平台&#xff0c;帮助使您的Web应用更加快速、可靠和安全。 但是&#xff0c;强大的功能伴…

两款软件助力图片视频去水印及图像编辑

今天给大家分享两款呼声很高的软件&#xff0c;它们都能处理图片和视频去水印相关的问题。其中一款软件在去水印的同时&#xff0c;图像编辑功能也十分出色&#xff1b;另一款软件专注于图片和视频去水印&#xff0c;去除效果好且支持批量处理。下面就来详细了解一下。 Remover…

多线程(四)----线程安全

线程安全问题的万恶之源就是多线程的抢占式执行所带来的随机性. 有了多线程, 此时抢占式执行下, 代码执行的顺序, 会出现更多的变数, 代码执行顺序的可能性就从一种情况变成了无数种情况. 只要有一种情况使得代码结果不正确, 都是视为bug, 线程不安全. 有线程安全的代码 以下…

HarmonyOS三层架构实战

目录&#xff1a; 1、三层架构项目结构1.0、三层架构简介1.1、 common层&#xff08;主要放一些公共的资源等&#xff09;1.2、 features层&#xff08;主要模块定义的组件以及图片等静态资源&#xff09;1.3、 products层&#xff08;主要放主页面层和一些主要的资源&#xff…

论文精度:Transformers without Normalization

前言 论文题目:Transformers without Normalization 作者:Jiachen Zhu 1,2 , Xinlei Chen 1 , Kaiming He 3 , Yann LeCun 1,2 , Zhuang Liu 1,4,† 论文地址:https://arxiv.org/pdf/2503.10282 摘要 这篇论文探讨了现代神经网络中广泛使用的归一化层是否是必不可少的。…