Mybatis中不同类型的传入参数处理方法

一、基本数据类型

mybatis的xml映射文件传入一个基本类型的参数时,如果只是做普通的sql查询语句,例如select * from ui_test_case where id=#{id} 程序会正确执行。
注意:id为传入参数,这个id可以被任何名称替换。因为id表示的是传入的值,而不是参数名

但如果要实现动态sql或模糊sql查询时,处理则不同
具体实例
传入一个string类型参数,使用if标签实现动态sql功能,在执行<if test="dateTimeType == 'OneDay'.toString()">时,程序报错
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘dateTimeType ’ in ‘class java.lang.String’

解决方式一:必须将传入参数使用“_parameter”代替
当传入参数的个数为 1 时,此方法可奏效

 <select id="statisticalNewAddUICasesByOneDayOrOneWeekOrOneMonth" resultType="java.lang.Integer" parameterType="java.lang.String">
        select count(*) from ui_test_case where 1=1
        <if test="_parameter == 'OneDay'.toString()">
            and date_format(create_time, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d')
        </if>
        <if test="_parameter == 'OneWeek'.toString()">
            and YEARWEEK(date_format(create_time,'%Y-%m-%d')) = YEARWEEK(now());
        </if>
        <if test="_parameter == 'OneMonth'.toString()">
            and date_format(create_time, '%Y-%m') = date_format(now(), '%Y-%m')
        </if>
    </select>

解决方式二:在dao层使用@Param注解

@Mapper
public interface UITestCaseMapper extends BaseMapper<UITestCase> {
    public List<UITestCase> findAllUICasesByModuleId(Integer moduleId);
    public Integer statisticalNewAddUICasesByOneDayOrOneWeekOrOneMonth(@Param("dateTimeType") String dateTimeType);
}

解决方式三:将传入参数组装成Map数据类型
传入Map类型参数,直接通过#{keyname}就可以引用到键对应的值。使用@param注释其实也是将参数组装成一个Map数据结构,和直接传递Map类型参数没有区别
Controller层

  @RequestMapping(value = "/statisticalNewAddUICasesByOneDay", method = RequestMethod.GET)
    public Integer statisticalNewAddUICasesByOneDay(){
        // 将传入参数放入map中
        Map<String, Object> requestParams = new HashMap<String, Object>();
        requestParams.put("dateTimeType", "OneDay");
        return uiTestCaseService.statisticalNewAddUICasesByOneDayOrOneWeekOrOneMonth(requestParams);
    }

Mapper层(Dao层)

@Mapper
public interface UITestCaseMapper extends BaseMapper<UITestCase> {
    public List<UITestCase> findAllUICasesByModuleId(Integer moduleId);
    // 方法参数是map数据类型
    public Integer statisticalNewAddUICasesByOneDayOrOneWeekOrOneMonth(Map<String, Object> requestParams);
}
二、复杂对象类型

传入Java复杂对象类型, sql映射语句中就可以直接引用对象的属性名了,这里的属性名是实实在在的真实的名字,不是随意指定的。

<insert id="insert" parameterType="com.test.testmanagement.model.uitestcasebean.UITestCase">
    insert into ui_test_case (case_module_id, title, creater, create_time, case_type, run_stable, review_status) values (#{caseModuleId}, #{title}, #{creater}, #{createTime}, #{caseType}, #{runStable}, #{reviewStatus})
 </insert>

这里的caseModuleId、title等变量名都是UITestCase类中定义好的

如果要在if标签中判断传入的UITestCase参数,仍然要使用_parameter来引用传递进来的实际参数值,因为传进来的UITestCase对象的名字是任意的。
判断UITestCase对象

<if test="_parameter != null">

如果判断对象的属性,则直接引用属性名字就可以了。

<if test="title != null">
三、集合类型

传递一个List或Array类型的对象作为参数,MyBatis会自动的将List或Array对象包装到一个Map对象中,List类型对象会使用list作为键名,而Array对象会用array作为键名

集合类型通常用于构造IN条件,sql映射文件中使用foreach元素来遍历List或Array元素
Mapper层(Dao层)

User selectUserInList(List<Interger> idlist);

xml文件

<select id="selectUserInList" resultType="User">
  SELECT *
  FROM USER
  WHERE ID in
  <foreach item="item" index="index" collection="list" open="("separator=","close=")" >   		  
      #{item}
  </foreach>
</select>
对象中的集合属性

对于单独传递的List或Array类型,在sql映射文件中映射时,只能通过list或array来引用。但是如果对象有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。
Mapper层(Dao层)

List<User> selectByExample(UserExample example);

xml文件

<foreach collection="oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">

UserExample类有一个属性为oredCriteria,其类型为List,所以在foreach元素里直接用属性名oredCriteria引用这个List即可。
item=”criteria”表示使用criteria这个名字引用每一个List或Array中的集合元素

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值