原作者:Kevin12
出处: http://kevin12.iteye.com/blog/1940281
一、需要一个类来对应我们想导出的数据库中的一个表
@Entity
@Table(name = "student_test")
public class StudentTest {
private int number;
private String name;
private String major;
@Column(columnDefinition= "int(10)", name = "NUMBER")
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number=number;
}
@Column(columnDefinition= "varchar(255)", name = "NAME")
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
@Column(columnDefinition= "varchar(255)", name = "MAJOR")
public String getMajor(){
return major;
}
public void setMajor(String major){
this.major=major;
}
}
二、需要有一个java连接mysql的类
public class DBDao {
private static String USER = "USERNAME";
private static String PASSWORD = "PASSWORD";
private static String DB_URL = "jdbc:mysql://IP ADDRESS:PORT/DB NAME";
private static String DB_DRIVER = "com.mysql.jdbc.Driver";
private static Connection connection = null;
//连接数据库
public static Connection getConnection(){
try {
Class.forName(DB_DRIVER);
connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);
} catch (Exception e) {
System.out.println("数据库连接异常");
e.printStackTrace();
}
return connection;
}
//关闭数据库连接
public static void closeConnection(Connection connection){
if(connection != null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、需要有一个从数据库读取该实体表,并转换成ArrayList对象的类
public class StudentListDao {
private String SQL ="";
public List<StudentTest> getStudentTests(){
List<StudentTest> studentTests = new ArrayList<>();
SQL = "select * from student_test";
Connection connection = null;
PreparedStatement pstmt = null;
try {
connection = DBDao.getConnection();
pstmt = (PreparedStatement) connection.prepareStatement(SQL);
ResultSet rSet = (ResultSet) pstmt.executeQuery();//得到数据库的查询结果,一个数据集
//判断结果集是否有效
while(rSet.next()){
StudentTest studentTest = new StudentTest();
studentTest.setNumber((Integer.parseInt(rSet.getString("number"))));
studentTest.setName(rSet.getString("name"));
studentTest.setMajor(rSet.getString("major"));
studentTests.add(studentTest);
}
connection.close();
pstmt.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
DBDao.closeConnection(connection);
}
return studentTests;
}
}
这里我碰见了一个问题是之前写成了if(rSet.next()),然后在set和add的时候,发现是添加了第二个数据。解决方法是改成while(rSet.next()),判断下一个是否为空,不为空就添加这一个。
四、需要用一个方法把对象按规定格式写到xml文件中
/**
* @Description:将对应的对象写到xml中
*/
public static Element object2Element(Element root,Object obj,String id){
try {
//获取Document根元素
Class clazz = obj.getClass();
//获取对象名称
String str = clazz.getName();
String objName = str.substring(str.lastIndexOf(".")+1);
//获取对象元素(以表名为标签的元素),不存在,则创建
Element tableElement = root.element(objName);
if(tableElement == null){
tableElement = root.addElement(objName).addAttribute("id", id);
}
//创建一个节点元素
Element nodeElement = tableElement.addElement("node").addAttribute("id", id);
Field[] fields = clazz.getDeclaredFields();
//遍历属性
for(Field field :fields){
/**拼接出属性对应的getter方法名*/
//获取对象属性
String fieldName = field.getName();
StringBuilder sb = new StringBuilder();
sb.append("get");
sb.append(fieldName.substring(0,1).toUpperCase());
if(fieldName.length()>1){
sb.append(fieldName.substring(1));
}
String getMethodName = sb.toString();
//反射method对象
Method getMethod = obj.getClass().getMethod(getMethodName);
//调用方法获取值
Object fieldValue = getMethod.invoke(obj);
//添加节点子元素元素
Element fieldElement = nodeElement.addElement(fieldName).addAttribute(fieldName, fieldName);
fieldElement.setText(fieldValue==null?"":fieldValue.toString());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return root;
}
五、最后,写一个方法来调用第四步写的方法,并且导出xml文件吧
@Test
public void exportXML(){
StudentListDao studentListDao = new StudentListDao();
/**1.创建document*/
Document document = DocumentHelper.createDocument();
/**2.添加根元素*/
Element rootElement = document.addElement("root");
/**3.用反射将对象写到xml中*/
List<StudentTest> list = studentListDao.getStudentTests();
for(StudentTest studentTest:list){
rootElement = TestXMLImport.object2Element(rootElement, studentTest, String.valueOf(studentTest.getNumber()));
}
/**4.将document写到xml中并保存到服务器指定的目录中*/
FileOutputStream xmlOut;
try {
xmlOut = new FileOutputStream(new File("G:/testXMLExport.xml"));
XMLWriter xmlWriter = new XMLWriter(xmlOut,OutputFormat.createPrettyPrint());
xmlWriter.write(document);
xmlWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
感谢原作者分享的方法!