java - 将 XML 文件保存到数据库/ Spring Boot
问题描述
我是初学者,无法完成我的项目。我需要将从 XML 文件接收到的数据保存到数据库中。我写了代码,但是我无法将接收到的数据保存到数据库中:
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
@Service
public class UploadURLServiceImpl implements UploadURLService {
private final FileDTORepository fileDTORepository;
@Autowired
public UploadURLServiceImpl(FileDTORepository fileDTORepository) {
this.fileDTORepository = fileDTORepository;
}
public void store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
SnEntryDTO snEntryDTO = new SnEntryDTO(fileName, file.getContentType(), file.getContentType(), file.getBytes());
fileDTORepository.save(snEntryDTO);
}
@Override
public boolean uploadData(String url) {
try (BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
FileOutputStream fileOutputStream = new FileOutputStream(new File("sn.xml"))) {
byte dataBuffer[] = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
} catch (IOException e) {
System.out.println(e);
return false;
}
return true;
}
@Override
public void parseSdnFile(String fileName) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File(fileName));
doc.getDocumentElement().normalize();
System.out.println("Root Element :" + doc.getDocumentElement().getNodeName());
System.out.println("------");
// get <staff>
NodeList list = doc.getElementsByTagName("snEntry");
for (int temp = 0; temp < list.getLength(); temp++) {
Node node = list.item(temp);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String id = element.getElementsByTagName("uid").item(0).getTextContent();
String lastName = element.getElementsByTagName("lastName").item(0).getTextContent();
String snType = element.getElementsByTagName("snType").item(0).getTextContent();
String programList = element.getElementsByTagName("program").item(0).getTextContent();
System.out.println(id + " " + lastName + " snType " + snType + " programList " + programList);
}
}
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
请告诉我。据我了解,我还需要创建一个对象吗?
这部分代码,我需要把它塑造成一个对象吗?
for (int temp = 0; temp < list.getLength(); temp++) {
Node node = list.item(temp);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String id = element.getElementsByTagName("uid").item(0).getTextContent();
String lastName = element.getElementsByTagName("lastName").item(0).getTextContent();
String snType = element.getElementsByTagName("snType").item(0).getTextContent();
String programList = element.getElementsByTagName("program").item(0).getTextContent();
System.out.println(id + " " + lastName + " snType " + snType + " programList " + programList);
解决方案
您的问题有几个解决方案。最常见的方法是将您的 xml 转换为实体并将其保存到数据库中。如我所见,您使用@Service
的是 spring-package 中的注释。这使得可以使用 Spring-Data JPA 或普通的 Hibernate。我将为您提供 Postgresql 和 Spring-Data 的示例。
将 db driver 和 spring-data-jpa starter 添加到您的项目中
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>
将您的数据库凭据提供到文件中
application.properties
spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase spring.datasource.username=postgres spring.datasource.password=12345 spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
小心spring.jpa.hibernate.ddl-auto
将休眠模式设置为更改数据库。为避免数据丢失,如果您使用不害怕丢失数据的本地/测试数据库,请使用 create, create-drop。如果您使用数据丢失至关重要的阶段或生产数据库,请使用更新或验证。
创建将持久化到数据库的实体类:
@Entity @Table(name = "my_entity") public class MyEntity { @Id @Column(name = "id", length = 16, unique = true, nullable = false) private UUID uid = randomUuid(); @Column(name = "last_name") private String lastName; @Column(name = "sn_type") private String snType; @Column(name = "program") private String program; // Constructors // Getters and setters }
创建简单的存储库
@Repository public interface MyRepository extends CrudRepository<MyEntity, UUID> { }
在您的代码中使用创建的存储库
@Autowired private MyRepository myRepo; //Inject your repo in service @Override public void parseSdnFile(String fileName) { //... for (int temp = 0; temp < list.getLength(); temp++) { Node node = list.item(temp); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String id = element.getElementsByTagName("uid").item(0).getTextContent(); String lastName = element.getElementsByTagName("lastName").item(0).getTextContent(); String snType = element.getElementsByTagName("snType").item(0).getTextContent(); String programList = element.getElementsByTagName("program").item(0).getTextContent(); MyEntity entity = new MyEntity(id, lastName, snType, program); //serealize your data into entity myRepo.save(entity) //saving to database System.out.println(id + " " + lastName + " snType " + snType + " programList " + programList);
推荐阅读
- javascript - 正则表达式替换特殊字符在 JS 和 Python 中给出不同的结果
- javascript - 走出视口reactjs时暂停html视频
- java - 扫描特定文件夹中重复文件的最快方法是什么?- 安卓
- drools - Drools 看不到规则并返回 null 作为结果
- css - 如何正确放置位置 css?
- reactjs - 为什么这个特定的 React 路由器配置不起作用?
- java - Apache Wicket - 按钮不可点击
- regex - 使用 Batch 替换为正则表达式 (Windows)
- c# - C#如何将泛型类型转换为它实现的接口
- sql - 在 2 个相似 ID 之间选择 MAX