一、基本数据类型
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中的集合元素