MyBatis参数处理

在写Mybatis的Mapper映射文件的时候,我们通常用#{}来获取传进来的参数,对于参数的处理其实还是有非常多的规则。

单个参数

对于单个参数,MyBatis不会做参数处理,用#{}取值,里面括号内不管写什么都可以取到值。

//定义接口
 public User selectById(int id);  //通过id查询

<!--   单个参数查询-->
    <select id="selectById" resultType="User" >
    select * from JDBC where id = #{abc}
    </select>

结果测试:

 @Test
    //查询
    public void T1() throws Exception {
        InputStream in = Resources.getResourceAsStream("Mybatis.xml");    //加载配置文件

        SqlSessionFactory SF = new SqlSessionFactoryBuilder().build(in);  //创建sqlSession工厂

        SqlSession s = SF.openSession();   //创建SqlSession对象

        User u = s.selectOne("selectById",1);   //调用查询方法 第一个参数是指mapper文件中id为select的sql语句,第二个参数是指对sql语句传入的参数

        System.out.println(u);  //打印查询到的数据

        s.close();   //关闭资源
    }

在这里插入图片描述

多个参数

MyBatis遇见多个参数会做特殊处理,多个参数会被封装成一个map。#{}就是从map中获取指定key的值。而key是param1、param2…param n。

//定义接口
 public User selectByIdAndPassword(int id , String password); //通过id和password查询

如果此时获取参数使用#{id}和#{password}是不能成功绑定的。

    <!-- 多个参数查询-->
    <select id="selectByIdAndPassword" resultType="User">
    select * from JDBC where id = #{id} and password = #{password}
    </select>

运行测试代码后会出现下面的错误
在这里插入图片描述
所以需要将查询语句中的#{id}和#{password}改为#{param1}和#{param2}

<select id="selectByIdAndPassword" resultType="User">
    select * from JDBC where id = #{param1} and password = #{param2}
 </select>

但是对于多个参数取值还有一种取值方法,使用@Param注解可明确指定封装map时key的名称和当前名称保持一致。此时可以用#{指定的key值}进行取值

public User selectByIdAndPassword(@Param("id") int id ,@Param("password") String password); //通过id和password查询
 <select id="selectByIdAndPassword" resultType="User">
    select * from JDBC where id = #{id} and password = #{password}
 </select>

在这里插入图片描述

如果参数过多,推荐直接传入对象,然后可以根据#{属性名}直接取出该属性的值。
如果传入的多个参数不是一个对象,此时可以将这些参数封装成一个map中,然后传入map即可。

 public User selectByMap(Map map);

<!-- 通过Map查询-->
    <select id="selectByMap" resultType="User">
    select * from JDBC where id = #{id} and password = #{password}
    </select>
 @Test
    public void T1_1() throws Exception {
        InputStream in = Resources.getResourceAsStream("Mybatis.xml");

        SqlSessionFactory SF = new SqlSessionFactoryBuilder().build(in);

        SqlSession s = SF.openSession();

        MybatisI mybatisI =  s.getMapper(MybatisI.class);

        Map<String,Object> map = new HashMap<String, Object>();
        map.put("id",1);
        map.put("password","111111");

        User u = mybatisI.selectByMap(map);
        System.out.println(u);

        s.close();
    }

在这里插入图片描述

特殊场景

public User getUser(@Param(“id”) int id, String name);
取值:id==>#{id} / #{param1} name==>#{param2}

public User getUser(int id,@Param(“e”) User user);
取值:id==>#{param1} name==>#{param2.name} / #{e.name}

public User getUser(List ids);
注意如果是Collection(List、Set)类型或者数组类型也会特殊处理。也是将list或者数组封装到map中。key:Collect类型是(collection),如果是List还可以使用这个key(list);数组的key是(array)
取值:(取第一个id的值) #{list[0]} / #{collection[0]}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值