标注黄色地方:我需要加深学习!!!

我写的是webservice,目前具体写webservice的步骤我还不清楚, 整理完小知识开始整理webservice!

针对以下格式的XML进行解析

<?xml version=”1.0” encoding=”UTF-8”?>

<Data>

  <Bean>

    <A>a</A>

    <B>b</B>

    <C>1</C>

    <A>a</A>

    <B>b</B>

    <C>2</C>

  </Bean>

    <D>

      <E></E>  

    </D>

</Data>

项目中:我们一次性解析10条Bean,这里,举例两条,Data中包含十个Bean。

我们需要将A、B、C的数据存入数据库,这里,老大说采用一对多的方式进行存储。项目中我们使用hibernate自动生成表。举例中我还是按照项目的写法走,当然自己建表并建立两表间的关系会更容易。建立一对多关系。

(1)、导入依赖,我是oracle,mysql来回切换用的,有时候远程连不上老大的数据库,我就用mysql了。下面我使用oracle数据库。

  1. <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    </dependency>
  2.  
  3. <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.4.0</version>
    </dependency>
    <dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.9</version>
    </dependency>
    <!--
  1. <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
    -->
    项目中我们还引入了Axsi2,回头深入了解,先贴个依赖。我写的demo没有用这个。
    (2)、配置文件application.properties
    当然啦,现在用YAML文件就更直观啦~改天一试,多练练才行,我现在会,但是代码不会敲,全是粘贴,这是个坏习惯!
  1. #配置端口号
    server.port=8080
  1. #配置数据源
  2.  
  3. #mysql
    #spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    #spring.datasource.url=jdbc:mysql://localhost:3306/test
    #spring.datasource.username=root
    #spring.datasource.password=root
  4.  
  5. #oracle
    spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
    spring.datasource.username=root
    spring.datasource.password=root
    #配置JPA
    spring.jpa.database=oracle
    #spring.jpa.database=mysql
    spring.jpa.show-sql=true
    spring.jpa.generate-ddl=true
    spring.jpa.hibernate.ddl-auto=create
    目前show-sqlgenerate-ddlddl-auto值得意思我还不太明白,但是当我们创建表结构的时候一定要用create,灌进数据后千万改成none,不然表新建哦,数据就没了!
  6.  
  7. 3)、创建五个类:主要根据是将XML分为三部分用于插入数据库和将XML解析成java对象,再将所有标签汇总到一起的一个类。
    第一个类:用它来将Bean的内容转换成java对象
  1. import java.util.List;
  2.  
  3. @Component
    @Data
    public class Demo {
  4.  
  5. private List<String> A;
  6.  
  7.   private List<String> B;
  1. private List<String> C;
  1. }
    这里,记得添加注解@Component,不然会报错:

  Unable to instantiate deployer org.apache.axis2.deployment.ServiceDeployer; see debug logs for more details

解决:Model层的Key类没有添加注解。
  导致bean无法注入,加一下就行了。和表对应就写@Entity,不对应就写@Component。

问题传送:https://segmentfault.com/q/1010000005957988/a-1020000005958530


  1. 第二、三个类Bean中内容对应两张表。
  1. @Entity
    @Data
    @Table(name = "abtable")
    @GenericGenerator(name = "jpa-uuid", strategy = "uuid")
    public class ABEntity {
  2.  
  3. @Id
    @GeneratedValue(generator = "jpa-uuid")
    @Column(name = "ab_id", length = 32)
    private String ab_id;
  1.   @Column(name = "A", length = 200)
      private String A;
  2.  
  3.   @Column(name = "B", length = 200)
      private String B;
  4.  
  5.   @OneToMany(cascade={CascadeType.ALL}) //指定一对多关系,级联
      @JoinColumn(name="ab_id",referencedColumnName ="ab_id" )
      private Set<CEntity> emp = new HashSet<CEntity>();
  1. }

  1. import lombok.Data;
    import org.hibernate.annotations.GenericGenerator;
  2.  
  3. import javax.persistence.*;
  4.  
  5. @Entity
    @Data
    @Table(name = "ctable")
    @GenericGenerator(name = "jpa-uuid", strategy = "uuid")
    public class CEntity {
  6.  
  7. @Id
    @GeneratedValue(generator = "jpa-uuid")
    @Column(name = "c_id", length = 32)
    private String c_id;
  8.  
  9. @Column(name = "C", length = 200)
    private String C;
  10.  
  11. @Column(name = "ab_id", length = 32)
    private String ab_id;
    }

  1. 第四个类:处理DF两个标签。
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
  1. @ToString
    @Setter
    @Getter
    public class DLable{
  2.  
  3. private String E;
  4.  
  5. }

  1. 第五个类:多个相同的标签封装到一个集合中,有多条Bean,使用集合存储。
  1. import com.thoughtworks.xstream.annotations.XStreamImplicit;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
  2.  
  3. import java.util.List;
  4.  
  5. @ToString
    @Setter
    @Getter
    public class DemoResult {
  6.  
  7. /**
    * 多个相同的标签封装到一个集合中
    */
    @XStreamImplicit(itemFieldName = "BEAN")
    private List<Demo> BEAN;
    private DLable D;
    }

  1. 接下来再写一个类用于设置XStream
  1. protected XStream getXStream(Class data, Class bean) {
    XStream xStream = new XStream() {
    @Override
    protected MapperWrapper wrapMapper(MapperWrapper next) {
    return new MapperWrapper(next) {
    @Override
    public boolean shouldSerializeMember(Class definedIn, String fieldName) {
    // 忽略没有的属性
    if (definedIn == Object.class) {
    return false;
    }
    return super.shouldSerializeMember(definedIn, fieldName);
    }
    };
    }
    };
    xStream.alias("DATA", data);
    xStream.alias("BEAN", bean);
    xStream.addImplicitCollection(PlacePoliceResult.class, "BEAN");
    xStream.alias("D, DLable.class);
    xStream.alias("A", String.class);
    xStream.addImplicitCollection(Demo.class, "A");
    xStream.alias("B", String.class);
    xStream.addImplicitCollection(Demo.class, "B");
    xStream.alias("C", String.class);
    xStream.addImplicitCollection(Demo.class, "C");
  1.   return xStream;
    }

  1. /**
    * 将xml结果封装成java对象,并插入数据库
    *
    * @throws Exception
    */
    这里我们用@Slf4j输出日志。
    参数说明:
  1. XStream stream
      XStream stream = getXStream(DemoResult.class, Demo.class);
    String text:
      String text = "<?xml version=”1.0” encoding=”UTF-8”?><Data><Bean><A>a1</A><B>b1</B><C>11</C><A>a1</A><B>b1</B><C>22</C></Bean><Bean><A>a2</A><B>b2</B><C>33</C><A>a2</A><B>b2</B><C>44</C></Bean><D><E></E></D></Data>";
    String name:
      String name = Demo.class.getSimpleName();
  1. @Autowired
    private CaseInfoDao caseInfoDao;
  1. private void xmlToBeanDemo(XStream stream, String text, String name) {
  2.  
  3. Object obj = stream.fromXML(text);
    if (obj != null) {
    List<Map<String, Object>> reslist = new ArrayList<>();
    Map<String, Object> resMap = new HashMap<>(16);
    List<CEntity> moreList = new ArrayList<CEntity>();
  4.  
  5. try {
    if (obj instanceof DemoResult) {
    DemoResult result = (DemoResult) obj;
    List<Demo> list = result.getBEAN();
    //遍历一的关系
    for (int i = 0; i < list.size(); i++) {
    moreList = new ArrayList<CEntity>();
    resMap = new HashMap<>(16);
    Demo demo= list.get(i);
    ABEntity aBEntity = new ABEntity();
    aBEntity.setA(demo.getA().get(0));
    aBEntity.setB(demo.getB().get(0));
  6.  
  7. resMap.put("ABEntity", aBEntity);
    // 遍历多的关系
    for (int j = 0; j < demo.getA().size(); j++) {
    CEntity cEntity = new CEntity();
    cEntity.setC(demo.getC().get(j));
  8.  
  9. moreList.add(cEntity);
    }
    resMap.put("moreList", moreList);
    reslist.add(resMap);
  10.  
  11. }
    log.info("解析完成。。。");
    }
    } catch (Exception e) {
    log.info("error信息,{}", e.getMessage());
    }
    caseInfoDao.batchInsertPlace(reslist);
    log.info("数据添加完成");
    }
    log.info("没有数据返回,{}", name);
  12.  
  13. }
  1. 设置将返回的java对象插入数据库
  1. @Slf4j
    @Repository
    public class CaseInfoDao {
  2.  
  3. /**
    * JPA 实体管理
    */
    @PersistenceContext
    private EntityManager entityManager;
  1. @Transactional(rollbackFor = Exception.class)
    public void batchInsertPlace(List<Map<String,Object>> reslist) {
    Map<String,Object> map;
    for (int i = 0; i < reslist.size(); i++) {
    map = reslist.get(i);
    ABEntity aBEntity = (ABEntity)map.get("ABEntity");
    //添加实体到session缓存
    entityManager.persist(aBEntity);
    log.info("ab_id:{}",aBEntity.getAb_id());
    List<CEntity> moreList= (List<CEntity>) map.get("moreList");
    for (int j = 0; j < moreList.size(); j++) {
    CEntity cEntity = moreList.get(j);
    cEntity.setAb_id(aBEntity.getAb_id());
    log.info("cEntity:{}",cEntity.toString());
    entityManager.persist(cEntity);
    }
    }
  2.  
  3. entityManager.flush();
    log.info("更新数据成功");
    //清空缓存
    entityManager.clear();
    }
    }
  1. 解析XML并插入数据库:
  1. XStream stream = getXStream(DemoResult.class, Demo.class);
    String text:
      String text = "<?xml version=”1.0” encoding=”UTF-8”?><Data><Bean><A>a1</A><B>b1</B><C>11</C><A>a1</A><B>b1</B><C>22</C></Bean><Bean><A>a2</A><B>b2</B><C>33</C><A>a2</A><B>b2</B><C>44</C></Bean><D><E></E></D></Data>";
    String name:
      String name = Demo.class.getSimpleName();
  1. xmlToBeanDemo(stream, text,name);
  1. 注意:
    以上我还没试验过,过几天反馈。
    反思:
      工作时间写博客不对,要多利用课余时间写,总结,多敲多练!写博客时间浪费有点久!继续加油!

使用XStream解析复杂XML并插入数据库(二)的更多相关文章

  1. 使用XStream解析复杂XML并插入数据库(一)

    环境: Springboot+mysql 我只想说jpa真的超级好用,准备深入研究一下~ 导入依赖: <dependency> <groupId>org.projectlomb ...

  2. python3.4.3 调用http接口 解析response xml后插入数据库

    工作中需要调用一个http的接口,等不及java组开发,就试着用python去调用.Python版本3.4.3 完整的流程包括:从sqlServer取待调用的合同列表 -> 循环调用http接口 ...

  3. 分30条依次解析xml并插入数据库成功

    package xxx; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import or ...

  4. xStream解析生成xml文件学习资料

    参考链接: http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

  5. 我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

    项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml, ...

  6. Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库

    Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...

  7. Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。

    在上一篇文章中我们成功得到了重新组织后的数据,接下来需要做的便是将数据插入到数据库中了.在与数据库打交道的过程中有一些方法是普遍的,我们将这些通用方法封装到一个DbUtil类中,以便复用,封装好的Db ...

  8. (转载)XML解析之-XStream解析

    转载来源:http://hwy584624785.iteye.com/blog/1168680 本例使用XStream生成一个xml文件,再发序列化xml文件内容. XStream是一个简单的类库,可 ...

  9. php操作xml并插入到数据库中

    php操作xml并插入到数据库中 <? php header('content-type:text/html;charset=utf-8'); mysql_connect('localhost' ...

随机推荐

  1. sql中批量插入begin的使用

    private static String ADD_ATTR_EXT_ITEM="insert into attr_ext_item(attr_ext_main_key,attr_name_ ...

  2. Vue学习4:class与style绑定

    说明:有些部分我只是相当于做一个学习笔记,加强记忆之用.所以可能阅读性不是那么强.如果有参考我这类博客的人,那么请见谅. 代码如下: <!DOCTYPE html> <html la ...

  3. sql server中的全局变量,常用的没有多少...以后看看就行

    全局变量格式:  @@*** 这些变量有系统维护,不需要我们自己定义,一般都是用来查看信息. 在存储过程中 用得最多的 @@error,判断有没有错误信息. 一.@@version:查看版本信息 二. ...

  4. CentOS7.3安装zimbra8.7.11

    系统版本:CentOS7.3 Zimbra版本:8.7.11 设置IP地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #使用vi命令修改ip BOOT ...

  5. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解

    构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...

  6. get_class __class__ get_called_class 分析记录

    首先看代码: class A { use T { T::say as aTsay; } public function say() { echo 'a__class__:' . __CLASS__ . ...

  7. Linq高级查询,分页查询及查询分页结合

    一.高级查询与分页查询 1.以...开头    StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...

  8. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  9. vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接

    vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接 需求:自己app打开的登录页面不显示app下载链接.其他地方打开判断android手机的跳转到android下载页链 ...

  10. PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)

    题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384 #include <iost ...