【Java】xml转实体

标签: java xml 反射
26人阅读 评论(0) 收藏 举报
分类:

引言

因为项目中需要把webservice接口提供的数据直接保存下来,一般字段少的就直接遍历,然后合成SQL存到数据库;

但是有的提供了30多个字段,遍历拼接就很繁琐,所以,写了一个简单的xml转实体,然后根据实体生成SQL;

 

代码

xml 转 list

StringReader sr = new StringReader(data);
InputSource is = new InputSource(sr);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;

builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
NodeList list = doc.getElementsByTagName("typ:ArRecUser");
for (int i = 0; i < list.getLength(); i++) {
    NodeList child = list.item(i).getChildNodes();
    .... some code ....
}

 

list 转 Object 和 Object 转 SQL

// Util - list转Object
    private Object xmlToObject(NodeList list, Object object) {
        Field[] fields = object.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            for (int j = 0; j < list.getLength(); j++) {
                if (list.item(j).getNodeName().substring(4).equals(fields[i].getName())) {
                    try {
                        Method method = object.getClass().getDeclaredMethod("set" + upperCase(fields[i].getName()),
                                String.class);
                        method.invoke(object, list.item(j).getTextContent());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return object;
    }

    // Util - 首字母大写
    public String upperCase(String str) {
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    // Util - 根据对象生成插入SQL
    private String careteInsertSqlByObject(Object object, String tableName) {
        String sql = "";
        StringBuilder sqlFields = new StringBuilder();
        StringBuilder sqlVaule = new StringBuilder();
        Field[] fields = object.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            sqlFields.append(changeUpper(fields[i].getName()) + ",");
            try {
                Method method = object.getClass().getDeclaredMethod("get" + upperCase(fields[i].getName()));
                String str = (String) method.invoke(object);
                sqlVaule.append("'" + str + "',");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        sql = "INSERT INTO " + tableName + "(" + sqlFields.toString().substring(0, sqlFields.length() - 1) + ") VALUES("
                + sqlVaule.toString().substring(0, sqlVaule.length() - 1) + ")";
        return sql;
    }

    // Util - 根据对象生成更新sql
    private String careteUpdateSqlByObject(Object object, String tableName, HashMap<String, String> condition) {
        String sql = "";
        StringBuilder sqlSet = new StringBuilder();
        StringBuilder sqlWhere = new StringBuilder();

        Field[] fields = object.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            String value = "";
            try {
                Method method = object.getClass().getDeclaredMethod("get" + upperCase(fields[i].getName()));
                value = (String) method.invoke(object);
            } catch (Exception e) {
                e.printStackTrace();
            }
            sqlSet.append(changeUpper(fields[i].getName()) + " = '" + value + "',");
        }

        Iterator<String> iterator = condition.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String val = condition.get(key);
            sqlWhere.append(" " + key + " = '" + val + "' AND");
        }

        sql = "UPDATE " + tableName + " SET " + sqlSet.toString().substring(0, sqlSet.length() - 1) + " WHERE "
                + sqlWhere.toString().substring(0, sqlWhere.length() - 3);
        return sql;
    }

    // Util - 大写转小写
    private String changeUpper(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (Character.isUpperCase(str.charAt(i))) {
                sb.append("_" + String.valueOf(str.charAt(i)).toLowerCase());
            } else {
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }

 

调用方式

//list转Object
Object userEntity = new revenueEntity();
Object object = xmlToObject(child, userEntity);

//Object赋值到具体的实体,对某些字段重新赋值
userEntity user = new userEntity();
BeanUtils.copyProperties(user, object);
user.setDate(date);

//根据实体合成UpdateSQL
HashMap<String, String> condition = new HashMap<String, String>();
condition.put("id", revenue.getId());
String sql_update = careteUpdateSqlByObject(user, "user_table", condition);

//根据实体合成InsertSQL
String sql_insert = careteInsertSqlByObject(user, "user_table");

 

小结

这里用到了反射,因为并不知道获取了一个字段需要调用哪个setter,但是还是有一定联系;

在合成SQL字段和数据库又不是完全一致,单词一样,命名规范不一样,所以也需要进行转化;

查看评论

xml与java实体相互转化

1、实体转换类: public abstract class BuildXmlUtils {     /**      * 获得泛型实体      * @return      ...
  • u013262276
  • u013262276
  • 2016-08-17 16:56:27
  • 1491

java xml与实体对象 互相转换

本文转载至:http://blog.csdn.net/sd4015700/article/details/39474893 最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2017-02-23 19:51:07
  • 6345

实体转xml(史上最全面)

记得之前遇到过需要将实体转成xml,然后调用webservice接口的情景。比较了几种方式,发现使用jdk本身自带的JAXBContext转换比较方便,直接通过注解来标识各个字段在xml中的属性及节点...
  • A313157416
  • A313157416
  • 2018-01-06 15:59:55
  • 118

XML与实体类,DataTable,List之间进行转换

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改。   1 2 3 4 5 ...
  • minyangchina
  • minyangchina
  • 2014-04-28 17:22:41
  • 796

Javabean 实体类转换为xml

public static String getBeanXml(Object object){ String xml = null; try { JAXBContext conte...
  • gaoleijie
  • gaoleijie
  • 2016-10-18 20:31:45
  • 810

任意XML转实体类 实体类 转XML 方法 JAVA

  • 2011年09月28日 03:34
  • 14KB
  • 下载

XML——c# 实体转xml最佳实践(自定义转化方式)

定义一个接口,包含两个方法:实体转xml 和 xml转实体。包含一个属性根节点标签名称 /// /// 定义元属性实体类与Xml之间的转换接口 /// /// 元属性...
  • Shiyaru1314
  • Shiyaru1314
  • 2017-03-13 20:21:25
  • 2073

微信公众平台_发送被动响应消息接口 实体类转换为xml工具类

http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E8%A2%AB%E5%8A%A8%E5%93%8D%E5%BA%94%...
  • liuyuhua0066
  • liuyuhua0066
  • 2014-07-01 11:07:16
  • 2701

JAVA操作XML二(转换关系):String --document--xml --document--String

主要涉及转化:从String转化为document再到xml从xml转化为document再到String xml转化为string: public static String xmlF...
  • luweifeng1983
  • luweifeng1983
  • 2009-03-26 23:57:00
  • 8838

java xml与实体类转换

@XmlRootElement注解定义xml的根节点 通过name改变根节点的xml值                     @XmlRootElement(name = "amimal_te...
  • u011220648
  • u011220648
  • 2018-01-05 16:07:33
  • 94
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 10万+
    积分: 1万+
    排名: 1750
    博客专栏
    最新评论