java中一张表必须有个对应的dao吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中一张表必须有个对应的dao吗相关的知识,希望对你有一定的参考价值。

DAO 封装 SQL 语句,而不是表。
一个 DAO 方法应对应一个 SQL 语句。所以理论上一个表一个 DAO,所有对其操作都放在里面。
DAO 并不是一个具体的类,所有封装 SQL 语句的东西都可以视为 DAO,比如 MyBatis 的 Mapper,和 Spring 的 Repository。
多表连接的情况,DAO 方法返回什么你就放在哪个类里面。
参考技术A

首先得理解dao到底是干嘛的,直译的话是Data access object, 数据访问对象。 在代码层面上来理解,往往是应用程序与数据库进行通信交互的一个类,如果你的应用程序需要操作这张表,那么针对这张表写一个对应的dao是可以的。

public class UserDao 
    public User queryUser() // 从数据库中查找User
    public int deleteUser() // 从数据库中删除User
    public int updateUser() // 从数据库中更新User
    public int insertUser() // 从数据库中增加User

追问

如果对两张表联合查询,那这个dao层应该怎么办。

如果对两张表联合查询,那这个dao层应该怎么办。

追答

看最终出来的主要数据是哪个对象的,如果是User对象,就写在UserDao, 这些不需要纠结,具体写在哪里,得看具体的业务

看最终出来的主要数据是哪个对象的,如果是User对象,就写在UserDao, 这些不需要纠结,具体写在哪里,得看具体的业务

追问

如果对两张表联合查询,那这个dao层应该怎么办。

本回答被提问者采纳
参考技术B 我认为不必这样。数据库中的表无非就这么几种:实体对应的表,表示实体之间关系的表。我最近在做一个项目,我的设计方案是:实体对应的表单独写一个DAO类。至于实体之间的关系表,我会根据具体的情况来决定。举个例子:在我的项目中有一个Account实体表(代表账号)和Article实体表(代表博客),它们之间存在这一个多对多的关系:收藏。于是我建立了一个ArticleCollection关系表。项目中有很多这样的关系表,为了不让Spring容器中的对象过多,我决定将对ArticleCollection的CRUD操作放在AccountDao和ArticleDao其中之一。那么到底该选择谁呢?考虑到项目中除了Article实体表之外,还有Resource、Course等等多个实体表。这些都与Account表存在着多对多的关系。如果对这些关系表的操作都放在AccountDao中,势必会导致AccountDao过于庞大。于是我选择了将对ArticleCollection等这些与Account表关联的关系表的操作放在了对与Account表对应的另一个实体表对应的DAO中。 参考技术C 规范的写法是这样的

联合所有但只保留 T-SQL 中一张表的重复项

【中文标题】联合所有但只保留 T-SQL 中一张表的重复项【英文标题】:Union All but keep only duplicates from one table in T-SQL 【发布时间】:2021-05-28 11:33:35 【问题描述】:

我有两张表要合并。我只需要保留两个表之一的重复项。我试图找到它,但在任何地方都找不到。希望有人能帮忙。

例如: 表_1:

ID Product Amount
1 A 10
2 B 10
3 C 10

表_2:

ID Product Amount
3 C 9
4 A 100
5 B 100

想要的结果:

ID Product Amount
1 A 10
2 B 10
3 C 9
4 A 100
5 B 100

因此,请始终使用 table_2 中的重复项。在这个例子中,ID 3 是重复的,所以使用 table_2 的副本,数量为 9。

如何用 T-SQL 实现这一点?我使用了下面的代码:

Select * from Table_1 where Table_1.id != Table_2.id
Union All
Select * from Table_2 

但随后我收到错误消息: '无法绑定多部分标识符“Table_2.ID”。'

【问题讨论】:

看我的回答。这个概念非常直接,因为当我们需要两个表的不同行时,我们使用联合。当我们使用所有记录时,我们使用 Union all。 还有什么比:***.com/a/67740103/8483417更简单的 【参考方案1】:

使用not exists:

Select t1.*
from Table_1 t1
where not exists (select 1 from table_2 t2 where t2.id = t1.id)
Union All
Select t2.*
from Table_2 t2;

【讨论】:

【参考方案2】:

试试这个:

SELECT  T1.*
FROM    @Table1 T1
WHERE   T1.ID NOT IN (SELECT ID FROM @Table2)
UNION
SELECT  T2.*
FROM    @Table2 T2

【讨论】:

还有一个问题,如果我需要添加一列来计算每个产品的数量?产品的金额/计数总和(对于 A,它是 (100 + 10) / 2 )如何将其包装在 T-SQL 中? 选择产品,数量 = SUM(1),金额 = SUM(Amount) FROM (***) GROUP BY Product。在括号之间,将 *** 替换为先前的答案/脚本。 @xris23 你最好使用UNION ALL 而不是UNION (其他答案证明了这一点)。 UNION 隐式地将DISTINCT 应用于最终数据集,这会带来性能成本,【参考方案3】:

我假设你想要的是EXISTS

SELECT T1.ID,
       T1.Product,
       T1.Amount
FROM dbo.Table1 T1
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Table2 T2
                  WHERE T1.ID = T2.ID)
UNION ALL
SELECT T2.ID,
       T2.Product,
       T2.Amount
FROM dbo.Table2 T2;

不过,FULL OUTER JOIN 也可以工作如果ID 在两个表中都是唯一的:

SELECT ISNULL(T2.ID,T1.ID) AS ID,
       ISNULL(T2.Product,T1.Product) AS Product,
       ISNULL(T2.Amount,T1.Amount) AS Amount
FROM dbo.Table1 T1
     FULL OUTER JOIN dbo.Table2 T2 ON T1.ID = T2.ID;

【讨论】:

【参考方案4】:

Union 会给你结果。 Union 将始终返回唯一值。如果你使用 union all 你会得到所有的重复。您的答案是使用 union all。

  SELECT 
  B.ID
 ,B.Product
 ,B.Amount
 FROM
   (

    SELECT 
      A.ID
     ,A.Product
     ,A.Amount
     ,ROW_NUMBER() over (Partition BY  ID, Product order by  Amount ASC) AS [row_num]
    FROM
    (
       SELECT 
          tb_1.*
       FROM tb_1
       UNION ALL 
      SELECT 
        tb_2.* 
      FROM tb_2

     ) AS A
  ) AS B
  WHERE B.[row_num] = 1

【讨论】:

以上是关于java中一张表必须有个对应的dao吗的主要内容,如果未能解决你的问题,请参考以下文章

[Mysql]备份同库中一张表的历史记录 insert into ..select

SQL如果建立子表

java中javabean的辅助类 怎么使用

dao层接口与xml文件名必须一样吗

试图比较 Lua 中一张表的所有条目

java项目开发在多表情况下的DAO设计问题