关于Mybatis中mapper.xml的传入参数简单技巧

本文分享了在MyBatis中各种类型参数的传递方法,包括对象、Map、集合及简单类型等,并提供了实用的测试经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于在做项目的时候,我看见同事使用的传入参数类型各式各样,感觉没规律可言,闲暇的时候我就自己搭建了项目做了一些传入参数的测试(当然其实更好的方式是看源码,但是博主能力有限,毕竟入行没多久,看起来很吃力,只能靠测试来找规律,下面是我发现的小技巧,我测试的是3.4.x版本的,猜想应该现在用的版本规律都差不多);

首先声明,常用的不管传入参数是什么,sqlStatement中的parameterType都可以不写,如下图:


请关注6、

1: 对于传入参数为对象类型的,直接使用属性.属性.属性获取值 , 如: #{xx.xx.xx};

 2:对于传入参数为map类型的,直接使用key获取值,如 : map = {"name": "张三''},使用#{name}获取“张三”;

3: 对于传入参数为集合类型,一般都会使用到foreach标签,在collection属性中使用collection或者list或array获取该集合,collection, list是针对List类型,array是对数组类型,表达式为:collection="collection",collection="list",collection="array";


4 : 对于简单类型,获取的时候可以通过任意键获取。如 : #{我是任意键},#{x},#{y},#{z}均可获取;

5 : 对于单个传入参数,使用@Param(“key”)的时候可以把参数装到map中,和2一样,使用key获取值;

6 : 对于多个参数(包含简单类型,list和array),如果使用全部使用@Param装到map中,就可像2一样使用key获取值,当然也可以使用通用方法,对于第一个参数我们就使用#{param1}获取,第二个参数使用#{param2}获取,以此类推;如果不使用@Param,也可以使用#{param1},#{param2}获取(还可以使用arg0,arg1..可忽略);

其实我可能也没描述清楚,在此表示惭愧!
<think>好的,我现在需要帮助用户了解MyBatismapper.xml文件中的SQL标签用法及配置示例。首先,我需要回忆MyBatis的相关知识,确保自己正确理解各个SQL标签的作用和用法。 用户的问题集中在mapper.xml的SQL标签配置,所以重点应该放在常用的标签上,比如<select>, <insert>, <update>, <delete>,还有动态SQL标签如<if>, <choose>, <foreach>,以及处理特殊字符的方法。另外,用户提供的引用内容提到了转义和CDATA的使用,这也需要涵盖进去。 首先,我应该整理每个SQL标签的基本结构和示例。例如,<select>标签用于查询,需要包含id、parameterType和resultType属性。然后给出一个简单的查询示例,比如根据id查询用户信息。 接下来是动态SQL部分,这部分是MyBatis的强大功能之一。需要解释<if>标签如何根据条件动态添加WHERE子句,比如在查询用户时,如果有传入name或email参数,就添加到条件中。同时,要提到<where>标签自动处理AND和OR的问题,避免语法错误。 然后是关于循环的<foreach>标签,常见于IN查询或批量操作。例如,根据多个用户ID查询用户列表,这里需要展示如何遍历集合,并生成对应的SQL语句。注意要说明collection、item、open、close等属性的作用。 另外,用户提到的特殊字符处理,比如比较运算符中的大于、小于号,需要解释两种方法:转义字符和CDATA块。引用中的内容已经提到这两点,所以需要结合示例说明,比如在WHERE条件中使用<![CDATA[ ]]>包裹带有比较符号的表达式,或者使用>和<这样的转义字符。 还有include标签用于复用SQL片段,这也是提高XML可维护性的好方法。需要展示如何定义<sql>片段,并通过<include>引用它,减少重复代码。 在编写示例时,要确保代码格式正确,特别是XML的标签闭合和属性使用。同时,要注意转义字符的正确写法,比如在XML中使用>代表大于号,<代表小于号。如果使用CDATA,要确保表达式被正确包裹,避免解析错误。 可能还需要提到其他动态标签,比如<choose>、<when>、<otherwise>,但根据用户的问题,可能先集中在最常用的几个标签上,避免信息过载。同时,需要强调配置中的注意事项,比如参数类型、结果映射,以及避免SQL注入的问题。 最后,生成相关问题时要围绕MyBatis的SQL配置,可能涉及性能优化、动态SQL的其他标签、结果映射配置,或者与其他框架的整合等。例如,如何防止SQL注入,或者如何使用关联查询处理一对一、一对多关系。 现在需要检查是否有遗漏的部分,比如参数传递的方式(#{}和${}的区别),但用户的问题更侧重于标签配置,所以可能在示例中简单提及#{}的使用即可。确保所有示例符合MyBatis的语法,并且正确转义了特殊字符,或者正确使用CDATA。 总结一下,回答的结构应该是先介绍常用的CRUD标签,然后动态SQL标签,接着处理特殊字符的方法,最后是SQL片段复用。每个部分都给出示例代码,并引用用户提供的参考资料中的转义和CDATA部分。最后的问题生成要围绕相关主题,帮助用户进一步探索。</think>### MyBatis mapper.xml SQL标签用法及配置示例 在MyBatis的`mapper.xml`文件中,SQL标签用于定义和执行数据库操作。以下是常用标签的用法及示例: --- #### 1. **基本CRUD标签** - **`<select>`**: 定义查询语句 ```xml <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` - `id`:方法名,需与接口方法名一致 - `parameterType`:输入参数类型 - `resultType`:返回结果类型(实体类或基本类型) - **`<insert>`**: 定义插入语句 ```xml <insert id="insertUser" parameterType="User"> INSERT INTO user(name, email) VALUES(#{name}, #{email}) </insert> ``` - **`<update>`**: 定义更新语句 ```xml <update id="updateUser" parameterType="User"> UPDATE user SET name=#{name} WHERE id=#{id} </update> ``` - **`<delete>`**: 定义删除语句 ```xml <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> ``` --- #### 2. **动态SQL标签** - **`<if>`**: 条件判断 ```xml <select id="findUser" parameterType="map" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="email != null"> AND email = #{email} </if> </where> </select> ``` - `<where>`标签会自动去除首个`AND`或`OR`,避免语法错误[^1]。 - **`<foreach>`**: 遍历集合(常用于IN查询) ```xml <select id="findUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" collection="ids" open="(" separator="," close=")"> #{id} </foreach> </select> ``` - `collection`:集合参数名 - `item`:遍历时的临时变量名 - `open/close`:循环开始/结束时的符号(如括号) --- #### 3. **特殊字符处理** 在SQL中使用比较运算符(如`<`, `>`)时,需通过**转义**或**`<![CDATA[]]>`**避免与XML语法冲突: - **转义写法** ```xml <select id="findByAge" resultType="User"> SELECT * FROM user WHERE age >= 18 AND age <= 60 </select> ``` - **CDATA写法**(更推荐) ```xml <select id="findByAge" resultType="User"> SELECT * FROM user WHERE age <![CDATA[ >= ]]> 18 AND age <![CDATA[ <= ]]> 60 </select> ``` - `<![CDATA[ ]]>`包裹的内容会被XML解析器忽略,执行效率更高[^2]。 --- #### 4. **SQL片段复用** - **`<sql>` + `<include>`**: 定义可复用的SQL片段 ```xml <!-- 定义公共字段 --> <sql id="userColumns">id, name, email</sql> <!-- 引用片段 --> <select id="getUser" resultType="User"> SELECT <include refid="userColumns"/> FROM user </select> ``` --- #### 注意事项 1. **参数占位符**:使用`#{field}`防止SQL注入,避免使用`${field}`(有注入风险)。 2. **结果映射**:复杂查询可使用`<resultMap>`定义字段与属性的映射关系。 3. **性能优化**:动态SQL标签能减少拼接字符串的开销[^1]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值