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

MyBatis 中 parameterType 属性

MyBatis 中 parameterType 属性的核心解析

一、属性定义

parameterType 是 MyBatis 映射文件(XML)中用于指定 SQL 语句输入参数类型的类型(可以使普通java类型也可以是Pojo实体类),主要作用于 <insert>, <update>, <delete>, <select> 等 CRUD 标签。

二、核心作用
  1. 类型识别
    框架通过此属性确定如何解析参数对象:
    • 基本类型处理(int/String 等)
    • POJO 对象属性映射
    • Map 键值对处理
    • 集合类型处理
  1. 类型转换
    自动处理 JDBC 类型与 Java 类型的映射关系
三、使用场景与示例

注意:如果参数是 唯一的且无 @Param 注解,MyBatis 会自动解构对象属性,允许直接写 #{属性名}

场景 1:基本数据类型
<select id="findByAge" parameterType="int" resultType="User">SELECT * FROM users WHERE age = #{value}
</select>
场景 2:POJO 对象
<insert id="insertUser" parameterType="com.example.User">INSERT INTO users(name,email) VALUES(#{name}, #{email})
</insert>
场景 3:Map 参数
<select id="search" parameterType="map" resultType="User">SELECT * FROM users WHERE name = #{nameKey} AND age = #{ageKey}
</select>
四、现代用法演进
  1. 类型自动推断(MyBatis 3.4.5+)
    以下情况可省略 parameterType
<!-- 自动识别为String类型 -->
<select id="findByName" resultType="User">SELECT * FROM users WHERE name = #{name}
</select>
  1. 多参数方法
    使用 @Param 注解时无需声明:
List<User> findByConditions(@Param("name") String name,@Param("minAge") int minAge
);
<select id="findByConditions" resultType="User">SELECT * FROM users WHERE name = #{name} AND age > #{minAge}
</select>
五、特殊类型处理

参数类型

处理方式

集合/数组

使用 <foreach> 遍历

枚举类型

需实现 TypeHandler 接口

自定义对象

直接访问对象属性

六、最佳实践建议
  1. 显式声明场景
    当出现以下情况时建议保留:
<!-- 多参数未使用@Param时需声明为map -->
<select id="multiParamSearch" parameterType="map">...
</select>
  1. 类型安全校验
    复杂业务场景显式声明可增强可读性:
<update id="updateProfile" parameterType="com.example.ProfileDTO">...
</update>
  1. 性能优化
    明确指定类型可跳过类型推断过程:
<!-- 明确基本类型提升效率 -->
<delete id="deleteById" parameterType="long">DELETE FROM users WHERE id = #{id}
</delete>
七、常见误区
  1. resultType 混淆
    • parameterType:输入参数类型
    • resultType:输出结果类型
  1. 过度依赖自动推断
    复杂对象嵌套时显式声明更可靠
  2. @Param 冲突
    当使用注解指定参数名时,parameterType 实际类型应为 map

通过合理运用 parameterType,可以提升 SQL 映射的清晰度和执行效率,但在现代 MyBatis 版本中更推荐采用类型推断机制保持代码简洁。

http://www.xdnf.cn/news/618157.html

相关文章:

  • AutoCAD Electrical 自定义多极元件
  • 反本能---如何对抗你的习以为常
  • 二分算法(灵神边界处理复习)
  • 电子电路:能认为电抗也是在做功吗?
  • 软件测试(4) 白盒测试
  • 归一化与标准化
  • 频率分布直方图
  • halcon初始
  • 深度剖析并发I/O模型select、poll、epoll与IOCP核心机制
  • 计算机组成原理-基本运算部件定点数的运算
  • 【安全攻防与漏洞​】​​Heartbleed漏洞复现与修复
  • 【JS】vue3具名导出与默认导出
  • [Asp.Net]GridView导出Excel长数字显示成科学计数
  • Spring Boot 项目多数据源配置【dynamic datasource】
  • C++进阶--c++11(02)
  • 【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)
  • 全球复合铁路枕木市场深度分析:技术革新与区域增长潜力(2024-2031)
  • IIS部署微信支付模块问题
  • 欧拉公式的历史脉络、数学证明和现代意义
  • 信息学奥赛及各种程序设计竞赛中常见的名词解释
  • Android四大组件学习总结
  • PyQt学习系列07-数据库操作与ORM集成
  • JavaMail的使用
  • 重读《人件》Peopleware -(12-1)Ⅱ 办公环境 Ⅴ 大脑时间与身体时间(上)
  • 超简单 FishSpeech 本地部署
  • 【游戏设计】游戏玩法与游戏机制
  • 决策树引导:如何选择最适合你的机器学习算法
  • 文章记单词 | 第110篇(六级)
  • Java 8 Lambda 表达式使用说明与案例
  • 前端测试简介