从数据库导出xml文件

原作者: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();  
        }  
    } 

感谢原作者分享的方法!

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值