`

jaxb 对象XML list 互转

 
阅读更多
写道
 
 
 

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
/**
* @说明:利用反射机制从ResultSet自动绑定到JavaBean;根据记录集自动调用javaBean里边的对应方法。
*
* @param <T>
*/
public class SetDB2BeanUtil<T> {
/**
* @param clazz
* 所要封装的javaBean
* @param rs
* 记录集
* @return ArrayList 数组里边装有 多个javaBean
* @throws Exception
*/
public List<T> getList(Class<T> clazz, ResultSet rs) {
Field field = null;
List<T> lists = new ArrayList<T>();
try {
// 取得ResultSet列名
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
// 定义counts个String 变量
String[] columnNames = new String[counts];
String[] objNames = new String[counts];
// 给每个变量赋值(字段名称全部转换成小写)
for (int i = 0; i < counts; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
objNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase().replaceAll("_", "");
}
// 变量ResultSet
while (rs.next()) {
T t = clazz.newInstance();
// 反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++) {

// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(objNames[i]);

// 这里是获取bean属性的类型
Class<?> beanType = field.getType();

// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);

if (value != null) {

// 这里是获取数据库字段的类型
Class<?> dbType = value.getClass();

// 处理日期类型不匹配问题
if (dbType == java.sql.Timestamp.class
&& beanType == java.util.Date.class) {
value = new java.util.Date(
((java.sql.Timestamp) value).getTime());
}
// 处理double类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == Double.class) {
value = new Double(value.toString());
}
// 处理int类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == Integer.class) {
value = new Integer(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Long.class) {
value = new Long(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Short.class) {
value = new Short(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Byte.class) {
value = new Byte(value.toString());
}
if (dbType == String.class
&& beanType == String.class) {
value = new String(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == BigDecimal.class) {
value = new BigDecimal(value.toString());
}
}

String setMethodName = "set"
+ firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName, beanType);

// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
lists.add(t);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return lists;
}

/**
* @param clazz
* bean类
* @param rs
* 结果集 (只有封装第一条结果)
* @return 封装了查询结果的bean对象
*/
public T getObj(Class<T> clazz, ResultSet rs) {
Field field = null;
T obj = null;
try {
// 取得ResultSet列名
ResultSetMetaData rsmd = rs.getMetaData();
// 获取记录集中的列数
int counts = rsmd.getColumnCount();
// 定义counts个String 变量
String[] columnNames = new String[counts];
String[] objNames = new String[counts];
// 给每个变量赋值(字段名称全部转换成小写)
for (int i = 0; i < counts; i++) {
columnNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase();
objNames[i] = rsmd.getColumnLabel(i + 1).toLowerCase().replaceAll("_", "");
}
// 变量ResultSet
if (rs.next()) {
T t = clazz.newInstance();
// 反射, 从ResultSet绑定到JavaBean
for (int i = 0; i < counts; i++) {
try{
// 设置参数类型,此类型应该跟javaBean 里边的类型一样,而不是取数据库里边的类型
field = clazz.getDeclaredField(objNames[i]);

}catch(Exception ex){
ex.printStackTrace();
continue;
}

// 这里是获取bean属性的类型
Class<?> beanType = field.getType();

// 根据 rs 列名 ,组装javaBean里边的其中一个set方法,object 就是数据库第一行第一列的数据了
Object value = rs.getObject(columnNames[i]);

if (value != null) {

// 这里是获取数据库字段的类型
Class<?> dbType = value.getClass();

// 处理日期类型不匹配问题
if (dbType == java.sql.Timestamp.class
&& beanType == java.util.Date.class) {
value = new java.util.Date(
((java.sql.Timestamp) value).getTime());
}
// 处理double类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == Double.class) {
value = new Double(value.toString());
}
// 处理int类型不匹配问题
if (dbType == java.math.BigDecimal.class
&& beanType == Integer.class) {
value = new Integer(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Long.class) {
value = new Long(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Short.class) {
value = new Short(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == Byte.class) {
value = new Byte(value.toString());
}
if (dbType == String.class
&& beanType == String.class) {
value = new String(value.toString());
}
if (dbType == java.math.BigDecimal.class
&& beanType == BigDecimal.class) {
value = new BigDecimal(value.toString());
}
}

String setMethodName = "set"
+ firstUpperCase(columnNames[i]);
// 第一个参数是传进去的方法名称,第二个参数是 传进去的类型;
Method m = t.getClass().getMethod(setMethodName, beanType);

// 第二个参数是传给set方法数据;如果是get方法可以不写
m.invoke(t, value);
}
obj = t;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return obj;
}

// 首写字母变大写
public static String firstUpperCase(String old) {
old=old.replaceAll("_", "");
return old.substring(0, 1).toUpperCase() + old.substring(1);
}
}

 

分享到:
评论

相关推荐

    利用JAXB进行xml和javabean之间转换

    NULL 博文链接:https://luyuwww.iteye.com/blog/1988355

    jaxb+list+实体,实现对xml读写

    使用jaxb来实现对xml的读写,其中用到了list整个集合

    xml2object、object2xml之JAXB

    前段时间找了好久xml与object之间的转换都没找到!最近在学习WebService,讲到JAXB!没听说过!看了才知道jdk中自带了这个功能,什么这个...List Map 继承 接口 数据类型不一至的一异常 父子类的转换 &lt;&lt;&lt;&lt;---&gt;&gt;&gt;&gt; xml

    xml报文与对象间的转换

    最近做项目数据传输这块最后采用了xml报文的形式来进行传输,所以特地写了一个工具类分享出来,支持xml报文和java对象间的相互转换。采用的是JAXB的形式,可快速解析。具体步骤已经单独写了一个文档放进去了。

    JAXB Unmarshalling @XmlAnyElement

    解决List&lt;Object&gt; 没法转 具体对象问题 SOAP +XML JAXB Unmarshalling @XmlAnyElement

    xml-process.rar

    使用JDOM,JAXB,SAX技术,实现对象和xml之间的相互转换。包括单个对象的转换,list的转换。

    JaxbUtil.java

    JAXB工具类,xml和java对象相互转换的工具类,支持List直接转xml

    漂移:基于注释的Java库,用于创建Thrift可序列化的类型和服务

    客户端库类似于JAX-RS(HTTP Rest),而序列化库类似于JaxB(XML)和Jackson(JSON),但适用于Thrift。 例子 以下接口定义了Scribe服务器的客户端: @ThriftService public interface Scribe { @ThriftMethod ...

    xjc-inst:用于实例化的 XJC 插件

    它还提供了将集合生成为 Set 而不是 List 的功能。 命令行中的用法: xjc [ -Xinst-fields | -Xinst-lists | -Xinst-sets ] ... 与 Maven 一起使用: 首先使用mvn install 然后添加到您的 pom.xml 文件中。 ...

    spring-framework-reference4.1.4

    Composing XML-based configuration metadata .......................................... 25 Using the container .......................................................................................... ...

    spring-framework-reference-4.1.2

    Composing XML-based configuration metadata .......................................... 25 Using the container .......................................................................................... ...

Global site tag (gtag.js) - Google Analytics