JavaJDBC-ResultSet和封装。很多字段,太多的setter和getter无法管理。有更好的技术吗?

JavaJDBC-ResultSet和封装。很多字段,太多的setter和getter无法管理。有更好的技术吗?,java,database,jdbc,encapsulation,setter,Java,Database,Jdbc,Encapsulation,Setter,我正在编写一个java程序,使用JDBC和ResultSet读取数据库文件并在gui屏幕上显示记录。数据库文件有数百个字段。这意味着,如果我在两个类文件中分离gui和数据库处理,并使用封装,我最终会得到数百个setter和getter方法(每个字段一个)。有更好的方法吗 请注意,我已经为此使用了setter和getter,并发现它会变得非常难以管理。我还看到过一些文章,它们提倡避免使用setter和getter,但没有找到一个具体的数据库管理技术示例 感谢您的帮助。一种方法是将每一行存储到地图中

我正在编写一个java程序,使用JDBC和ResultSet读取数据库文件并在gui屏幕上显示记录。数据库文件有数百个字段。这意味着,如果我在两个类文件中分离gui和数据库处理,并使用封装,我最终会得到数百个setter和getter方法(每个字段一个)。有更好的方法吗

请注意,我已经为此使用了setter和getter,并发现它会变得非常难以管理。我还看到过一些文章,它们提倡避免使用setter和getter,但没有找到一个具体的数据库管理技术示例


感谢您的帮助。

一种方法是将每一行存储到
地图中

为此,可以使用
ResultSetMetaData
(key=column name)检索列名,也可以使用列索引(key=index)检索列值<代码>结果集
可以用两种方法处理它


然后,您的结果将看起来像一个
列表
结构。

如前所述,如果您的数据库实际上有数百个字段,那么在设计过程中出现了一些问题

在这种情况下,我会做/建议的是-尝试对数据库中的任何内容进行分类。例如,假设你有这些列

ID | FirstName | MiddleName | Surname | Gender | Age | HairColor | EyeColor | BuildingNO | StreetName | City | State | PostCode | Country | CarMake | CarPlate | etc...
我将为Person、Address、Car创建一个类,并将查询放入这些类中,这些类将从与这个特定对象相关的数据库中提取信息

所以在课堂上我会有这样的东西

public class Person {
   private FirstName;
   private MiddleName;
   private Surname; 

   appropriate query here and plug the whole object into a list - so you will end up with a List of Objects 'Person' with relevant data in it. 
   /* Setters and Getters */
其他类地址也一样

public class Address {


public class Car {

希望你明白我的意思

我已经按照狮子座的建议实施了地图策略。虽然这不是一个一致的解决方案,但我可以立即使用它,我确实认为这是一个很好的替代方案。它不仅允许消除过多的setter和getter,还可以创建ArrayList(或任何其他集合)来动态保存每个字段。无需知道每个列表的实例名称,因为您可以通过映射的键(键=列名)访问它们,因此无需为每个字段编码列表。我真的认为这是一大优势。然后可以将每个字段直接迭代为字符串(或任何其他类型),从而使代码更精简

例如:

类LoadBigFile连接到数据库并将文件的内容加载到映射

类似这样的情况(请注意:这只是一个非常模糊的例子来说明可以做什么):

注意:我不会讨论迭代器,因为它与主题无关。我所能说的就是它是有效的

即使我还在研究其他技术,比如ORM和JPA,我也会在发展技能和学习更复杂的方法时尝试map方法


谢谢大家。我希望这个问题能帮助其他java爱好者。

为什么数据库表中有数百列?是否需要规范化?如果表实际上有“数百个字段”,那么在设计数据库时就真的有人搞砸了。如果不能更改模式,至少不要将表映射到唯一的Java类。我确信一些列应该分组在不同的类中(比如User-Address…),你考虑过使用Hibernate吗?哇!结果很好。谢谢你的意见。我会尽快详细考虑所有建议。现在我要补充的是,我没有设计数据库,也不能更改原始文件(它来自IBMAS400机器-Cobol/RPG语言)。此外,文件中的所有字段都是必需的,并且有很多记录。将文件拆分为较小的文件会带来性能问题,因为JDBC打开不同文件的时间似乎比读取一个大文件的时间要长。创建新类不会有同样的问题,必须管理太多的setter和getter(在不同的类中)?很有趣。让我看看我是否明白。我将把结果集加载到一个映射(它是私有的),为该映射创建一个setter和一个getter,并使用另一个类中的列索引(key=index)访问数据?谢谢你的回答。顺便说一句,@user3618243这样做,它将首先工作良好,然后与未来的维护问题作斗争。一个更好的选择是使用ORM框架来缓解这些问题。@LuiggiMendoza当然ORM更适合维护,但我在这里假设用户有一个包含数百列的表,可能是由某个ERP生成的(所以这不是他/她的错,它没有规范化-也许他/她就是无法修复)。对于数百列,我并不认为如果有200个getter+setter,那么会有多大的区别,因为没有人会编写100个getter,每个人都会使用反射。映射将以同样的方式工作,而不会产生反射开销。您可以用jpa编写自己的列映射器来简化这一过程,并且这些列的getter/setter很少。此外,我已经使用了这两种方法,使用数百个getter/setter比使用Map方法要好得多。除此之外,他/她必须通过反射在列上迭代。对于更复杂的应用程序/如果要在多个地方使用,ORM可能是一个不错的选择。但是,如果他/她只是想要一个快速而肮脏的解决方案,只需从数据库中获取一次数据,就可以进行一些本地化的使用,我认为Map已经足够好了。再一次,问题是如何避免能手和二传手。对我来说,他/她可以在编译时使用map或交织字节码来生成这些getter。这是我的第一个冲动,我也尝试过类似的方法。在我遇到性能问题之前,一切看起来都很好。JDBC,至少在本例中是这样(JDBC.as400),访问文件(open)需要更长的时间/
    Class LoadBigFile{

       private HashMap<String, ArrayList<String>> filemap = new HashMap<String,ArrayList<String>>();

       ////// ...Code to connect to database and load the file contents into the map

       ////// Setter and getter for the map:

       public void setFileMap(HashMap<String, ArrayList<String>> filemap){this.filemap=filemap;}
       public HashMap<String, ArrayList<String>> getFileMap(){return this.filemap;}

    }
      LoadBigFile loadBigFile = new LoadBigFile();
      String customer = loadBigFile.getFileMap().get("CUSTOMER").get(iterator));