保留文本文件中收到的数据

时间:2018-03-25 15:17:15

标签: java jpa mapstruct

我想知道在以下情况下将一些数据保存到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我收到的结构为key=value对的文本文件信息。这使得该文件易于解析。键总是相同的顺序,并有一个清晰的模式。请看一下这个文件的一部分:

  

MAX_WM = 10

     

MIN_WP = 9

     

UAM = 9

     

WTR = 9

我希望将该文件中的信息保存到数据库中。为此,我创建了一个JPA entity类。这里没有奇特的东西,只有田野和吸气者/孵化器。这是我的问题:我可以通过什么方式设置该实体类中的字段?我可以通过阅读文本文件然后使用setter手动完成此操作。这是一个可行的选项,因为文件中的密钥不多(最多十个)。在未来,它可能改变思想。我考虑的第二个选项是使用MapStruct之类的映射库来自动完成它。我已经有enum字段与我收到的文件中的键相同。但是,到目前为止我看到的每个例子都使用了两个类。

3 个答案:

答案 0 :(得分:2)

你提到了密钥的枚举。您可以使用它来确保您有一个与每个枚举值对应的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);
}

使用方法引用而不是反射的优点是:

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

答案 1 :(得分:1)

如果它是键值对并且您知道它已修复,那么使用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");

答案 2 :(得分:0)

没有任何框架,假设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
}

<强> FooJpa.java

@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]);
     ...
   }