前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5. Mybatis获取参数值的两种方式

5. Mybatis获取参数值的两种方式

作者头像
捞月亮的小北
发布2023-12-01 08:42:30
2680
发布2023-12-01 08:42:30
举报
文章被收录于专栏:捞月亮的小北

MyBatis 获取参数值的两种方式:${} 和 #{}

  • ${}的本质就是字符串拼接,#{}的本质就是占位符赋值
  • ${}使用字符串拼接的方式拼接 sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引
  • 号;但是#{}使用占位符赋值的方式拼接 sql,此时为字符串类型或日期类型的字段进行赋值时,
  • 可以自动添加单引号

#{}:先编译 sql 语句,再给占位符传值,底层是 PreparedStatement 实现。可以防止 sql 注入,比较常用。

${}:先进行 sql 语句拼接,然后再编译 sql 语句,底层是 Statement 实现。存在 sql 注入现象。只有在需要进行 sql 语句关键字拼接的情况下才会用到。

Mybatis 中的 ${}​ 和 #{}​ 都是用于 SQL 语句中参数的替代。

#{}​ 使用的是预编译语句,用于将输入参数的值与 SQL 语句分开处理,防止 SQL 注入等安全问题,同时也有效的提高了 SQL 语句的查询性能。在 SQL 解析过程中,#{} 会将参数值进行一定的处理,比如转义特殊字符、处理成相应的数据类型等。

$ {}​ 在 SQL 中是直接替换为参数的值,不做任何转义和修改。这种方式的优点是灵活性强,可以用于不同的场景,但是这种方式存在 SQL 注入的风险,因为输入的参数被直接拼接到 SQL 语句中,如果不充分防范,很容易被攻击者利用。

一般情况下,使用 #{}​ 是比较安全的方式,但是如果在某些特殊的情况下,确实需要使用 ${}​,比如在动态 SQL 中,将一些动态的 SQL 拼接到主 SQL 中。

综上所述,#{}​ 适用于大多情况下,比如查询、更新等;而 ${}​ 适用于某些特殊情况,比如动态 SQL,但是需要注意 SQL 注入的问题。

使用方式示例:

  • #{}​:
代码语言:javascript
复制
<select id="getUserById" resultType="User">
  select * from user where id = #{id}
</select>
代码语言:javascript
复制
Map<String, Object> param = new HashMap<>();
param.put("id", 1);
User user = sqlSession.selectOne("getUserById", param);
  • ${}​:
代码语言:javascript
复制
<!-- 动态 SQL 标签 -->
<select id="getUserByCondition" resultType="User">
  select * from user where
  <if test="name != null">
    name = '${name}'
  </if>
  <if test="age != null">
    and age = '${age}'
  </if>
</select>
代码语言:javascript
复制
Map<String, Object> param = new HashMap<>();
param.put("name", "John Doe");
param.put("age", 20);
User user = sqlSession.selectOne("getUserByCondition", param);

1. 单个字面量类型的参数

  • 若 mapper 接口中的方法参数为单个的字面量类型
  • 此时可以使用
{}和#{}以任意的名称获取参数的值,注意

{}需要手动加单引号

image
image

2. 多个字面量类型的参数

  • 若 mapper 接口中的方法参数为多个时
  • 此时 MyBatis 会自动将这些参数放在一个 map 集合中,以 arg0,arg1...为键,以参数为值;以
  • param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问 map 集合的键就可以获取相
  • 对应的值,注意${}需要手动加单引号

image
image

3. map 集合类型的参数

  • 若 mapper 接口中的方法需要的参数为多个时,此时可以手动创建 map 集合,将这些数据放在 map 中
  • 只需要通过
{}和#{}访问map集合的键就可以获取相对应的值,注意

{}需要手动加单引号

image
image

image
image

代码实现:

代码语言:javascript
复制
    @Test
    public void testCheckLoginMap() {
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String, Object> map = new HashMap<>();
        map.put("username", "zhangsan");
        map.put("password", "123456");
        User user = mapper.checkLoginMap(map);
        System.out.println(user);
        sqlSession.close();
    }

4. 实体类类型的参数

若 mapper 接口中的方法参数为实体类对象时 , 此时可以使用${}和#{},通过访问实体类对象中的属性名获取属性值

注意 :

  • ${} 需要手动添加单引号

根据属性名获取属性值​

  • 这里的属性名指的是实体类当中get后面的名字​ , 就像 getAge 而这里的属性名值得就是 age , 大小写无所谓 ​
image
image

5. 使用@Param 标识参数

可以通过@Param 注解标识 mapper 接口中的方法参数, 此时会将这些参数放在 map 集合中,以@Param 注解的 value 属性值为键,以参数为值;以 param1,param2...为键,以参数为值;只需要通过${}和#{}访问 map 集合的键就可以获取相对应的值

注意${}需要手动加单引号

image
image

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 单个字面量类型的参数
  • 2. 多个字面量类型的参数
  • 3. map 集合类型的参数
  • 4. 实体类类型的参数
  • 5. 使用@Param 标识参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档