Mybatis对参数的处理

Mybatis对参数的处理

最简单情况:一个参数(普通类型或对象的引用)

一个简单类型(或其包装类)的参数

    public College getCollegeById(Integer id);
    <select id="getCollegeById" resultMap="college">
        select * from college where college_id = #{id};
    </select>

一个简单类型的参数,直接使用#{参数名}就可以使用

一个对象的引用

    public void updateCollege(College college);
    <update id="updateCollege">
        update college set college_name = #{name} where college_id = #{id}
    </update>

一个引用类型的参数,直接使用#{字段名}就可以取出该参数的字段

多个参数

Mybatis对多个参数的处理

如果传递多个参数,Mybatis会将这多个参数封装到一个map对象

取得参数:#{key},key就是map的key

参数对应的key

参数对应的key有4种:

若有N个参数,每个参数对应的key

  1. param1,param2 … paramN
  2. arg0, arg1 … argN-1
  3. 方法中的参数名
  4. 通过@Param('key')指定

举例:

public College getCollegeByIdAndName(Integer id, String name);

  • 使用param1, param2 … paramN作为key
    <select id="getCollegeByIdAndName" resultMap="college">
        select * from college where college_id = #{param1} and college_name = #{param2}
    </select>
  • 使用arg0, arg1 … argN-1
    <select id="getCollegeByIdAndName" resultMap="college">
        select * from college where college_id = #{arg0} and college_name = #{arg1}
    </select>
  • 使用@Param指定key
    public College getCollegeByIdAndName(@Param("cid")Integer id, @Param("cname") String name);
    <select id="getCollegeByIdAndName" resultMap="college">
        select * from college where college_id = #{cid} and college_name = #{cname}
    </select>
  • 使用参数名作为key

public College getCollegeByIdAndName(Integer id, String name);

    <select id="getCollegeByIdAndName" resultMap="college">
        select * from college where college_id = #{id} and college_name = #{name}
    </select>

注意不要和传递一个对象的引用的情况相混淆。

使用参数名作为key的有关设置
  1. 开启Mybatis的useActualParamName选项

在全局配置文件中的<configuration>中,进行以下配置:

当前比较高的版本,这个选项默认值为true,为了防止版本更迭对这个选项造成影响,显式地设置更保险。

<settings>
	<setting name="useActualParamName" value="true"/>
</settings>
  1. 编译时,加入-parameters选项。有了这个选项,反射机制才可以获得参数名。但是,如果开启了这个选项,arg0,arg1…argN-1就不能再使用了,parm1…paramN仍然可以使用

多个参数中存在引用类型

在上面的例子中,已经知道了通过key可以取得一个参数,对于多个参数来说,可以通过它的key得到它。

如果它是一个对象的引用,可以通过#{key.field}来获取它的字段

public void updateCollegeWithName(College college, String name);

同样,在编译时,开启了-prameters选项

    <update id="updateCollegeWithName">
        update college set college_name = #{name} where college_name = #{college.name}
    </update>

因为开启了-prameters选项,所以不能再使用arg0,arg1…argN-1

但是仍然可以使用parm1…paramN

    <update id="updateCollegeWithName">
        update college set college_name = #{name} where college_name = #{param1.name}
    </update>

集合类型

Map类型

Map类型的集合,Mybatis会像处理多个参数一样,将map对象的每一项加入参数的map。也就是说,使用传入的map中的key,就可以的得到传入map中key对应的value。

接口定义:

    public College getCollegeByIdAndNameWithMap(Map<String, Object> args);

传参:

        Map<String ,Object> map = new HashMap<>();
        map.put("cid", 1);//配置文件中,使用#{cid}就可以取得value(1)
        map.put("cname", "计算机学院");
        College c = collegeDao.getCollegeByIdAndNameWithMap(map);

配置:

    <select id="getCollegeByIdAndNameWithMap" resultMap="college">
        select * from college where college_id = #{cid} and college_name = #{cname}
    </select>

List

如果参数的类型为List,配置文件中需要使用#{list[0].field}获得0号下标元素的field字段(如果是简单类型,则不用指定字段)。

   public void addColleges(List<College> colleges);
    <insert id="addColleges">
        insert into college(college_name) values (#{list[0].name});
    </insert>

也可以使用collection[0].field

    <insert id="addColleges">
        insert into college(college_name) values (#{collection[0].name});
    </insert>

数组

数组和List类似,可以使用#{array[0]}#c{ollection[0]}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值