环境:

Springboot+mysql

我只想说jpa真的超级好用,准备深入研究一下~

导入依赖:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
lombok项目对于生成ToString(),Setter(),Getter()方法真的是太方便了。
Intellij idea开发的话需要安装Lombok plugin,同时设置 Setting -> Compiler -> Annotation Processors -> Enable annotation processing勾选。不过我没有勾选。 参考:http://www.cnblogs.com/holten/p/5729226.html
   https://yq.aliyun.com/articles/59972
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</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> 根据下列链接成功完成一个Demo
  http://blog.csdn.net/yucaifu1989/article/details/26476835 XStream注解说明:
http://blog.csdn.net/gaozhlzh/article/details/6826140
https://www.cnblogs.com/vmkash/p/5524809.html
jdbc连接池:
http://blog.csdn.net/emperor_xdy/article/details/6892607

很全的各种举例:
https://www.cnblogs.com/XL-Liang/archive/2013/03/22/2974987.html
其余有价值参考:
https://www.cnblogs.com/johnsonwei/p/5778406.html
http://blog.csdn.net/rainbow_m/article/details/47783337
http://blog.csdn.net/yobsun/article/details/51890656
https://www.cnblogs.com/zr520/archive/2016/04/06/5357459.html
http://blog.csdn.net/white_smile/article/details/43085491 项目中我使用了Hibernate去生成表,Hibernate具体使用我还不太会。不过也就是表问题。jdbc插入使用PreparedStatement,jpa插入先贴代码,后续我再研究研究。
复杂XML目前我见过两种(不涉及属性的研究):
(1)包含很多子模块
比较有代表性大概这样的:
<?xml version="1.0" encoding="GBK" standalone="no"?>
<Demo>
  <A>
      <a1></a1>
      <a2></a2>
  </A>
  <B>
    <b1></b1>
    <b2></b2>
  </B>
  <C>
    <D>
      <cd1></cd1>
      <cd2><cd2>
    </D>
  </C>
</Demo>
以下链接中的例子完美解决了上述情况:
 http://blog.csdn.net/yucaifu1989/article/details/26476835
(2)、成段重复
我遇到的是这样的情况:

<?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>

    <D>

      <F></F>  

    </D>

  </Bean>

</Data>

分析:
要求将返回来的xml解析成java对象并插入数据库,将XML中的内容分成两个表,实现一对多的关系。有用的字段为A、B、C。
one表:A、B
more表:C 方法一:
创建三个类:分别是Data(),Bean(),D()
Bean()类中以集合或者数组存储ABC和对象D。
//jpa注解@Data可以生成tostring(),setter(),getter()方法
@Data
public class Bean {
private List<String> A;
private List<String> B;
private List<String> C;
   private D d;
}
这里我们有类Data(),那么就不能使用@Data注解了,可以手动写get()、set()方法
public class Data {
private Bean BEAN; public Bean getBean() {
return BEAN;
} public void setBean(Bean BEAN) {
this.BEAN = BEAN;
}
}
D类省略。
再写一个转换的类
public class ParseXmlUtil {
/**
* 序列化XML字符串为对象
*
* @param xml xml字符串
*
* @return Channels对象
*/
public static Data fromXML(String xml) {
/**
* new DomDriver()用于解决java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory问题
*/ XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(Bean.class);
xstream.processAnnotations(Data.class);
xstream.alias("DATA", Data.class);
xstream.alias("BEAN", Bean.class);
xstream.alias("A", String.class);
xstream.addImplicitCollection(Bean.class, "A");
xstream.alias("B", String.class);
xstream.addImplicitCollection(Bean.class, "B");
xstream.alias("C", String.class);
xstream.addImplicitCollection(Bean.class,"C");
     xstream.alias("D", D.class);
        return (Data) xstream.fromXML(xml);
}
}
解析可以了,现在写用于插入数据库的:
application.properties配置文件
server.port=8088

#oracle
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@10.95.18.124:1521:orcl
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
#username=root
#password=root
#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/work
username=root
password=root #配置JPA
#spring.jpa.database=oracle
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
我使用mysql。
 
public class ConnectionUtils {
private static String url;
private static String driver;
private static String username;
private static String password;
static{
Properties props = new Properties();
try {
//从属性文件中读取数据库配置信息
props.load(ConnectionUtils.class.getClassLoader()
.getResourceAsStream("application.properties"));
} catch (IOException e) {
e.printStackTrace();
}
if(props != null){
url = props.getProperty("url");
driver = props.getProperty("driver");
username = props.getProperty("username");
password = props.getProperty("password");
//装载并注册数据库驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
} public static void close(Connection con) {
try {
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} public static void close(PreparedStatement stmt) {
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} public static void close(ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} }

测试:
public class Test {
public static void main(String[] args) { String sqlOne = "insert into one(A,B) " +
"values(?,?);"; String sqlMore = "insert into more(one_id,C) " +
"values(?,?);"; Connection conn = null;
PreparedStatement pstmt = null;
PreparedStatement pst = null; try {
conn = ConnectionUtils.getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sqlOne);
String code = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"\n" +
"<DATA> \n" +
" <BEAN>  \n" +
" <A>2018-01-22</A>   \n" +
" <B>太原</B>   \n" +
"<C>1</C>\n" + " <A>2018-01-22</A>   \n" +
" <B>太原</B>   \n" +
"<C>2</C>\n" +
            "<D><F>enen</F></D>"+
                    "  </BEAN> \n" +
"</DATA>\n";
Data data = (Data) ParseXmlUtil.fromXML(code);
Bean bean = data.getBean();
pstmt.setString(1, bean.getA().get(0));
pstmt.setString(2, bean.getB().get(0)); for (int i = 0; i < bean.getA().size(); i++) {
pst = (PreparedStatement) conn.prepareStatement(sqlMore);
pstmt.setString(1, bean.getC().get(i));
pstmt.addBatch();
}
pstmt.executeBatch();//批量增加 System.out.println("将xml导入数据库成功!");
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionUtils.close(pst);
ConnectionUtils.close(pstmt);
ConnectionUtils.close(conn);
}
}
}
这是针对只有一个Bean,项目中我们是多条Bean进行解析。
传送至(二):
												

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

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

    标注黄色地方:我需要加深学习!!! 我写的是webservice,目前具体写webservice的步骤我还不清楚, 整理完小知识开始整理webservice! 针对以下格式的XML进行解析 <? ...

  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. Dapper 批量插入

    环境 Mssql 自带的Dapper.Net 批量插入 是一条条循环插入 这里改成了单条 Ps:主要此方法要控制字符串长度哦,每个数据库对单条sql字符长度的限制是不一样的. /// <summ ...

  2. IP通信基础学习第六周(下)

    硬件地址又称物理地址或MAC地址 以太网的MAC帧格式开始的标志是有11出现时,没电时自动结束 适配器的重要功能:进行串行/并行转换:对数据进行缓存:在计算机的操作系统安装设备驱动系统:实现以太协议 ...

  3. (纯干货)最新WEB前端学习路线汇总初学者必看

    Web前端好学吗?这是很多web学习者常问的问题,想要学习一门自己从未接触过的领域,事先有些了解并知道要学的内容,对接下来的学习会有事半功倍的效果.在当下来说web前端开发工程师可谓是高福利.高薪水的 ...

  4. java 类、方法、代码块修饰式关键字总结

    super 关键字 this和super的区别 访问成员的区别 this关键字 this特点 this使用场景 static关键字 例子 访问权限修饰符 特点 总结: 四个修饰符的特点 访问权限修饰符 ...

  5. iOS进阶之UDP代理鉴权过程

    上一篇介绍的是TCP代理的鉴权过程,这篇将介绍UDP代理的大致鉴权过程. 在UDP鉴权过程中,有几点是需要注意的.首先,UDP是一种无连接协议,不需要连接,使用广播的方式:其次,为了通过鉴权,所以需要 ...

  6. 【记录】Linux安装jave-web环境

    依照教程记录 -java https://blog.csdn.net/a360616218/article/details/76736988 -tomcat https://www.cnblogs.c ...

  7. 图像处理 Matlab实现线性点运算、非线性点运算、点运算与直方图、直方图均衡化

    今天,我们学习了直方图.于是乎,回来我就用matlab代码实现一下.昨天受到道路检测老师课上一个内容的影响(对于道路裂缝的检测,我突发奇想,如果对于道路图像进行操作,是否能够让裂缝与道路分离,使得图像 ...

  8. python进阶(一)

    一.调试Debugging应用 (1)命令行内运行 $ python -m pdb my_script.py 这会触发debugger在脚本第⼀⾏指令处停⽌执⾏.这在脚本很短时会很有帮助.你可以通过( ...

  9. Android5.0新特性之——按钮点击效果动画(涟漪效果)

    Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果 涟漪效果是Android5.0以后的新特性.为了兼容性,建议新建drawable-v21文件夹 ...

  10. vue 开发环境搭建

    https://www.cnblogs.com/goldlong/p/8027997.html 1,按照nodeJS. 2,nodejs 包含npm. 3, 执行: npm install -g @v ...