如何从 SQL Query 映射两个变量 - MyBatis
How to map two variables from SQL Query - MyBatis
所以,我在下面有这个 select 查询,它连接两个 table 并检索一个字符串:
<select id =“getAppVerByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.app_ver
FROM
application a
JOIN transaction t on t.txn_id = a.txn_id
WHERE
a.confirmation_id = #{0}
</select>
然后我用它作为模板编写了第二个查询,它几乎相同,但只是从 table 中检索了一个不同的参数。
<select id =“getStepNameByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.step_name
FROM
application a
JOIN transaction t on t.txn_id = a.txn_id
WHERE
a.confirmation_id = #{0}
这两个单独使用都很好,而且它们在程序中的同一位置使用。但是肯定有比这更好的方法吗?我应该能够进行一次查询,然后将结果映射到我想要的,对吗?我应该制作一个结果集,然后能够将它们拉出来吗?也许作为一个 HashMap,我可以通过键检索值?在这种情况下我可以使用 AS 运算符吗?即 "SELECT t.app_ver AS appVersion"?不过,我的想法是将变量传递到查询中,而不是将它们取出来?
如果对此有任何想法,我很想听听。我基本上是在尝试将这些组合成一个查询,我需要能够检索正确的值而不是将 app_ver 分配给 step_name,反之亦然。
干杯
正如您所说,在您的 select
中使用别名 (t.app_ver as appVersion
) 是个不错的主意,但它只是将要映射的列的名称。因此,如果您使用别名作为下一个 t.app_ver as appVersion, t.step_name as stepName
,您的列名将是 appVersion
和 stepName
.
然后,要映射您的结果,您有多种选择将其映射到 map
结构中的想法不错,而且很简单,您只需将结果类型设置为 hashmap
,它会是这样的(它不需要任何 Resultmap
):
哈希图
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
列将是映射中的键,行值是映射中的值。
keyed by column names mapped to row values
因此,要获取您的值,您需要使用列名称作为映射中的键:
String appVersionValue = map.get("appVersion");
结果图
另一种方法是使用您需要映射的属性创建 class,然后创建您的 resultmap
。
结果图定义如下:
resultMap – The most complicated and powerful element that describes
how to load your objects from the database result sets.
你的 class 会是这样的:
public class Application{
private String appVersion;
private String stepName;
//.... getters and setters
}
并且您的结果映射会将列名称映射到 class 属性,指定类型并为此创建 class(在本例中为 Application
):
<resultMap id="applicationResultMap" type="Application">
<result property="appVersion" column="appVersion"/>
<result property="stepName" column="stepName"/>
</resultMap>
(注意,因为在此示例中,列和属性被称为相等,所以在某些情况下,列被称为 app_version,例如 属性 appVersion,因此会有 <result property="appVersion" column="app_version"/>
最后在你的 select 中你指定使用这个 resultmap
:
<select id="selectMethodName" resultMap="applicationResultMap">
select t.app_ver as appVersion, t.step_name as stepName
from your_table
</select>
所以,我在下面有这个 select 查询,它连接两个 table 并检索一个字符串:
<select id =“getAppVerByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.app_ver
FROM
application a
JOIN transaction t on t.txn_id = a.txn_id
WHERE
a.confirmation_id = #{0}
</select>
然后我用它作为模板编写了第二个查询,它几乎相同,但只是从 table 中检索了一个不同的参数。
<select id =“getStepNameByConfId” parameterType=“java.lang.String” resultType=“java.lang.String”>
SELECT t.step_name
FROM
application a
JOIN transaction t on t.txn_id = a.txn_id
WHERE
a.confirmation_id = #{0}
这两个单独使用都很好,而且它们在程序中的同一位置使用。但是肯定有比这更好的方法吗?我应该能够进行一次查询,然后将结果映射到我想要的,对吗?我应该制作一个结果集,然后能够将它们拉出来吗?也许作为一个 HashMap,我可以通过键检索值?在这种情况下我可以使用 AS 运算符吗?即 "SELECT t.app_ver AS appVersion"?不过,我的想法是将变量传递到查询中,而不是将它们取出来?
如果对此有任何想法,我很想听听。我基本上是在尝试将这些组合成一个查询,我需要能够检索正确的值而不是将 app_ver 分配给 step_name,反之亦然。
干杯
正如您所说,在您的 select
中使用别名 (t.app_ver as appVersion
) 是个不错的主意,但它只是将要映射的列的名称。因此,如果您使用别名作为下一个 t.app_ver as appVersion, t.step_name as stepName
,您的列名将是 appVersion
和 stepName
.
然后,要映射您的结果,您有多种选择将其映射到 map
结构中的想法不错,而且很简单,您只需将结果类型设置为 hashmap
,它会是这样的(它不需要任何 Resultmap
):
哈希图
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
列将是映射中的键,行值是映射中的值。
keyed by column names mapped to row values
因此,要获取您的值,您需要使用列名称作为映射中的键:
String appVersionValue = map.get("appVersion");
结果图
另一种方法是使用您需要映射的属性创建 class,然后创建您的 resultmap
。
结果图定义如下:
resultMap – The most complicated and powerful element that describes how to load your objects from the database result sets.
你的 class 会是这样的:
public class Application{
private String appVersion;
private String stepName;
//.... getters and setters
}
并且您的结果映射会将列名称映射到 class 属性,指定类型并为此创建 class(在本例中为 Application
):
<resultMap id="applicationResultMap" type="Application">
<result property="appVersion" column="appVersion"/>
<result property="stepName" column="stepName"/>
</resultMap>
(注意,因为在此示例中,列和属性被称为相等,所以在某些情况下,列被称为 app_version,例如 属性 appVersion,因此会有 <result property="appVersion" column="app_version"/>
最后在你的 select 中你指定使用这个 resultmap
:
<select id="selectMethodName" resultMap="applicationResultMap">
select t.app_ver as appVersion, t.step_name as stepName
from your_table
</select>