Mybatis常见入参方式(Map、注解、JavaBean)

目录

1、使用Map传参;

2、使用注解传参;

3、使用JavaBean传参;

4、Mybatis使用#{}和${}注入参数的区别;


Mybatis给映射器传递多个参数分为以下三种方法。

1、使用Map传参;

  <select id="getUserByMy" parameterType="map">
    select user_name from tbl_user_infobymy where user_id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
  </select>

dao层接口使用map作为入参

    UserInfo getUserByMy(Map<String, String> params);

调用dao层接口

Map<String, Object> map = HashMap<String, Object>();
String[] ids = {"12345", "12346"};
map.put("ids", ids);
getUserByMy();

2、使用注解传参;

使用 MyBatis 的注解 @Param() 传递参数

  <select id="getUserByMy" parameterType="map">
    select user_name from tbl_user_infobymy where user_id = #{params.id}
  </select>

dao层接口使用map作为入参;

 UserInfo getUserByMy(@Param("params")Map<String, String> map);

把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数,提高了参数可读性。 

3、使用JavaBean传参;

在参数过多的情况下,MyBatis 允许组织一个 JavaBean;

    int updateByPrimaryKey(UserInfo record);
  <update id="updateByPrimaryKey" parameterType="com.demo.projo.UserInfo">
    update tbl_user_infobymy
    set user_name = #{userName,jdbcType=VARCHAR},
      user_psd = #{userPsd,jdbcType=VARCHAR}
    where user_id = #{userId,jdbcType=INTEGER}
  </update>
userName,userPsd,userId对应JavaBean实体类UserInfo的属性值;

4、Mybatis使用#{}和${}注入参数的区别;

使用#{}方式:

#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

#方式能够很大程度防止sql注入,相当于使用PreparedStatement方式

使用${}方式:

${}将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.

$方式无法防止SQL注入,如在登录查询用户时,若使用${}方式传参,当密码为upass='' or 1=1时,密码是任意字符时,返回的结果都为true;

select * from user where uname='user1' and upass='' or 1=1;
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 支持多入参方式有以下几种: 1. 使用 @Param 注解:在 Mapper 接口中定义多个参数,使用 @Param 注解为每个参数指定一个名称,在 SQL 中使用 ${paramName} 的方式引用。例如: ```java public interface UserMapper { List<User> selectUserByNameAndAge(@Param("name") String name, @Param("age") Integer age); } ``` ```xml <select id="selectUserByNameAndAge" resultType="User"> select * from user where name = #{name} and age = #{age} </select> ``` 2. 使用 Map:将多个参数封装到一个 Map 中,Map 的 key 为参数名称,Map 的 value 为参数值,在 SQL 中使用 ${key} 的方式引用。例如: ```java public interface UserMapper { List<User> selectUserByMap(Map<String, Object> paramMap); } ``` ```xml <select id="selectUserByMap" resultType="User"> select * from user where name = #{name} and age = #{age} </select> ``` 3. 使用 JavaBean:将多个参数封装到一个 JavaBean 中,在 SQL 中使用 #{propertyName} 的方式引用。例如: ```java public class UserQuery { private String name; private Integer age; // getter/setter 省略 } public interface UserMapper { List<User> selectUserByQuery(UserQuery query); } ``` ```xml <select id="selectUserByQuery" resultType="User"> select * from user where name = #{name} and age = #{age} </select> ``` 以上三种方式都是可以支持多入参的。具体选择哪种方式,可以根据具体情况来选择。如果参数比较少,建议使用 @Param 注解;如果参数比较多,可以考虑使用 MapJavaBean

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值