使用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' ...
随机推荐
- sql中批量插入begin的使用
private static String ADD_ATTR_EXT_ITEM="insert into attr_ext_item(attr_ext_main_key,attr_name_ ...
- Vue学习4:class与style绑定
说明:有些部分我只是相当于做一个学习笔记,加强记忆之用.所以可能阅读性不是那么强.如果有参考我这类博客的人,那么请见谅. 代码如下: <!DOCTYPE html> <html la ...
- sql server中的全局变量,常用的没有多少...以后看看就行
全局变量格式: @@*** 这些变量有系统维护,不需要我们自己定义,一般都是用来查看信息. 在存储过程中 用得最多的 @@error,判断有没有错误信息. 一.@@version:查看版本信息 二. ...
- CentOS7.3安装zimbra8.7.11
系统版本:CentOS7.3 Zimbra版本:8.7.11 设置IP地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #使用vi命令修改ip BOOT ...
- SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...
- get_class __class__ get_called_class 分析记录
首先看代码: class A { use T { T::say as aTsay; } public function say() { echo 'a__class__:' . __CLASS__ . ...
- Linq高级查询,分页查询及查询分页结合
一.高级查询与分页查询 1.以...开头 StartsWith Repeater1.DataSource=con.Users.Where(r=>r.Nickname.StartsWith( ...
- 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...
- vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接
vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接 需求:自己app打开的登录页面不显示app下载链接.其他地方打开判断android手机的跳转到android下载页链 ...
- PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384 #include <iost ...