gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:02:51 24 4
gpt4 key购买 nike

我有问题。我没有创建 MyBatis 配置。我听说没有它可能会起作用。我调用了 Java 接口(interface),例如:InterfaceDAO.java 和 myBatis mapper InterfaceDAO.xml

接口(interface)DAO.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);
}

接口(interface)DAO.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 映射器来获取我想要的数据。 income 参数可以为空,或者列表中可以有多个值。

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

我正在使用 MyBatis 和 Postgres 数据库。

最佳答案

首先你可以删除#{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 - 与 Java 接口(interface)一起使用的 myBatis xml 映射器文件管理器 - 动态 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com