gpt4 book ai didi

mybatis - 重用动态sql片段

转载 作者:行者123 更新时间:2023-12-02 18:30:17 24 4
gpt4 key购买 nike

嘿,我正在开发一个 Primefaces 应用程序,我选择 Mybatis 作为持久层。 .

这就是常规 sql 在我的映射器中的样子:

<select id="getAllTransportUnit" resultMap="TransportUnitMap">
SELECT * FROM SSLS_GUI.VW_TU
<if test="( hasFilters == 'yes' ) and ( parameters != null )">
<where>
<foreach item="clause" collection="parameters" separator=" AND "
open="(" close=")">
UPPER(${clause.column}) ${clause.operator} #{clause.value}
</foreach>
</where>
</if>
<if test="sort == 'true'">
ORDER BY ${sortField}
<if test="sortOrder == 'DESC'"> DESC</if>
<if test="sortOder == 'ASC'"> ASC</if>
</if>
</select>

我的几乎所有查询都使用从 <if test...> 开始的动态 sql 部分。是否可以将其放入单独的文件中,然后在我的所有查询中重复使用它?

最佳答案

有多种选项可以重用 SQL 片段。

SQL 片段和包含

第一个是使用include。创建单独的映射器 Common.xml:

<mapper namespace="com.company.project.common">
<sql id="orderBy>
<if test="sort == 'true'">
ORDER BY ${sortField}
<if test="sortOrder == 'DESC'"> DESC</if>
<if test="sortOder == 'ASC'"> ASC</if>
</if>
</sql>


<sql id="filters">
<if test="( hasFilters == 'yes' ) and ( parameters != null )">
<where>
<foreach item="clause" collection="parameters" separator=" AND "
open="(" close=")">
UPPER(${clause.column}) ${clause.operator} #{clause.value}
</foreach>
</where>
</if>
</sql>
</mapper>

并在其他映射器中使用它MyMapper.xml:

<select id="getAllTransportUnit" resultMap="TransportUnitMap">
SELECT * FROM SSLS_GUI.VW_TU
<include refid="com.company.project.common.filters"/>
<include refid="com.company.project.common.orderBy"/>
</select>

为了避免在每个包含中重复命名空间,您可以在 MyMapper.xml 中创建快捷方式片段:

<sql id="orderBy">
<include refid="com.company.project.common.orderBy"/>
</sql>

<select id="getAllTransportUnit" resultMap="TransportUnitMap">
SELECT * FROM SSLS_GUI.VW_TU
<include refid="orderBy"/>
</select>

Mybatis-velocity宏

另一个可能的选择是使用 mybatis scripting 。使用mybatis-velocity脚本引擎,您可以定义速度宏并像这样使用它。

Commons.xml中:

<sql id="macros"
#macro(filters)
#if ( $_parameter.hasFilters )
#repeat( $_parameter.parameters $clause "AND" " (" ")" )
${clause.column} ${clause.operator} @{clause.value}
#end
#end
#end

#macro(order_by)
..
#end
</sql>

MyMapper.xml中:

<select id="getAllTransportUnit" resultMap="TransportUnitMap">
<include refid="macros"/>
SELECT * FROM SSLS_GUI.VW_TU
#filters()
#order_by()
</select>

通过 sql 片段包含宏并不是重用宏的最干净的方法。这只是一个如何使用它的想法。

更好的选择是配置 mybatis-velocity 并指定可用的全局宏。在这种情况下,不需要包含 macros 代码片段,结果查询将如下所示:

<select id="getAllTransportUnit" resultMap="TransportUnitMap">
SELECT * FROM SSLS_GUI.VW_TU
#filters()
#order_by()
</select>

关于mybatis - 重用动态sql片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25055276/

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