当前位置: 首页 > news >正文

5.2 mybatis之autoMappingBehavior作用

文章目录

  • 1. NONE关闭自动映射
  • 2. PARTIAL非嵌套结果映射
  • 3. FULL全自动映射

众所周知mybatis中标签< resultMap >是用来处理数据库库字段与java对象属性映射的。通常java对象属性(驼峰格式)与数据库表字段(下划线形式)是一 一对应的情况下,是不用定义< resultMap >标签的,是因为数据库表字段会自动映射到java对象的对应属性上的,比如数据库表一个字段为USER_NAME,java对象对应的属性为userName,默认情况下会自动映射的。

数据库表字段为什么会和java对象属性自动映射的?什么情况下会自动映射?什么情况下不会自动映射?实现这种自动映射行为就是通过< settings >标签下的autoMappingBehavior属性控制的。

    <settings><setting name="autoMappingBehavior" value="PARTIAL"/></settings>

autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 该属性有3种取值NONE, PARTIAL, FULL, NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。如不配置,模式是PARTIAL部分映射的。下面分别看下三种情况是如何映射的

1. NONE关闭自动映射

关闭自动映射后,数据库表字段就不会自动映射到java对象属性中,此时就得自定义< resultMap >。
下面以查询用户信息为例,数据库表为USER,对应java类为User
package com.lzj.bean;

public class User  {private int id;private String name;private int age;//省略get/set/toString
}

对应数据库表USER为
在这里插入图片描述
mybatis配置文件中< settings >配置如下所示

    <settings><!--设置打印日志工具--><setting name="logImpl" value="STDOUT_LOGGING"/><--关闭自动映射--><setting name="autoMappingBehavior" value="NONE"/></settings>

mapper文件对应如下所示

<select id="selectOne" parameterType="int" resultType="com.lzj.bean.User">select * from user where id=#{id}
</select>

然后通过如下案例执行该mapper对应的SQL

public void sqlSessionTest(){SqlSessionFactory factory = mybatisUtil.getFactory();SqlSession sqlSession = factory.openSession(true);  //true表示自动提交List<Object> list = sqlSession.selectList("com.lzj.dao.UserDao.selectOne", 2);System.out.println("输出结果:" + list.get(0));
}

输出结果如下所示,发现该SQL命中了数据库中id=2的一条数据,但是没有映射到user对象上,导致打印出的user对象为null。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 671187578.
==>  Preparing: select * from user where id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age
<==        Row: 2, xiaoli, 26
<==      Total: 1
输出结果:null

那么在关闭自动映射的情况下如何把查到的数据库表数据映射到java对象user中呢?可以通过下面自定resultMap标签进行手动映射,把mapper文件改成如下方式

    <resultMap id="userResultMap" type="com.lzj.bean.User"><result property="id" column="ID"></result><result property="name" column="NAME"></result><result property="age" column="AGE"></result></resultMap><select id="selectOne" parameterType="int" resultMap="userResultMap">select * from user where id=#{id}</select>

然后再执行上述案例,输出结果如下所示,打印出的user对象已有值,说明数据库表中数据映射到了java对象user中。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 953253248.
==>  Preparing: select * from user where id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age
<==        Row: 2, xiaoli, 26
<==      Total: 1
输出结果:User{id=2, name='xiaoli', age=26}

2. PARTIAL非嵌套结果映射

PARTIAL 只会自动映射没有定义嵌套结果映射的字段。什么意思呢,不同于上面案例,一个库表对应一个简单的java对象,如果两个库表对应一个嵌套的java对象,如何进行映射的呢?
比如查询用户名下的车辆,对应的User类为

package com.lzj.bean;import java.util.List;public class User  {private int id;private String name;private int age;private List<Car> cars;//省略get/set/toString方法
}

对应的Car类为
package com.lzj.bean;

public class Car {private String name;private String brand;//省略get/set/toString方法
}

数据库表USER如下所示
在这里插入图片描述
数据库表CAR如下所示
在这里插入图片描述
mybatis的配置文件中setting标签改为如下配置

    <settings><setting name="logImpl" value="STDOUT_LOGGING"/><setting name="autoMappingBehavior" value="PARTIAL"/></settings>

mapper文件改为如下所示

<select id="selectOne" parameterType="int" resultMap="userResultMap">select * from user where id=#{id}
</select>

然后运行下面demo

public void sqlSessionTest2(){SqlSessionFactory factory = mybatisUtil.getFactory();SqlSession sqlSession = factory.openSession(true);  //true表示自动提交List<Object> list = sqlSession.selectList("com.lzj.dao.UserDao.select2", 2);System.out.println("输出结果:" + list.get(0));
}

输出结果如下所示,输出的user对象中id、name、age都有值,唯独cars没有值,说明mybatis只自动映射没有定义嵌套结果映射的字段,只映射了user对象中最外层的属性的值,没有映射嵌套的CAR数据库表中数据到cars对象中。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 140778365.
==>  Preparing: select u.id,u.name,u.age,c.name,c.brand from user u, car c where u.id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age, name, brand
<==        Row: 2, xiaoli, 26, xiaoli, BYD
<==      Total: 1
输出结果:User{id=2, name='xiaoli', age=26, cars=null}

那么这种情况下如何把CAR表中数据映射到嵌套的对象cars中呢,也是通过resultMap进行自定义映射,mapper改为如下方式

<resultMap id="userResultMap2" type="com.lzj.bean.User"><!--由于设置的是非嵌套自动映射,库表USER中数据会自动映射到user对象的id、name、age上,所以此处没有再自定义映射,只指定CAR表中字段数据是如何映射到cars上面的就可以了。--><collection property="cars" column="NAME" ofType="com.lzj.bean.Car"><result property="name" column="NAME"></result><result property="brand" column="BRAND"></result></collection>
</resultMap><select id="select2" resultMap="userResultMap2">select u.id,u.name,u.age,c.name,c.brand from user u, car c where u.id=#{id}
</select>

然后重新执行上面demo案例结果如下所示,发现user对象中嵌套的cars对象中属性也有值了,映射成功。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 77215921.
==>  Preparing: select u.id,u.name,u.age,c.name,c.brand from user u, car c where u.id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age, name, brand
<==        Row: 2, xiaoli, 26, xiaoli, BYD
<==      Total: 1
输出结果:User{id=0, name='null', age=0, cars=[Car{name='xiaoli', brand='BYD'}]}

3. FULL全自动映射

FULL 会自动映射任何复杂的结果集(无论是否嵌套)。
还是以上面嵌套映射的为例,把< settings 配置修改为如下所示>

    <settings><setting name="logImpl" value="STDOUT_LOGGING"/><setting name="autoMappingBehavior" value="FULL"/></settings>

mapper文件修改为如下所示,直接返回user对象,没有设置resultMap自定义映射

<select id="select3" resultType="com.lzj.bean.User">select u.id,u.name,u.age,c.name,c.brand from user u, car c where u.id=#{id}
</select>

执行上面案例结果输出显示,即使没有配置resultMap自定义映射,mybatis自动的进行了嵌套结果的映射

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Cache Hit Ratio [com.lzj.dao.UserDao]: 0.0
Opening JDBC Connection
Created connection 520082748.
==>  Preparing: select u.id,u.name,u.age,c.name,c.brand from user u, car c where u.id=? 
==> Parameters: 2(Integer)
<==    Columns: id, name, age, name, brand
<==        Row: 2, xiaoli, 26, xiaoli, BYD
<==      Total: 1
输出结果:User{id=2, name='null', age=26, cars=[Car{name='xiaoli', brand='BYD'}]}

相关文章:

5.2 mybatis之autoMappingBehavior作用

文章目录 1. NONE关闭自动映射2. PARTIAL非嵌套结果映射3. FULL全自动映射 众所周知mybatis中标签< resultMap >是用来处理数据库库字段与java对象属性映射的。通常java对象属性&#xff08;驼峰格式&#xff09;与数据库表字段&#xff08;下划线形式&#xff09;是一 一…...

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表…...

OpenHarmony实战开发-如何使用Web预渲染实现功能介绍。

介绍 为了便于大家在使用本案例集时能够更详细的了解各个案例&#xff0c;本案例基于Web预渲染实现了案例介绍功能&#xff0c;即应用右下角的问号icon。 效果图预览 使用说明 因为直接加载的线上README&#xff0c;因此本功能需联网使用点击icon&#xff0c;即会弹出对应案…...

三七互娱,oppo,快手25届暑期实习内推

三七互娱&#xff0c;oppo&#xff0c;快手25届暑期实习内推 ①OPPO 【内推码】&#xff1a;X6866447 【一键内推】:https://careers.oppo.com/university/oppo/campus/post?shareId4546 【需求岗位】软件类、AI/算法类、硬件类、设计类、产品类 ②快手 【岗位】算法、工程、游…...

InnoDB架构:内存篇

InnoDB架构&#xff1a;内存篇 InnoDB是MySQL数据库中默认的存储引擎&#xff0c;它为数据库提供了事务安全型&#xff08;ACID兼容&#xff09;、行级锁定和外键支持等功能。InnoDB的架构设计优化了对于读取密集和写入密集型应用的性能表现&#xff0c;是一个高度优化的存储系…...

8个Python高效数据分析的技巧

这篇文章介绍了8个使用Python进行数据分析的方法&#xff0c;不仅能够提升运行效率&#xff0c;还能够使代码更加“优美”。 1 一行代码定义List 定义某种列表时&#xff0c;写For 循环过于麻烦&#xff0c;幸运的是&#xff0c;Python有一种内置的方法可以在一行代码中解决…...

暴力破解密码自动阻断

1 re模块 re 模块是 Python 中用于正则表达式操作的模块。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来表示字符串中的模式&#xff0c;并可以通过模式匹配、查找、替换等操作对文本进行高效处理。 …...

【华为】Telnet实验配置

【华为】Telnet 实验配置 应用场景三种认证方式配置注意事项拓扑无认证&#xff08;None&#xff09;交换机配置顺序Telnet ServerTelnet Client测试 密码认证&#xff08;Password&#xff09;配置顺序Telnet ServerTelnet Client测试 AAA认证&#xff08;scheme&#xff09;配…...

SAM功能改进VRP-SAM论文解读VRP-SAM: SAM with Visual Reference Prompt

现已总结SAM多方面相关的论文解读&#xff0c;具体请参考该专栏的置顶目录篇 一、总结 1. 简介 发表时间&#xff1a;2024年3月30日 论文&#xff1a; 2402.17726.pdf (arxiv.org)https://arxiv.org/pdf/2402.17726.pdf代码&#xff1a; syp2ysy/VRP-SAM (github.com)htt…...

MySQL truncate table 与 delete 清空表的区别和坑

拓展阅读 MySQL View MySQL truncate table 与 delete 清空表的区别和坑 MySQL Ruler mysql 日常开发规范 MySQL datetime timestamp 以及如何自动更新&#xff0c;如何实现范围查询 MySQL 06 mysql 如何实现类似 oracle 的 merge into MySQL 05 MySQL入门教程&#xff0…...

Spring GA、PRE、SNAPSHOT 版本含义及区别

GA:General Availability: 正式发布的版本&#xff0c;推荐使用&#xff08;主要是稳定&#xff09;&#xff0c;与maven的releases类似&#xff1b; PRE: 预览版,内部测试版。主要是给开发人员和测试人员测试和找BUG用的&#xff0c;不建议使用&#xff1b; SNAPSHOT: 快照…...

一文看懂标准版和Pro版的区别

在CRMEB的众多产品中&#xff0c;有这样两款产品经常被拿来比较&#xff0c;它们就是CRMEB的标准版和Pro版商城系统&#xff0c;今天&#xff0c;我们就来盘一下这两款系统之间究竟有哪些不同。 1、Pro版系统性能更卓越 CRMEB Pro版采用Tp6 SwooleRedis高性能框架开发&#x…...

腾讯云服务器价格表(腾讯云服务器报价表)

腾讯云服务器提供了多种类型的产品&#xff0c;以满足不同用户的需求&#xff0c;其价格因产品类型、配置和使用时长等因素而有所不同。以下是根据最近的信息整理的腾讯云服务器价格表概览&#xff0c;但请注意&#xff0c;实际价格可能会有所变动&#xff0c;建议用户在购买前…...

试试把GPT和Suno结合起来用(附免费GPT)

什么是GPT GPT&#xff08;生成预训练变换器&#xff09;是由OpenAI开发的一种先进的人工智能模型&#xff0c;它能够理解和生成人类语言。通过大量的数据训练&#xff0c;GPT模型不仅能够撰写文章、编写代码&#xff0c;还能创作诗歌和故事。而现在&#xff0c;这种技术已经扩…...

SpringBoot修改菜品模块开发

需求分析与设计 一&#xff1a;产品原型 在菜品管理列表页面点击修改按钮&#xff0c;跳转到修改菜品页面&#xff0c;在修改页面回显菜品相关信息并进行修改&#xff0c;最后点击保存按钮完成修改操作。 修改菜品原型&#xff1a; 二&#xff1a;接口设计 通过对上述原型图…...

Rust开发笔记 | 系统编程的守护神

在如今这个信息技术不断发展的时代&#xff0c;系统编程语言演进的步伐从未停歇。Rust&#xff0c;作为现代化的系统编程语言&#xff0c;正凭借其出色的性能、安全性和并发处理能力赢得编程界的广泛赞誉。有别于传统的系统编程语言&#xff0c;Rust在保证高性能的同时&#xf…...

dcoker+nginx解决前端本地开发跨域

步骤 docker 拉取nginx镜像跑容器 并配置数据卷nginx.conf nginx.conf文件配置 这里展示server server {listen 80;listen [::]:80;server_name localhost;#access_log /var/log/nginx/host.access.log main;location / {# 当我们访问127.0.0.1:8028就会跳转到ht…...

基于云开发和微信小程序的爱宠家系统

基于云开发和微信小程序的爱宠家系统 “Development of PetCare Home System based on Cloud Computing and WeChat Mini Program” 完整下载链接:基于云开发和微信小程序的爱宠家系统 文章目录 基于云开发和微信小程序的爱宠家系统摘要第一章 系统概述1.1 研究背景1.2 研究目…...

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…...

面试算法-173-二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,…...

AI写论文不再难,4款AI论文生成工具带你开启高效写作之旅!

在2025年愈演愈烈的学术写作智能化趋势中&#xff0c;越来越多的人选择借助AI写论文工具。现实中许多这样的工具在撰写硕士、博士论文等长篇学术作品时&#xff0c;常常缺乏必要的理论深度&#xff0c;逻辑也显得比较松散。普通的AI论文写作工具显然无法满足这些专业写作的需求…...

超越极限:YOLOv8融合Dynamic Head(统一尺度-空间-任务感知注意力)—— 原理详解、代码实现与性能验证

引言 在目标检测领域,YOLO系列模型凭借其出色的速度与精度平衡,始终占据着举足轻重的地位。YOLOv8作为Ultralytics团队的最新力作,在架构设计、训练策略和部署便捷性上均达到了新的高度。然而,随着应用场景的日益复杂,如何让模型在多尺度变化、空间遮挡、任务干扰等挑战下…...

Comsol热流耦合拓扑优化:最大化放热量与功率耗散的探索

Comsol热流耦合拓扑优化。 目标函数采用最大化放热量和功率耗散。在工程领域&#xff0c;热流耦合问题一直是研究的重点&#xff0c;尤其是如何通过拓扑优化来实现特定目标&#xff0c;比如最大化放热量和功率耗散&#xff0c;这对于提高系统性能至关重要。而Comsol作为一款强大…...

会议纪要助手:OpenClaw+GLM-4.7-Flash实时转录与摘要

会议纪要助手&#xff1a;OpenClawGLM-4.7-Flash实时转录与摘要 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。上周三的部门周会结束后&#xff0c;我花了40分钟反复听录音、手敲重点&#xff0c;结果还是漏掉了两个关键决议事项。这种低效重复劳动让我…...

5分钟解决经典游戏兼容性问题:DDrawCompat完整使用指南

5分钟解决经典游戏兼容性问题&#xff1a;DDrawCompat完整使用指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDraw…...

YOLOv11涨点改进| TPAMI 2026 |全网创新首发、注意力改进篇|引入ASSA自适应稀疏自注意力,顶刊万能涨点模块,含5种超强创新,适合目标检测,图像分割,图像分类,图像超分等任务高效涨点

一、本文介绍 🔥本文给大家介绍利用将 ASSA自适应稀疏自注意力模块改进 YOLOv11网络模型,可以显著提升模型的特征建模能力和复杂场景下的检测性能。ASSA通过自注意力机制在全局范围内建立不同空间位置之间的依赖关系,使网络能够充分利用全局上下文信息,从而增强特征表达能…...

开源压枪系统:基于像素识别技术的后坐力补偿解决方案

开源压枪系统&#xff1a;基于像素识别技术的后坐力补偿解决方案 【免费下载链接】Apex-NoRecoil-2021 Scripts to reduce recoil for Apex Legends. (auto weapon detection, support multiple resolutions) 项目地址: https://gitcode.com/gh_mirrors/ap/Apex-NoRecoil-202…...

超实数(Hyper-reals)的数学革命:从Hewitt到Robinson的探索历程

1. 超实数&#xff1a;一场颠覆传统数学认知的革命 想象一下&#xff0c;当你第一次学习实数时&#xff0c;老师告诉你数轴上的点与实数一一对应&#xff0c;没有任何空隙。这个看似完美的体系在20世纪中叶被一群数学家彻底颠覆了。超实数&#xff08;Hyper-reals&#xff09;的…...

【机器人路径规划】基于6种最新算法(小龙虾优化算法COA、MSA、RTH、NOA、BFO、SWO)求解机器人路径规划研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

AMD显卡也能玩转GPU编程?ROCm环境搭建与OpenCL入门避坑指南

AMD显卡也能玩转GPU编程&#xff1f;ROCm环境搭建与OpenCL入门避坑指南 在GPU计算领域&#xff0c;NVIDIA的CUDA生态长期占据主导地位&#xff0c;但AMD显卡用户同样拥有强大的并行计算选择。本文将带你探索AMD ROCm平台的完整搭建流程&#xff0c;并深入OpenCL编程的核心技巧&…...