Java 将接收到的数据保存在文本文件中
我想知道在以下情况下,将一些数据持久化到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我以文本文件形式接收结构为Java 将接收到的数据保存在文本文件中,java,jpa,mapstruct,Java,Jpa,Mapstruct,我想知道在以下情况下,将一些数据持久化到SQL数据库(我使用MariaDB和EclipseLink)的方法是什么。我以文本文件形式接收结构为key=value对的信息。这使得该文件易于解析。钥匙的顺序总是一样的,而且有一个清晰的图案。请查看此文件的一部分: 最大值=10 最小值=9 乌克兰格里夫纳=9 WTR=9 我希望该文件中的信息保存到数据库中。为此,我创建了一个JPA实体类。这里没有花哨的东西,只有字段和getter/setter。这里是我的问题:我可以用什么方法在那个实体类中设置字段?我
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(值);
}
使用方法引用而不是反射的优点是:
- 在编译时检查它们的存在性、参数类型和返回类型
- 他们更快
- 它们可以在运行时进行优化
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(值);
}
使用方法引用而不是反射的优点是:
- 在编译时检查它们的存在性、参数类型和返回类型
- 他们更快
- 它们可以在运行时进行优化