MyBatis输入映射

本文详细介绍了Mybatis框架中如何在接口方法中通过不同方式传递单个和多个参数,包括使用下标索引、@Param注解、Map和pojo类,以及各个方法的适用场景和注意事项。

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

1 parameterType

parameterType:接口中方法参数的类型,类型必须是完全限定名或别名(稍后讲别名)。该属性非必须,因为Mybatis框架能自行判断具体传入语句的参数,默认值为未设置(unset)。<select>,<insert>,<update>,<delete>都可以使用 parameterType 指定参数类型。

2 传递单个参数

当接口中的方法只有一个参数的时候,直接使用#{任意名称}传参即可,#{}中的名称与方法中的参数名称无关。

3 传递多个参数

当接口中方法有多个参数的时候,有以下方式传参:

3.1 通过参数下标索引

接口正常书写,映射文件中SQL语句的占位符必须用 arg0 agr1…,或param1 param2…

注意:mybatis-3.3 之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。

TeamMapper接口添加如下内容:

 List<Team> queryByRange1(Integer min, Integer max);

TeamMapper.xml配置文件中添加如下:

<!--多个参数:标签中不需要parameterType属性
    方式1:通过下标索引的方式,还有两种方式(太难记了,可以忽略,看看演示就好啦)
    select * from team where teamId &gt;=#{arg0} and teamId &lt;=#{arg1}; 也可以,注意下表索引
        细节1:
            mybatis3.3版本之前:可以直接写#{0} #{1}
            从mybatis3.4开始:#{arg0} #{arg1}... 或者是 #{param1} #{param2}...
        细节2:
            sql语句中不能使用小于号,使用转移符号替换;大于号没有限制,也可以使用转义符号替换&gt;
    -->
    <select id="queryByRange1" resultType="com.lina.pojo.Team">
        select * from team where teamId >=#{param1} and teamId &lt;=#{param2};
    </select>

测试类添加方法:

/**
 * ClassName: TestTeamMapperArg
 * 测试输入映射:多个参数
 * @author wanglina
 * @version 1.0
 */
public class TestTeamMapperArg {
    private TeamMapper teamMapper= MybatisUtil.getSqlSession().getMapper(TeamMapper.class);
    @Test
    public void test01(){
        List<Team> teams = teamMapper.queryByRange1(1004, 1010);
        teams.forEach(team -> System.out.println(team));
    }
}

3.2 通过@Param注解

在方法的形参前面加入@Param("自定义参数名称"),mapper文件中使用#{自定义参数名称}的方式传参。

TeamMapper接口添加如下内容:

List<Team> queryByRange2(@Param("min") Integer min, @Param("max") Integer max);

TeamMapper.xml配置文件中添加如下:

    <!--方式2:通过注解的方式:
        #{}中的名称必须与接口的方法中的参数注解@Param()保持一致
        select * from team where teamId >=#{param1} and teamId &lt;= #{param2}; 不推荐,但是语法也是正确的,但是不能使用arg0,arg1......
    -->
    <select id="queryByRange2" resultType="com.lina.pojo.Team">
        select * from team where teamId >=#{min} and teamId &lt;= #{max};
    </select>

测试类添加方法:

    @Test
    public void test02(){
        List<Team> teams = teamMapper.queryByRange2(1005, 1011);
        teams.forEach(team -> System.out.println(team));
    }

3.3 通过map来传递多个参数

Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。Map 集合使用 String的 key,Object 类型的值存储参数。 mapper 文件使用 # { key } 引用参数值

TeamMapper接口添加如下内容:

List<Team> queryByRange3(Map<String,Object> map);

TeamMapper.xml配置文件中添加如下:

<!--方式3:通过map来传递多个参数:映射文件中的参数占位符必须和map中的String类型的字段名称一样-->
    <select id="queryByRange3" resultType="com.lina.pojo.Team">
        select * from team where teamId >=#{min} and teamId &lt;= #{max};
    </select>

测试类添加方法:

@Test
    public void test03(){
        TeamMapper teamDao= sqlSession.getMapper(TeamMapper.class);       
        Map<String, Object> map=new HashMap<>();
        map.put("min",1001);
        map.put("max",2000);
        List<Team> teamList3 = teamDao.queryByRange3(map);
        for (Team team : teamList3) {
            System.out.println(team);
        }
    }

3.4 通过pojo类传递多个参数

与map传递多个参数类似,要求映射文件中的参数占位符必须和pojo类中的属性完全一致。

实体类:

/**
 * ClassName: QueryVO
 * 自己封装的查询条件
 * @author wanglina
 * @version 1.0
 */
public class QueryVO {
    private String name;
    private Integer min;
    private Integer max;
    private String location;
    //省略set get
}
​

TeamMapper接口添加如下内容:

List<Team> queryByCondition(QueryVO vo);

TeamMapper.xml配置文件中添加如下:

<!--方式4:通过pojo类传递多个参数:映射文件中的参数占位符必须和pojo类中的字段完全一致-->
<select id="queryByCondition" resultType="com.lina.pojo.Team">
        select * from team
        where teamId>=#{min} and teamId&lt;=#{max}
        and teamName like #{name} and location=#{location}
    </select>

测试类添加方法:

@Test
    public void test04(){
        QueryVO vo=new QueryVO();
        vo.setLocation("洛杉矶");
        vo.setName("%球队%");
        vo.setMin(1001);
        vo.setMax(1111);
        List<Team> teams = teamMapper.queryByCondition(vo);
        teams.forEach(team -> System.out.println(team));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值