Mybatis的几种传参方式

Mybatis的几种传参方式


单个参数

单个参数的传参比较简单,可以是任意形式的,比如 #{a} 、 #{b} 或者 #{param1} , 但是为了开发规范,尽量使用和入参时一样 。


Mapper

UserInfo selectByUserId(String userId);

XML

<select id="selectByUserId" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=1
  </select>

多个参数

使用索引【不推荐】

多个参数可以使用类似于索引的方式传值,比如 #{param1} 对应第一个参数, #{param2} 对应第二个参数…


Mapper

UserInfo selectByUserIdAndStatus(String userId,Integer status);

XML

<select id="selectByUserIdAndStatus" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{param1} and status=#{param2}
    </select>

注意 :由于开发规范,此种方式不推荐开发中使用。


使用@Param

@Param 这个注解用于指定key,一旦指定了key,在SQL中即可对应的key入参。

Mapper

UserInfo selectByUserIdAndStatus(@Param("userId") String userId,@Param("status") Integer status);

XML

<select id="selectByUserIdAndStatus" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>

使用Map

Mybatis底层就是将入参转换成 Map ,入参传Map当然也行,此时 #{key} 中的 key 就对应Map中的 key 。

Mapper

UserInfo selectByUserIdAndStatusMap(Map<String,Object> map);

XML

<select id="selectByUserIdAndStatusMap" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>


测试

@Test
    void contextLoads() {
        Map<String,Object> map=new HashMap<>();
        map.put("userId","1222");
        map.put("status",1);
        UserInfo userInfo = userMapper.selectByUserIdAndStatusMap(map);
        System.out.println(userInfo);
    }

POJO【推荐】

多个参数可以使用实体类封装,此时对应的 key 就是属性名称,注意一定要有 get 方法。

Mapper

UserInfo selectByEntity(UserInfoReq userInfoReq);

XML

<select id="selectByEntity" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>

实体类

@Data
public class UserInfoReq {
    private String userId;
    private Integer status;
}

List参数

List传参也是比较常见的,通常是SQL中的 in


Mapper

List<UserInfo> selectList( List<String> userIds);

XML

<select id="selectList" resultMap="userResultMap">
        select * from user_info where status=1
        and user_id in
        <foreach collection="list" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>

数组参数

这种方式类似List传参,依旧使用 foreach 语法。


Mapper

List<UserInfo> selectList( String[] userIds);

XML

<select id="selectList" resultMap="userResultMap">
        select * from user_info where status=1
        and user_id in
        <foreach collection="array" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>


qrcode