您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MyBatis中怎么传递单个String类型的参数
## 一、问题背景
在MyBatis框架开发中,我们经常需要向SQL语句传递参数。当参数是单个String类型时,新手开发者可能会遇到参数传递失败或SQL注入风险等问题。本文将详细介绍四种安全可靠的参数传递方式。
## 二、基本参数传递方式
### 1. 使用`#{param}`占位符(推荐)
```xml
<!-- Mapper接口 -->
User getUserByName(String username);
<!-- XML映射文件 -->
<select id="getUserByName" resultType="User">
SELECT * FROM user WHERE username = #{username}
</select>
特点: - 自动进行预编译处理 - 防止SQL注入 - 参数名与占位符名称需一致
${param}
拼接(慎用)<select id="getUserByName" resultType="User">
SELECT * FROM user WHERE username = '${username}'
</select>
注意事项: - 直接拼接SQL字符串 - 存在SQL注入风险 - 必须手动添加引号 - 仅适用于可信参数场景
@Param
注解指定参数名当方法有多个参数时特别有用:
User getUserByName(@Param("name") String username);
<select id="getUserByName" resultType="User">
SELECT * FROM user WHERE username = #{name}
</select>
Map<String, Object> params = new HashMap<>();
params.put("userName", "admin");
<select id="getUserByName" parameterType="map" resultType="User">
SELECT * FROM user WHERE username = #{userName}
</select>
<select id="getUserByName" resultType="User">
SELECT * FROM user
<where>
<if test="username != null">
username = #{username}
</if>
</where>
</select>
安全写法:
<select id="searchUsers" resultType="User">
SELECT * FROM user WHERE username LIKE CONCAT('%', #{keyword}, '%')
</select>
List<String> names = Arrays.asList("Alice", "Bob");
<select id="getUsersByNames" resultType="User">
SELECT * FROM user
WHERE username IN
<foreach collection="list" item="name" open="(" separator="," close=")">
#{name}
</foreach>
</select>
方式 | 安全性 | 性能 | 可读性 |
---|---|---|---|
#{} | 高 | 优 | 优 |
${} | 低 | 良 | 中 |
@Param | 高 | 优 | 优 |
Map | 高 | 良 | 中 |
在MyBatis中传递String参数时,开发者应当:
1. 默认使用#{param}
预编译方式
2. 需要动态表名/列名等特殊场景才考虑${}
3. 保持参数命名一致性
4. 对用户输入参数进行严格校验
通过正确使用参数传递方式,可以构建既安全又高效的数据库访问层。
提示:MyBatis 3.4.6+版本支持使用
java.lang.String
直接作为parameterType,但通常可以省略让框架自动推断。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。