首页 > 解决方案 > 将 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);

标签: javaxmlspring

解决方案


您的问题有几个解决方案。最常见的方法是将您的 xml 转换为实体并将其保存到数据库中。如我所见,您使用@Service的是 spring-package 中的注释。这使得可以使用 Spring-Data JPA 或普通的 Hibernate。我将为您提供 Postgresql 和 Spring-Data 的示例。

  1. 将 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>
    
  2. 将您的数据库凭据提供到文件中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。如果您使用数据丢失至关重要的阶段或生产数据库,请使用更新或验证。

  1. 创建将持久化到数据库的实体类:

     @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
    }
    
  2. 创建简单的存储库

     @Repository
     public interface MyRepository extends CrudRepository<MyEntity, UUID> { 
     }
    
  3. 在您的代码中使用创建的存储库

      @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);
    

推荐阅读