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

文章目录

一、映射文件参数

@Param 注解官方文档解释

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

java 复制代码
public int save(User user);
xml 复制代码
<!-- 添加用户 -->
<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);
xml 复制代码
<!-- 模糊查询功能 -->
<select id="findBillList" parameterType="String" resultType="Bill">
    select id,billCode,productName,productDesc from smbms_bill
    where productName like concat("%",#{productName},"%")
    and productDesc like concat("%",#{productDesc},"%")
</select>

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

java 复制代码
List<User> getUserByMap(Map<String, Object> paramMap);
xml 复制代码
<!-- 查询语句 -->
<select id="getUserByMap" parameterType="map"  resultType="User">
    SELECT id,userCode,userName,birthday FROM smbms_user
    WHERE 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 主配置文件中关闭自动映射

xml 复制代码
<!-- 关闭自动映射 -->
<settings>
    <setting name="autoMappingBehavior" value="NONE"/>
</settings>

autoMappingBehavior 控制自动映射的行为。

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

简单的 resultMap 定义示例:

xml 复制代码
<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;//角色对象
}
xml 复制代码
<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>

或者

xml 复制代码
<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;
}
xml 复制代码
<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 指定了集合中元素的类型。

相关推荐
sakoba36 分钟前
SpringMVC
java·学习
钢板兽39 分钟前
力扣hot100——子串、普通数组、矩阵
java·后端·算法·leetcode·面试·矩阵
紫气东来,茉上花开44 分钟前
java如何在linux服务器创建文件excel并把循环插入每一行的后端查出来的数据,每天新建一个excel带时间的
java·linux·服务器
奔跑的废柴1 小时前
LeetCode 513. 找树左下角的值 java题解
java·算法·leetcode
青云交2 小时前
Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)
java·大数据·图像处理·机器学习·视频检索·智能安防·视频摘要
Biehmltym2 小时前
【架构差异】SpringとSpringBoot:Bean机制的深入剖析与自动配置原理
java·spring boot·spring
XiaoyuEr_66883 小时前
在java中使用RabbitMQ的步骤
java·rabbitmq·java-rabbitmq
Tttian6225 小时前
Spring
java·后端·spring
南山不太冷5 小时前
Spring(4)——响应相关
java·后端·spring
kill bert5 小时前
第27周JavaSpringboot电商进阶开发 1.企业级用户验证
java·前端·数据库