我想知道在以下情况下将一些数据保存到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我收到的结构为key=value
对的文本文件信息。这使得该文件易于解析。键总是相同的顺序,并有一个清晰的模式。请看一下这个文件的一部分:
MAX_WM = 10
MIN_WP = 9
UAM = 9
WTR = 9
我希望将该文件中的信息保存到数据库中。为此,我创建了一个JPA entity
类。这里没有奇特的东西,只有田野和吸气者/孵化器。这是我的问题:我可以通过什么方式设置该实体类中的字段?我可以通过阅读文本文件然后使用setter手动完成此操作。这是一个可行的选项,因为文件中的密钥不多(最多十个)。在未来,它可能改变思想。我考虑的第二个选项是使用MapStruct
之类的映射库来自动完成它。我已经有enum
字段与我收到的文件中的键相同。但是,到目前为止我看到的每个例子都使用了两个类。
答案 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]);
...
}