当只向xxxMapper.xml文件中传递一个参数时,可以简单的用“_parameter”来接收xxxMapper.java传递进来的参数,并代入查询,比如说这样:

(1)xxxMapper.java文件中这样定义:

List<String>selectAllAirportCode(Booleanmapping);

(2)这时在对应的xxxMapper.xml文件中可以使用“_parameter”来接收这个参数:

<selectid="selectAllAirportCode"resultType="java.lang.String"parameterType="java.lang.Boolean">selectDEPARTURE_AIRPORTfromUSR_AIR_LINEunionselectARRIVAL_AIRPORTfromUSR_AIR_LINE<iftest="_parameter==true">unionselectREL_DEPARTURE_AIRPORTfromUSR_AIR_LINEunionselectREL_ARRIVAL_AIRPORTfromUSR_AIR_LINE</if></select>

但是,如果在xxxMapper.java文件中传递进来多个参数,就不能使用上面这种形式来接收参数,这时可以有两种方案来解决这个问题:

一 向xml文件中传递进去一个Map<String, Object>集合,然后xml文件中就可以正常使用Map集合中的各个参数了。具体实例如下:

(1)xxxMapper.java文件中这样定义:

List<Airline>findAll(Map<String,Object>parms);

(2)在用到上面定义的具体实现类中给Map传参:

publicList<Airline>findAll(PageInfopage,Airlineairline){HashMap<String,Object>params=newHashMap<String,Object>();params.put("page",page);params.put("airline",airline);returnairlineMapper.findAll(params);}

(3)此时对应的xxxMapper.xml文件使用“java.util.Map”来接收这个Map集合:

<sqlid="sqlfileders"><bindname="fileders"value="#{'id':'ID','departureAirport':'DEPARTURE_AIRPORT','relDepartureAirport':'REL_DEPARTURE_AIRPORT','arrivalAirport':'ARRIVAL_AIRPORT','relArrivalAirport':'REL_ARRIVAL_AIRPORT','popStatus':'POP_STATUS','status':'STATUS','creator':'CREATOR','createTime':'CREATE_TIME'}"/><bindname="javapropertys"value="#{'ID':'id','DEPARTURE_AIRPORT':'departureAirport','REL_DEPARTURE_AIRPORT':'relDepartureAirport','ARRIVAL_AIRPORT':'arrivalAirport','REL_ARRIVAL_AIRPORT':'relArrivalAirport','POP_STATUS':'popStatus','STATUS':'status','CREATOR':'creator','CREATE_TIME':'createTime'}"/></sql><selectid="findAll"resultMap="BaseResultMap"parameterType="java.util.Map"><![CDATA[selectx.*from(selectz.*,rownumnumbersfrom(]]>select<includerefid="Base_Column_List"/>fromUSR_AIR_LINE<where><iftest="airline.departureAirport!=null">DEPARTURE_AIRPORT=#{airline.departureAirport}</if><iftest="airline.arrivalAirport!=null">andARRIVAL_AIRPORT=#{airline.arrivalAirport}</if><iftest="airline.relDepartureAirport!=null">andREL_DEPARTURE_AIRPORT=#{airline.relDepartureAirport}</if><iftest="airline.relArrivalAirport!=null">andREL_ARRIVAL_AIRPORT=#{airline.relArrivalAirport}</if><iftest="airline.popStatus!=null">andPOP_STATUS=#{airline.popStatus}</if><iftest="airline.status!=null">andSTATUS=#{airline.status}</if></where><iftest="page.sortName!=null"><includerefid="sqlfileders"/><bindname="orderfield"value="#this.fileders[page.sortName]"/>orderby${orderfield}${page.sortOrder}</if><![CDATA[)zwhererownum<]]>#{page.to}<![CDATA[)xwherex.numbers>=]]>#{page.from}</select>

注:上面的实例实现的是分页查询数据。我们可以发现使用Map来传递参数这种形式并不好,因为这样使得在接口中只有一个Map参数,其他人进行维护的时候并不清楚到底需要向这个Map里面传递什么参数进去

二通过给参数添加@Param注解来解决问题:

(1)给xxxMapper.java文件的方法中的参数添加@Param注解,这个注解中的值对应xml文件中使用到的参数名称:

AirlineselectEffectiveAirline(@Param("departureAirport")StringdepartureAirport,@Param("arrivalAirport")StringarrivalAirport,@Param("status")BigDecimalstatus);

(2)此时xxxMapper.xml文件中对应的地方就可以正常使用在@Param注解中对应的值了:

<selectid="selectEffectiveAirline"resultMap="BaseResultMap">select<includerefid="Base_Column_List"/>fromUSR_AIR_LINE<where><iftest="departureAirport!=null">DEPARTURE_AIRPORT=#{departureAirport}</if><iftest="arrivalAirport!=null">andARRIVAL_AIRPORT=#{arrivalAirport}</if><iftest="status!=null">andSTATUS=#{status}</if></where></select>

注:需要注意的是if条件判断中的参数和在SQL语句中写法是不一样的,if判断中的变量是没有添加#{ }的