写道
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(Java Architecture for XML Binding)是Java提供的一种标准API,它允许我们轻松地在Java对象(javabean)和XML文档之间进行转换。通过JAXB,开发者可以避免手动编写XML解析和序列化代码,极大地提高了开发...
在Java开发中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个技术对于处理XML数据,尤其是解析和生成XML文档非常有用。当我们面临XML文档中存在嵌套子...
JAXB (Java Architecture for XML Binding) 是 Java 中用于对象到XML以及XML到对象转换的API。它使得开发者能够轻松地将Java对象模型映射到XML文档,并反之亦然。在给定的例子中,我们将深入理解如何使用JAXB注解来...
**标题:“JAXB解析XML为对象例子”** 在Java开发中,XML作为一种常见的数据交换格式,经常被用于存储和传输数据。Java Architecture for XML Binding(JAXB)是Java平台的标准API,它允许开发者将Java对象绑定到...
本示例涉及的核心知识点是将Java中的List对象与XML文档进行相互转换。这里,我们使用的库是dom4j-1.6.1.jar,这是一个强大的Java XML处理库。 首先,让我们详细了解一下List和XML。List是Java集合框架的一部分,它...
当处理XML文件时,有时我们需要将其内容转换为Java对象,如List,以便于操作和处理。本篇文章将深入探讨如何将XML转换为指定类型的List数组,并涉及多层数据结构的处理。 1. **Java XML解析库** 在Java中,有多种...
在Java世界中,Java Architecture for XML Binding(JAXB)是一个强大的工具,用于将Java对象转换为XML文档,以及从XML文档反序列化回Java对象。本篇将详细讲解如何使用JAXB结合List实体来实现XML的读写操作。 首先...
当我们需要将XML格式的字符串转换为List对象时,这通常涉及到数据解析的过程。这篇博客“xml格式的字符串转换成List”提供了相关的方法和步骤,以下是对这个主题的详细讲解。 首先,理解XML字符串。XML字符串是由一...
一个`Map`对象存储键值对,可以使用各种库如`JAXB (Java Architecture for XML Binding)`、`DOM (Document Object Model)`或`SAX (Simple API for XML)`来实现转换。以`JAXB`为例,它提供了一种方便的方式来映射Java...
在这些情况下,可能需要使用更强大的库,如JAXB(Java Architecture for XML Binding)或DOM(Document Object Model)API来实现更精细的控制。然而,对于简单的对象序列化需求,`XMLEncoder`和`XMLDecoder`是相当...
使用JAXB进行对象到XML的转换:创建一个JAXBContext实例,然后使用其createMarshaller方法生成Marshaller对象,最后调用marshal方法将对象转换为XML。import javax.xml.bind.JAXBContext;import javax.xml.bind....
JAXB(Java Architecture for XML Binding)是一种将Java对象与XML文档绑定的技术。它可以用于将Java对象序列化为XML格式,也可以将XML文档反序列化为Java对象。在处理XML文档时,经常会出现一个问题:如何将一个...
总结一下,XML转实体类和实体类转XML涉及的主要知识点有:Java反射API、XML解析(DOM、SAX、StAX、JAXB),以及对象的序列化和反序列化。在实际开发中,我们需要根据项目需求选择合适的工具和方法,确保数据的准确...
**Java Architecture for XML Binding (JAXB) 2.0** 是一个Java标准,它提供了一种将XML数据与Java对象之间进行自动转换的机制。这个技术是Java平台企业版(Java EE)的一部分,也是Java标准版(Java SE)的一个可选...
前段时间找了好久xml与object之间的转换都没找到!最近在学习WebService,讲到JAXB!没听说过!看了才知道jdk中自带了这个功能,什么这个...List Map 继承 接口 数据类型不一至的一异常 父子类的转换 <<<<--->>>> xml
**2.4 JAVA对象转成XML文件** 反之,将Java对象转换为XML文件,可以使用`Marshaller`: ```java Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_...
- 如果XML结构简单,没有复杂的嵌套,可以使用JAXB将XML解析为Java对象,然后手动将其转换为Map。例如,如果你有一个只有一个根元素且没有子元素的XML,你可以创建一个对应的Java类,并使用JAXB的`Unmarshaller....
JAXB(Java Architecture for XML Binding)是Java平台标准版(Java SE)的一部分,它提供了一种方便的方式来映射Java对象到XML,以及从XML反向映射到Java对象。本篇文章将深入探讨JAXB注解解析XML的相关知识。 ###...
最近做项目数据传输这块最后采用了xml报文的形式来进行传输,所以特地写了一个工具类分享出来,支持xml报文和java对象间的相互转换。采用的是JAXB的形式,可快速解析。具体步骤已经单独写了一个文档放进去了。