为什么这个WHERE子句在我的MyBatis映射器+ Spring3应用程序中有效?

时间:2013-12-20 17:18:17

标签: java spring mybatis

我在一个示例中找到了以下代码并且它有效。但我不知道为什么。

我的问题是:

  • 如何将getDrugsWithAlert(int count)的映射分配给#{maxrowcount}(我可以将任何内容放入其中:#{maxrowcount}#{mcount},这似乎无关紧要) ;

  • if test="_parameter != null and _parameter > 0如何/为什么有效?

我的DAO界面如下所示:

@Repository
public interface DrugMasterDao {
    public List<Drug_Master> getDrugsWithAlert(int count);
}

我的mapper文件如下所示:

<mapper namespace="org.mydb.formulary.drugmaster.dao.DrugMasterDao">

    <select id="getDrugsWithAlert" parameterType="int"  
            resultType="org.mydb.formulary.drug_master.model.Drug_Master">

        Select drug_id , drug_name , drug_alert_date, drug_alert_source
          from (select drug_id,drug_name,to_char(drug_alert_datetime,'MM/DD/YYYY') as
                       drug_alert_date ,drug_alert_source
                  from drug_master
                  where drug_status ='A' and length(drug_alert) > 0
                  order by drug_alert_datetime DESC )

       <if test="_parameter != null and _parameter > 0">
          where rownum &lt;= #{maxrowcount}
       </if>
    </select>
 </mapper>

1 个答案:

答案 0 :(得分:1)

您的查询已声明parameters,在执行时将替换为相应的值。参数名称是您发送给查询的对象的属性。

但是你的映射有parameterType="int"这是一个简单的值。该值将完全替换参数。如果您的参数类型是Map或某种类型的对象,则名称变得很重要,因为它们分别命名对象的键或属性。

因为您有一个int,名称不重要,可以是#{maxrowcount}#{mcount}#{whatever}。这就是第一部分有效的原因。

对于第二部分来说,它更棘手,因为_parameterundocumented。 MyBatis是一个很好的框架,但遗憾的是,缺少文档部分。输入参数存储在映射上下文中的键_parameter下。在这种情况下,它是您的int参数。这就是第二部分的工作原理。