在不使用复杂对象的情况下将多个参数传递给SELECT

时间:2012-02-16 09:00:43

标签: ibatis mybatis

我正在尝试将startSequenceIdstopSequenceIdorderNumber传入SQL地图,但是,我不希望使用类型化对象,即parameterType="com.abc.Order"我能这样做吗?

<select id="getSequenceIdByOrderNumber" parameterType="?" resultType="int">
    select *
    from log
    where seq_id
    between #{startSequenceId} and #{stopSequenceId}
    and order_no = #{orderNumber}
    and rownum = 1
</select>

5 个答案:

答案 0 :(得分:15)

您可以使用内置的parameterType'map',例如

Map<String, Object> parms = new HashMap<String, Object>();
parms.put("name", "abc");
parms.put("phone", "123");
parms.put("email", "123@email.com");

List<Contact> list = myBatis.selectList("getContacts",parms);


<!-- in xml mapper -->
<select id="getContacts" parameterType="map" resultMap="Contact">
  SELECT * FROM CONTACT 
  WHERE CONTACT_NAME = ${name}
  AND CONTACT_PHONE = ${phone}
  AND CONTACT_MAIl = ${email}
</select>

答案 1 :(得分:7)

@Chin我会用一个简单的例子发布我输入的内容,尽管你找到了你想要的东西。我使用iBatis 2.3.4的例子

<select id="retrieveTestXXX" parameterClass="java.util.Map" resultClass="java.lang.Integer">
    SELECT
    example_table.id
    FROM example_table
    WHERE example_table.xx_id = #testId# AND example_table.xx_id = #test2Id#
</select>

希望这会有所帮助。

答案 2 :(得分:5)

在MyBatis 3中,您可以在mapper类(接口)方法中使用@Param注释:

public getSequenceIdByOrderNumber(@Param("seqId") int sequenceId,@Param("orderId") int orderNo);

然后,您可以在SQL中使用#{seqId}#{orderId},而无需使用parameterType属性。

答案 3 :(得分:-1)

无法评论,

  

找到答案,谢谢。

     

http://code.google.com/p/mybatis/wiki/HowToSelectMultipleParams

此链接已损坏,目前正确的是https://github.com/mybatis/mybatis-3/wiki/FAQ#how-do-i-use-multiple-parameters-in-a-mapper

从此wiki复制+粘贴

  

Java反射不提供了解方法参数名称的方法,因此MyBatis默认命名为:param1,param2 ...   如果你想给他们一个名字,请用这种方式使用@param注释:

import org.apache.ibatis.annotations.Param;
public interface UserMapper {
   User selectUser(@Param("username") String username, @Param("hashedPassword") String hashedPassword);
}
  

现在您可以在xml中使用它们,如下所示:

<select id=”selectUser” resultType=”User”>
    select id, username, hashedPassword
    from some_table
    where username = #{username}
    and hashedPassword = #{hashedPassword}
</select>

TL;博士

在接口中声明方法而不是标准java结构

Type methodName (
    ParamType1 paramName1,
    ParamType2 paramName2,
    … ); (this is interface so no method body)

使用(添加@Param)

Type methodName (
    @Param("name1 available in xml") ParamType1 paramName1,
    @Param("name2 available in xml") ParamType2 paramName2,
    …); (this is still interface so no method body)

答案 4 :(得分:-2)