【Mybatis】@Param注解 resultMap手动映射

news/2024/11/27 1:35:30/

文章目录

    • 一、映射文件参数
    • 二、查询映射
      • 2-1 一对一
      • 2-2 一对多
      • 2-3 总结

一、映射文件参数

@Param 注解官方文档解释

在这里插入图片描述

1、单个参数(对象)不使用注解

java">public int save(User user);
<!-- 添加用户 -->
<insert id="save" parameterType="User">INSERT INTO smbms_user (userCode, userName, gender, birthday, address)VALUES (#{userCode}, #{userName}, #{gender}, #{birthday}, #{address})
</insert>

User 类型的参数对象传递到了语句中,会查找 userCode、userName 和 gender 等属性,然后将它们的值传入预处理语句的参数中。

2、多个参数(原始类型或简单数据类型)使用注解

java">public List<Bill> findBillList(@Param("productName") String productName,@Param("productDesc") String productDesc);
<!-- 模糊查询功能 -->
<select id="findBillList" parameterType="String" resultType="Bill">select id,billCode,productName,productDesc from smbms_billwhere productName like concat("%",#{productName},"%")and productDesc like concat("%",#{productDesc},"%")
</select>

3、多个参数不使用注解(Map)

java">List<User> getUserByMap(Map<String, Object> paramMap);
<!-- 查询语句 -->
<select id="getUserByMap" parameterType="map"  resultType="User">SELECT id,userCode,userName,birthday FROM smbms_userWHERE birthday BETWEEN #{startDate} AND #{endDate}
</select>
java">Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("startDate", startDate); 
paramMap.put("endDate", endDate); 

二、查询映射

resultTyperesultMap 两种方式指定查询结果的返回列。

  • resultType:自动映射。查询结果直接映射到一个简单的 Java 对象(POJO)
  • resultMap:手动映射。更复杂的映射逻辑,比如处理一对一、一对多的关系映射,或对结果集进行特殊处理

mybatis 主配置文件中关闭自动映射

<!-- 关闭自动映射 -->
<settings><setting name="autoMappingBehavior" value="NONE"/>
</settings>

autoMappingBehavior 控制自动映射的行为。

  • NONE:关闭自动映射
  • PARTIAL:只会自动映射没有定义嵌套结果集映射的结果集(默认值)(推荐)
  • FULL:会自动映射任意复杂的结果如嵌套(可读性弱,不推荐)

简单的 resultMap 定义示例:

<resultMap id="userResultMap" type="User"><id property="id" column="user_id" /><result property="username" column="user_name" /><result property="password" column="user_password" />
</resultMap>
  • id: 代表主键映射。
  • result: 代表普通属性映射。
  • type: 指定要映射的目标类(即 Java 类)。
  • property: 指定 Java 类中的属性。
  • column: 指定数据库表中的列名。

propertycolumn 名称相同时,MyBatis 会自动进行映射。这种情况下,可使用 resultType 而不必显式定义 resultMap

2-1 一对一

实体类

java">//角色实体类
public class Role {private long role_id;private String role_name;private String role_remarks;
}
//管理员实体类
public class Admin {private long admin_id;private String admin_name;private Role admin_role;//角色对象
}
<resultMap id="mapAdmin" type="Admin"><id property="admin_id" column="admin_id"></id><result property="admin_name" column="admin_name"></result><association property="admin_role" javaType="Role"><id property="role_id" column="role_id"></id><result property="role_name" column="role_name"></result><result property="role_remarks" column="role_remarks"></result></association>
</resultMap>
<select id="AdminMapper" parameterType="Long" resultMap="mapAdmin">SELECT * FROM sf_admin a LEFT JOIN sf_role b ON a.admin_role_id = b.role_id WHERE admin_id = #{admin_id}
</select>

或者

<resultMap id="mapAdmin" type="Admin"><id property="admin_id" column="admin_id"></id><result property="admin_name" column="admin_name"></result><association property="admin_role" resultMap="rolemap" javaType="Role"/>
</resultMap>
<resultMap id="rolemap" type="Role"><id property="role_id" column="role_id"></id><result property="role_name" column="role_name"></result><result property="role_remarks" column="role_remarks"></result>
</resultMap>

2-2 一对多

实体类

java">//收货地址实体类
public class Address {private long address_id;private String address_name;
}
//用户实体类
public class User {private long user_id;private String user_name;private List<Address> addr_list;
}
<resultMap id="user_addr_map" type="User"><id property="user_id" column="user_id"></id><result property="user_name" column="user_name"></result><collection property="addr_list" ofType="Address"><id property="address_id" column="address_id"></id><result property="address_name" column="address_name"></result></collection>
</resultMap>
<select id="getUserId" parameterType="Long" resultMap="user_addr_map">SELECT * FROM sf_user a RIGHT JOIN sf_address b ON a.user_id = b.address_user_id WHERE user_id = #{user_id}
</select>

2-3 总结

association 用于处理一对一的关系映射,可以嵌套另一个resultMap来进一步细化映射规则。javaType 指定了集合中元素的类型。

collection 用于处理一对多的关系映射,同样支持嵌套resultMap以定义子元素的映射规则。ofType 指定了集合中元素的类型。


http://www.ppmy.cn/news/1550203.html

相关文章

tcp/ip异常断开调试笔记——lwip

问题一&#xff1a;异常掉线 异常断开模拟 1、单片机端做服务端&#xff08;只监听一个客户端&#xff09;&#xff0c;电脑做客户端连接 2、尝试连接确定通信正常&#xff0c;断开网线。电脑客户端点击断开 3、经过一段时间&#xff08;超过tcp/ip 3次握手时间&#xff09…

【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

嵌入式Linux移植cJSON库

嵌入式Linux移植cJSON库 一、前言二、移植三、常用函数四、代码案例五、注意事项一、前言 在使用嵌入式系统做项目时,碰见了使用JSON格式数据的需求,所以需要移植cJSON库进行组织和解析数据。 二、移植 cJSON的github地址:https://github.com/DaveGamble/cJSON,可以在git仓…

僵尸毁灭工程 服务搭建 联机教程 无需公网IP、服务器

主要内容 什么是僵尸毁灭工程 搭建该服务&#xff0c;需要准备什么 详细步骤 1.下载并运行 SteamCMD 2.下载僵尸毁灭服务端 3.运行 MoleSDN 进行异地联机 4.小伙伴皮蛋加入鼠鼠服务器 完成联机 什么是僵尸毁灭工程 一款由The Indie Stone开发的开放世界生存模拟游戏。游…

WebRTC音视频同步原理与实现详解(上)

第一章、RTP时间戳与NTP时间戳 1.1 RTP时间戳 时间戳&#xff0c;用来定义媒体负载数据的采样时刻&#xff0c;从单调线性递增的时钟中获取&#xff0c;时钟的精度由 RTP 负载数据的采样频率决定。 音频和视频的采样频率是不一样的&#xff0c;一般音频的采样频率有 8KHz、…

【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)

文章目录 具体方法GPT分区表&#xff08;GUID Partition Table&#xff09;&#xff08;建议都用这种分区方法&#xff09;MBR分区表方法&#xff08;最大支持2TB分区&#xff09;&#xff08;Master Boot Record&#xff09; 附加&#xff1a;如何查看硬盘的型号另外&#xff…

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的日常工作中,我们经常…

spark 3.4.4 利用Spark ML中的交叉验证、管道流实现鸢尾花分类预测案例选取最优模型

前情回顾 前面的案例中&#xff0c;介绍了怎么基于管道流实现啊鸢尾花案例&#xff0c;利用逻辑斯蒂回归模型预测。详细内容步骤可以参照相应的博客内容 本案例内容 在 Spark 中使用交叉验证结合逻辑回归&#xff08;Logistic Regression&#xff09;以及管道流&#xff08;P…