使用XStream解析复杂XML并插入数据库(二)
标注黄色地方:我需要加深学习!!!
我写的是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数据库。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency> <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>
<!--
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
-->
项目中我们还引入了Axsi2,回头深入了解,先贴个依赖。我写的demo没有用这个。
(2)、配置文件application.properties
当然啦,现在用YAML文件就更直观啦~改天一试,多练练才行,我现在会,但是代码不会敲,全是粘贴,这是个坏习惯!
#配置端口号
server.port=8080
#配置数据源 #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 #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-sql、generate-ddl、ddl-auto值得意思我还不太明白,但是当我们创建表结构的时候一定要用create,灌进数据后千万改成none,不然表新建哦,数据就没了! (3)、创建五个类:主要根据是将XML分为三部分用于插入数据库和将XML解析成java对象,再将所有标签汇总到一起的一个类。
第一个类:用它来将Bean的内容转换成java对象
import java.util.List; @Component
@Data
public class Demo { private List<String> A; private List<String> B;
private List<String> C;
}
这里,记得添加注解@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
第二、三个类。Bean中内容对应两张表。
@Entity
@Data
@Table(name = "abtable")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class ABEntity { @Id
@GeneratedValue(generator = "jpa-uuid")
@Column(name = "ab_id", length = 32)
private String ab_id;
@Column(name = "A", length = 200)
private String A; @Column(name = "B", length = 200)
private String B; @OneToMany(cascade={CascadeType.ALL}) //指定一对多关系,级联
@JoinColumn(name="ab_id",referencedColumnName ="ab_id" )
private Set<CEntity> emp = new HashSet<CEntity>();
}
import lombok.Data;
import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Entity
@Data
@Table(name = "ctable")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class CEntity { @Id
@GeneratedValue(generator = "jpa-uuid")
@Column(name = "c_id", length = 32)
private String c_id; @Column(name = "C", length = 200)
private String C; @Column(name = "ab_id", length = 32)
private String ab_id;
}
第四个类:处理DF两个标签。
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@ToString
@Setter
@Getter
public class DLable{ private String E; }
第五个类:多个相同的标签封装到一个集合中,有多条Bean,使用集合存储。
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString; import java.util.List; @ToString
@Setter
@Getter
public class DemoResult { /**
* 多个相同的标签封装到一个集合中
*/
@XStreamImplicit(itemFieldName = "BEAN")
private List<Demo> BEAN;
private DLable D;
}
接下来再写一个类用于设置XStream
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");
return xStream;
}
/**
* 将xml结果封装成java对象,并插入数据库
*
* @throws Exception
*/
这里我们用@Slf4j输出日志。
参数说明:
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();
@Autowired
private CaseInfoDao caseInfoDao;
private void xmlToBeanDemo(XStream stream, String text, String name) { 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>(); 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)); resMap.put("ABEntity", aBEntity);
// 遍历多的关系
for (int j = 0; j < demo.getA().size(); j++) {
CEntity cEntity = new CEntity();
cEntity.setC(demo.getC().get(j)); moreList.add(cEntity);
}
resMap.put("moreList", moreList);
reslist.add(resMap); }
log.info("解析完成。。。");
}
} catch (Exception e) {
log.info("error信息,{}", e.getMessage());
}
caseInfoDao.batchInsertPlace(reslist);
log.info("数据添加完成");
}
log.info("没有数据返回,{}", name); }
设置将返回的java对象插入数据库:
@Slf4j
@Repository
public class CaseInfoDao { /**
* JPA 实体管理
*/
@PersistenceContext
private EntityManager entityManager;
@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);
}
} entityManager.flush();
log.info("更新数据成功");
//清空缓存
entityManager.clear();
}
}
解析XML并插入数据库:
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();
xmlToBeanDemo(stream, text,name);
注意:
以上我还没试验过,过几天反馈。
反思:
工作时间写博客不对,要多利用课余时间写,总结,多敲多练!写博客时间浪费有点久!继续加油!
使用XStream解析复杂XML并插入数据库(二)的更多相关文章
- 使用XStream解析复杂XML并插入数据库(一)
环境: Springboot+mysql 我只想说jpa真的超级好用,准备深入研究一下~ 导入依赖: <dependency> <groupId>org.projectlomb ...
- python3.4.3 调用http接口 解析response xml后插入数据库
工作中需要调用一个http的接口,等不及java组开发,就试着用python去调用.Python版本3.4.3 完整的流程包括:从sqlServer取待调用的合同列表 -> 循环调用http接口 ...
- 分30条依次解析xml并插入数据库成功
package xxx; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import or ...
- xStream解析生成xml文件学习资料
参考链接: http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html
- 我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库
项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml, ...
- Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库
Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...
- Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。
在上一篇文章中我们成功得到了重新组织后的数据,接下来需要做的便是将数据插入到数据库中了.在与数据库打交道的过程中有一些方法是普遍的,我们将这些通用方法封装到一个DbUtil类中,以便复用,封装好的Db ...
- (转载)XML解析之-XStream解析
转载来源:http://hwy584624785.iteye.com/blog/1168680 本例使用XStream生成一个xml文件,再发序列化xml文件内容. XStream是一个简单的类库,可 ...
- php操作xml并插入到数据库中
php操作xml并插入到数据库中 <? php header('content-type:text/html;charset=utf-8'); mysql_connect('localhost' ...
随机推荐
- Docker下配置双机热备PXC集群
架构: 步骤: 1.安装centos7 ,设置宿主机IP:192.168.1.224 2.先更新yum软件管理器,再安装docker 1.yum -y update 2.yum install - ...
- Spring boot 源码分析(前言)
开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...
- sitecore8.2 基于相对路径查询item
当前项目: bar (path: /sitecore/content/home/foo/bar) 查询: query:./child/grandchild 结果: grandchild (path: ...
- VS2015右键集成TortoiseGit
先上效果 再说步骤 1.安装VS TortoiseGit等~~ 2.以外部工具方式调用TortoiseGit 3.在VS中设置右键菜单 在菜单栏下方右键,选择自定义 在弹出窗口中选择,命令->上 ...
- post请求中body数据类型
1.application/json:json格式,如下: {"input1":"xxx","input2":"ooo" ...
- CentOS7 下设置静态IP
1.更改虚拟机网络适配器 虚拟机-->设置-->网络适配器 网络连接选择NAT模式 2.设置虚拟网络编辑器 编辑-->虚拟网络编辑器 3.修改本地VMnet8IP 4.修改linu ...
- Hadoop2-HDFS学习笔记之入门(不含YARN及MR的调度功能)
架构 Hadoop整体由HDFS.YARN.MapReduce三大部分组成,推荐架构参考:https://www.cnblogs.com/zhjh256/p/10573684.html. 注:2.x的 ...
- 三.SQL语句
一.mysqladmin客户端命令 1.查看MySQL存活状态 [root@db01 ~]# mysqladmin -uroot -p123 ping 2.查看MySQL状态信息 [root@db01 ...
- 爬虫中xpath的特殊用法
Xpath之starts-with(@属性名称,属性字符串相同部分) 以相同的字符开头的用法 在做爬虫时解析html的源码时候可能会遇见以下这种标签, <div id="test-1& ...
- openwrt如何关掉防火墙?
答: 1. 阻止防火墙服务开机自动启动 /etc/init.d/firewall disable 2. 关闭防火墙 /etc/init.d/firewall stop