Java 将接收到的数据保存在文本文件中

Java 将接收到的数据保存在文本文件中,java,jpa,mapstruct,Java,Jpa,Mapstruct,我想知道在以下情况下,将一些数据持久化到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我以文本文件形式接收结构为key=value对的信息。这使得该文件易于解析。钥匙的顺序总是一样的,而且有一个清晰的图案。请查看此文件的一部分: 最大值=10 最小值=9 乌克兰格里夫纳=9 WTR=9 我希望该文件中的信息保存到数据库中。为此,我创建了一个JPA实体类。这里没有花哨的东西,只有字段和getter/setter。这里是我的问题:我可以用什么方法在那个实体类中设置字段?我

我想知道在以下情况下,将一些数据持久化到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我以文本文件形式接收结构为
key=value
对的信息。这使得该文件易于解析。钥匙的顺序总是一样的,而且有一个清晰的图案。请查看此文件的一部分:

最大值=10

最小值=9

乌克兰格里夫纳=9

WTR=9


我希望该文件中的信息保存到数据库中。为此,我创建了一个
JPA实体
类。这里没有花哨的东西,只有字段和getter/setter。这里是我的问题:我可以用什么方法在那个实体类中设置字段?我可以通过阅读文本文件然后使用setter手动完成。这将是一个可行的选择,因为文件中的密钥不多(最多十个)。在未来,它可能会改变人们的想法。我考虑的第二个选项是使用映射库,如<代码> MAPSTRUT> <代码>自动完成。我已经有了
enum
,其中的字段与我收到的文件中的键相同。但是,到目前为止,我看到的每个示例都使用了两个类。

如果它是一个键值对,并且您知道它是固定的,那么使用JSON解析器如何

大概是这样的:

Object obj = new JSONParser().parse(new FileReader("MyJson.json"));
JSONObject jo = (JSONObject) obj;
String firstName = (String) jo.get("myValue");
或者如果你有一个数组,那么

JSONArray ja = (JSONArray) jo.get("myValues");

如果它是一个键值对,并且您知道它是固定的,那么使用JSON解析器怎么样

大概是这样的:

Object obj = new JSONParser().parse(new FileReader("MyJson.json"));
JSONObject jo = (JSONObject) obj;
String firstName = (String) jo.get("myValue");
或者如果你有一个数组,那么

JSONArray ja = (JSONArray) jo.get("myValues");

如果没有任何框架,假设JPA是您的ORM,您可以逐行读取文件并将其映射到实体构造函数中:

foo.txt

key=value
FooService.java

EntityManager em;
...

@Transactional
public Collection<FooJpa> save() throws IOException {
   Collection<FooJpa> foos;
   try (Stream<String> lines = Files.lines(Paths.get("foo.txt"))) {
      foos = lines
        .map(FooJpa::new)
        .collect(Collectors.toList());
   } 
   return em.persist(foos); // returns attached version
}
@Entity
public class FooJpa {
   ...
   private final YourEnum key;
   private final YourObject value;

   public FooJpa(String line) {
     String[] rawValues = line.split("=");
     key = yourMapmethod(rawValues[0]);
     value = yourMapmethod2(rawValues[1]);
     ...
   }

如果没有任何框架,假设JPA是您的ORM,您可以逐行读取文件并将其映射到实体构造函数中:

foo.txt

key=value
FooService.java

EntityManager em;
...

@Transactional
public Collection<FooJpa> save() throws IOException {
   Collection<FooJpa> foos;
   try (Stream<String> lines = Files.lines(Paths.get("foo.txt"))) {
      foos = lines
        .map(FooJpa::new)
        .collect(Collectors.toList());
   } 
   return em.persist(foos); // returns attached version
}
@Entity
public class FooJpa {
   ...
   private final YourEnum key;
   private final YourObject value;

   public FooJpa(String line) {
     String[] rawValues = line.split("=");
     key = yourMapmethod(rawValues[0]);
     value = yourMapmethod2(rawValues[1]);
     ...
   }

你提到有一个密钥的枚举。您可以使用它来确保每个枚举值都对应一个set方法:

enum Key { /* ... */ }

Map<Key, Function<MyEntity, Integer>> entitySetMethods =
    new EnumMap<>(Key.class);

entitySetMethods.put(Key.MAX_WM, MyEntity::setMaxWM);
entitySetMethods.put(Key.MIN_WP, MyEntity::setMinWP);
entitySetMethods.put(Key.UAM,    MyEntity::setUAM);
entitySetMethods.put(Key.WTR,    MyEntity::setWTR);

if (!entitySetMethods.keySet().containsAll(EnumSet.allOf(Key.class))) {
    throw new RuntimeException(
        "Programmer error: Not every Key is mapped to an entity property!");
}

// ...

Map<Key, Integer> parsedValues = parseKeysAndValues(file);

for (Map.Entry<Key, Integer> entry : parsedValues.entrySet()) {
    Key key = entry.getKey();
    Integer value = entry.getValue();
    entitySetMethods.get(key).apply(value);
}
enum键{/*…*/}
映射entitySetMethods=
新的枚举映射(Key.class);
entitySetMethods.put(Key.MAX_WM,MyEntity::setMaxWM);
entitySetMethods.put(Key.MIN_WP,MyEntity::setMinWP);
entitySetMethods.put(Key.UAM,MyEntity::setUAM);
entitySetMethods.put(Key.WTR,MyEntity::setWTR);
如果(!entitySetMethods.keySet().containsAll(EnumSet.allOf(Key.class))){
抛出新的运行时异常(
“程序员错误:并非每个键都映射到实体属性!”);
}
// ...
Map parsedValues=parseKeysAndValues(文件);
for(Map.Entry:parsedValues.entrySet()){
Key=entry.getKey();
整数值=entry.getValue();
entitySetMethods.get(键)、apply(值);
}
使用方法引用而不是反射的优点是:

  • 在编译时检查它们的存在性、参数类型和返回类型
  • 他们更快
  • 它们可以在运行时进行优化

您提到有一个密钥枚举。您可以使用它来确保每个枚举值都对应一个set方法:

enum Key { /* ... */ }

Map<Key, Function<MyEntity, Integer>> entitySetMethods =
    new EnumMap<>(Key.class);

entitySetMethods.put(Key.MAX_WM, MyEntity::setMaxWM);
entitySetMethods.put(Key.MIN_WP, MyEntity::setMinWP);
entitySetMethods.put(Key.UAM,    MyEntity::setUAM);
entitySetMethods.put(Key.WTR,    MyEntity::setWTR);

if (!entitySetMethods.keySet().containsAll(EnumSet.allOf(Key.class))) {
    throw new RuntimeException(
        "Programmer error: Not every Key is mapped to an entity property!");
}

// ...

Map<Key, Integer> parsedValues = parseKeysAndValues(file);

for (Map.Entry<Key, Integer> entry : parsedValues.entrySet()) {
    Key key = entry.getKey();
    Integer value = entry.getValue();
    entitySetMethods.get(key).apply(value);
}
enum键{/*…*/}
映射entitySetMethods=
新的枚举映射(Key.class);
entitySetMethods.put(Key.MAX_WM,MyEntity::setMaxWM);
entitySetMethods.put(Key.MIN_WP,MyEntity::setMinWP);
entitySetMethods.put(Key.UAM,MyEntity::setUAM);
entitySetMethods.put(Key.WTR,MyEntity::setWTR);
如果(!entitySetMethods.keySet().containsAll(EnumSet.allOf(Key.class))){
抛出新的运行时异常(
“程序员错误:并非每个键都映射到实体属性!”);
}
// ...
Map parsedValues=parseKeysAndValues(文件);
for(Map.Entry:parsedValues.entrySet()){
Key=entry.getKey();
整数值=entry.getValue();
entitySetMethods.get(键)、apply(值);
}
使用方法引用而不是反射的优点是:

  • 在编译时检查它们的存在性、参数类型和返回类型
  • 他们更快
  • 它们可以在运行时进行优化

您的描述没有提供足够的信息,请提供一些代码,以及您希望使用的数据库类型。我认为即使没有代码,这一点也很清楚。我应该写下如何处理这个文件吗?我如何使用setter?在不知道你在处理什么的情况下,很难给出任何建议。您是否有更换的钥匙,或者它们总是相同且已知的?是否每个条目都有所有键,或者可以省略某些键?您计划使用SQL还是NoSQL数据库?好吧,现在我明白你的意思了。我会更新我的帖子。根据你的描述,我会做的是在一些映射结构中加载数据并将其保存为json,如果你真的需要数据库MongoDB,这将是一个不错的选择。你的描述没有提供足够的信息,请提供一些代码,以及你想使用什么样的数据库。我认为即使没有代码,这一点也很清楚。我应该写下如何处理这个文件吗?我如何使用setter?在不知道你在处理什么的情况下,很难给出任何建议。您是否有更换的钥匙,或者它们总是相同且已知的?是否每个条目都有所有键,或者可以省略某些键?您计划使用SQL还是NoSQL数据库?好吧,现在我明白你的意思了。我会更新我的帖子。根据你的描述,我会将数据加载到一些映射结构中,并将其保存为json,如果你真的需要数据库MongoDB,这将是一个不错的选择。虽然这个链接可能会回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-我是新来的…将跟随@Petezurich虽然这个链接可能会回答这个问题,但最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-我是新来的…将跟随@petezurich