哪一个是使用 mybatis select 一些数据的更好方法

Which one is better way to select some data with mybatis

我正在使用 java、mybatis 开发 rest api 服务器。

我对 select 一些数据有一个疑问。 我不知道对于服务器和开发人员来说,哪一种是合理或更好的方法。

请让我听听您的意见。

此数据必须通过方法返回。 第一个是在 mapper.xml 和 mapper.java 中使用了很多 select 方法,如下所示

<select id="a" resultType="Integer" parameterType="ParameterMap">
  select a from a where a=a
</select>
<select id="b" resultType="Integer" parameterType="ParameterMap">
  select b from b where b=b
</select>
<select id="c" resultType="Integer" parameterType="ParameterMap">
  select c from c where c=c
</select>
.....

另一种方法是将 select 句子合并到一个 select 方法中,如下所示。

<select id="abc" resultType="Integer" parameterType="ParameterMap">
  select a 
  ,(select b from b where b=b)
  ,(select c from c where c=c)
   ....
  from a where a=a
</select>

我想连接到数据库可能会占用大量资源,所以第二种方法更好。 然而,另一方面,也许遵循第二种方式很难维护代码。

你认为更好的方法是什么?

如果你能保证结果只有一行,我就这样做

select * from
(
select a from a where a=a
) t1,
(
select b from b where b=b
) t2,
(
select c from c where c=c
) t3

使用更少的资源并且易于维护

性能主题很重要,所以你问这样的问题很好。

您问的是一般性问题,因此答案也将是一般性的。

一般情况下,你无法同时获得良好的性能和维护;因此,通常,您必须选择要遵循的这些驱动程序中的哪一个。通常,灵活性、可维护性、可读性、使用是比性能更可取的驱动因素。

回到你的问题...

单个 select 为存储库的客户端提供良好的维护和自由。如果他们只需要从 B select,他们将只从 B 执行 select。因此,如果客户需要一次 select 个 table,第一个选项是最好的。

请注意,在 servers/applications 的标准配置中,您要么对整个服务方法调用执行一个事务,要么对每个 HTTP 请求执行一个事务,因此多少并不重要 select你在里面做。

第二个选项很难维护,如果客户端需要 select 单个 table,则会降低性能。您将迫使他们 select 他们需要的 table 加上所有其他 table。如果您的场景是客户端每次都需要 select 所有 table(F.ex,当您想将三个 table 映射到一个时,建议使用第二个选项java class)。通常,当您必须 select 几个 table 时,您会在它们之间加入。

第二个选项可能会提高以下性能

  1. 当您在非事务性服务或控制器中使用存储库时,所有 select 都有一个连接,而没有为每个 HTTP 请求启用一个会话。在大多数项目中,每个服务方法调用甚至一个请求都会进行一次事务处理,因此您不会有这样的收获。
  2. 如果您使用连接(而不是子查询),那么数据库应该优化查询并使其尽可能高效
  3. 这是一种批量查询,所以一些操作只由数据库完成一次,所以这里可能会有一些小收获。
  4. 当你使用加入 tables 来解决你的 N+1 问题时。

尽管这可能会提高性能,但与 DBA 使用的标准 SQL 查询优化技术(索引等)相比,收益可能会很小

总结

  1. 定义您更需要什么:维护或性能。
  2. 如果是维护,请将您的存储库设计为 KISS、SOLID、DRY 等
  3. 如果是性能问题,请在实施之前进行一些性能测试以证明第二种解决方案改进了您的查询。
  4. 一般来说,赞成第一种解决方案而不是第二种解决方案。