【问题标题】:Save XML file to database/ Spring Boot将 XML 文件保存到数据库/ Spring Boot
【发布时间】:2021-08-29 08:21:19
【问题描述】:

我是一名初级开发人员,无法完成我的项目。我需要将从 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);

【问题讨论】:

    标签: java xml spring


    【解决方案1】:

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

    1. 将 db 驱动程序和 spring-data-jpa 启动器添加到您的项目中

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

    【讨论】:

    • 非常感谢!)一切都开始工作了。我在错误的地方创建了对象...))
    猜你喜欢
    • 2020-02-12
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多