java - myBatis xml 映射器文件管理器与 Java 接口(interface)一起使用 - 动态 SQL 查询

标签 java postgresql spring-mvc mybatis xmlmapper

我有问题。我没有创建 MyBatis 配置。我听说没有它也可以工作。我有 Java 接口(interface),例如: InterfaceDAO.java 和 myBatis 映射器 InterfaceDAO.xml

InterfaceDAO.java:

@Mapper
public interface InterfaceDAO extends ApiConsumerDAO, ServiceDAO {

@Select("SELECT * FROM interface WHERE id = #{interfaceId}")
@Results({
        @Result(property = "id", column = "id"),
        @Result(property = "date", column = "date"),
        @Result(property = "apiConsumer", column = "api_consumer", one = @One(select = "getApiConsumer")),
        @Result(property = "service", column = "service", one = @One(select = "getService")),
        @Result(property = "counterStatus", column = "counter_status"),
        @Result(property = "ratingProcessId", column = "rating_process_id"),
        @Result(property = "value", column = "value"),
        @Result(property = "createdDate", column = "created_date"),
        @Result(property = "modifiedDate", column = "modified_date")
})
InterfaceObject getInterfaceDAO(@Param("interfaceId") Integer interfaceId);


List<InterfaceObject > getInterfaceDAOList(@Param("apiConsumerIdsList") List<Integer> apiConsumerIdsList,
                                       @Param("serviceIdsList") List<Integer> serviceIdsList,
                                       @Param("dateFrom") Date dateFrom,
                                       @Param("dateTo") Date dateTo,
                                       @Param("status") InterfaceDAO.Status status);
}

InterfaceDAO.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="pl.net.manager.dao.InterfaceDAO">
    <select id="getInterfaceDAOList" parameterType="map" resultType="List">
        SELECT * FROM interface WHERE
        <if test="apiConsumerIdsList != null">
            #{apiConsumerIdsList} IS NULL OR api_consumer IN (#{apiConsumerIdsList,jdbcType=ARRAY})
        </if>
        <if test="serviceIdsList != null">
            #{serviceIdsList} IS NULL OR service IN (#{serviceIdsList,jdbcType=ARRAY})
        </if>
        <if test="status != null">
            #{status} IS NULL OR status IN (#{status,jdbcType=ARRAY})
        </if>
        <if test="dateFrom != null">
            #{dateFrom} IS NULL OR date &gt;= #{dateFrom,jdbcType=DATE}
        </if>
        <if test="dateTo != null">
            #{dateTo} IS NULL OR date &lt;= (#{dateTo,jdbcType=DATE})
        </if>
    </select>
</mapper>

因此,第一个名为 getInterfaceDAO 的方法示例工作正常。但第二个调用: getInterfaceDAOList 更复杂,并且与第一个的工作方式不同。这就是为什么我希望这个特定的方法使用 xml 映射器来获取我想要的数据。收入参数可以为空,或者列表中可以有多个值。

您遇到过这样的问题吗?您知道解决这个问题的最佳方法吗?这是我第一次接触这个。

我正在使用 MyBatis 和 Postgres DB。

最佳答案

首先你可以删除#{apiConsumerIdsList} IS NULL和类似的情况,因为您已经检查 != null在你的if条件就足够了。

其次,对于IN您必须使用 foreach 子句构造如下图:

<foreach item="item" index="index" collection="apiConsumerIdsList" 
    open="(" separator="," close=")">
  #{item}
</foreach>

以上内容适用于所有IN条款。

表达式 #{dateFrom,jdbcType=DATE}可以简单地写为#{dateFrom:DATE}

然后来到WHERE子句,如果 if 的倍数条件满足,那么你的WHERE由于缺少 AND ,子句将被破坏,为此您可以使用 <where>标记类似

<where>
    <if test="apiConsumerIdsList != null">
    api_consumer IN <foreach item="item" collection="apiConsumerIdsList" 
            open="(" separator="," close=")">
          #{item}
        </foreach>
    </if>
    <if test="serviceIdsList != null">
        AND service IN <foreach item="item" collection="serviceIdsList" 
                open="(" separator="," close=")">
              #{item}
            </foreach>(#{serviceIdsList,jdbcType=ARRAY})
    </if>
    <if test="status != null">
        AND status IN <foreach item="item" collection="status" 
                open="(" separator="," close=")">
              #{item}
            </foreach>
    </if>
    <if test="dateFrom != null">
        AND date &gt;= #{dateFrom:DATE}
    </if>
    <if test="dateTo != null">
        AND date &lt;= (#{dateTo:DATE})
    </if>
</where>

关于java - myBatis xml 映射器文件管理器与 Java 接口(interface)一起使用 - 动态 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387612/

相关文章:

java - 在 Vb.net 中使用 If-Statement 作为 For-Loop 的测试条件

java - jfree 图表 org.jfree.chart.plot.CategoryPlot 无法转换为 org.jfree.chart.plot.XYPlot

json - 任何人都可以帮助为下面的链接修改光标

java - Spring MVC 验证不显示错误消息

java - Spring Security 错误凭证异常

java - Java程序无法编译: missing return statement

java - 无法读取用其他语言创建的 SQLite 数据库

postgresql - 如何将 REAL 类型舍入为 NUMERIC?

mysql - Postgresql 中用户权限的最佳实践?

java - 无法读取架构文档 'http ://www. springframework.org/schema/beans/spring-beans.xsd