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

server/2024/11/27 4:23:21/

文章目录

    • 一、映射文件参数
    • 二、查询映射
      • 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/server/145236.html

相关文章

嵌入式硬件设计:从概念到实现的全流程

嵌入式硬件设计是现代电子技术中一个至关重要的领域&#xff0c;涉及从硬件架构设计到硬件调试的各个方面。它为我们日常生活中的各类智能设备、家电、工业控制系统等提供了强大的支持。本文将介绍嵌入式硬件设计的基本流程、关键技术、常用工具以及常见的挑战和解决方案&#…

PyTorch2

Tensor的常见操作&#xff1a; 获取元素值&#xff1a; 注意&#xff1a; 和Tensor的维度没有关系&#xff0c;都可以取出来&#xff01; 如果有多个元素则报错&#xff1b; import torch def test002():data torch.tensor([18])print(data.item())pass if __name__ &qu…

设计模式之策略模式-工作实战总结与实现

文章目录 应用场景存在问题解决方案继续延伸 应用场景 假设有这样的业务场景&#xff0c;大数据系统把文件推送过来&#xff0c;根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码&#xff1a; public class Question {public static void main(String[] args…

手机无法连接服务器1302什么意思?

你有没有遇到过手机无法连接服务器&#xff0c;屏幕上显示“1302”这样的错误代码&#xff1f;尤其是在急需使用手机进行工作或联系朋友时&#xff0c;突然出现的连接问题无疑会带来不少麻烦。那么&#xff0c;什么是1302错误&#xff0c;它又意味着什么呢&#xff1f; 1302错…

【Axure高保真原型】或和且条件

今天和大家分享或和且条件案例的原型模板&#xff0c;效果包括&#xff1a; 可以选择指标、等式和填写对应值构成条件等式&#xff1b; 点击添加条件按钮&#xff0c;可以增加一行新的条件&#xff1b; 点击所在行的号按钮&#xff0c;可以在该行下方添加一行新的条件&#x…

图像识别,摄像头选型,分辨率因素如何考量

在进行图像识别应用的开发过程中&#xff0c;选择合适的摄像头和分辨率是至关重要的。以下是一些考虑因素&#xff0c;可以帮助你做出更明智的选择&#xff1a; 1. 图像识别需求 对象大小&#xff1a;如果需要识别的小对象&#xff08;如蜗牛&#xff09;占比较小的像素面积&…

IDEA2024如何创建Web项目以及配置Tomcat

在Web项目的开发过程中&#xff0c;Tomcat作为一款开源的Servlet容器&#xff0c;扮演着至关重要的角色。它不仅能够提供稳定的运行环境&#xff0c;还支持多种Java EE规范&#xff0c;为开发者提供了丰富的功能支持。因此&#xff0c;正确配置Tomcat服务器对于确保Web项目的顺…

全面解读 Qt 容器类

全面解读 Qt 容器类&#xff1a;选择最合适的解决方案 Qt 提供了一组强大的容器类&#xff0c;用于存储和管理数据。这些容器类不仅功能强大&#xff0c;还特别针对 Qt 的需求进行了优化&#xff0c;在性能、使用便捷性和内存管理上具有独特优势。 在开发中&#xff0c;我们经…