使用XStream解析復雜XML並插入數據庫(一)
阿新 • • 發佈:2018-01-29
針對 很多 trac ota print root parser 沒有 jdbc
環境:
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並插入數據庫(一)