首页 > 编程语言 >jfinal JFinal使用技巧-Record转JavaBean以及List转JavaBea

jfinal JFinal使用技巧-Record转JavaBean以及List转JavaBea

时间:2024-12-03 17:14:14浏览次数:4  
标签:return List JavaBea Record Bean key Java class

本文原作者jfinal 社区大牛杜福忠,我因为感 觉有用搬一下:

功能需求:

这是一个泛型方法,接受一个 Record 对象和一个目标 Bean 的 Class 对象作为参数,返回一个转换后的 Bean 对象。

方法内部通过反射创建 Bean 的实例,然后遍历 Bean 的所有属性,从 Record 对象中获取相应的值并设置到 Bean 的属性中。
    

// 导入JFinal框架中的Record类,用于表示数据库记录
import com.jfinal.plugin.activerecord.Record;

// 导入Java Beans API,用于获取Java Bean的属性信息
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

// 导入Java反射API,用于动态创建对象
import java.lang.reflect.Constructor;

// 导入Java集合框架中的ArrayList和List接口,用于处理列表数据
import java.util.ArrayList;
import java.util.List;

// 忽略未使用的警告
@SuppressWarnings("unused")
public class RecordToBean {

    /**
     * 将单个Record对象转换为指定类型的Java Bean对象。
     *
     * @param r    要转换的Record对象
     * @param clazz 目标Java Bean的Class对象
     * @param <T>  目标Java Bean的类型
     * @return 转换后的Java Bean对象
     */
    public static <T> T to(Record r, Class<T> clazz) {
        try {
            // 使用反射创建目标Java Bean的实例
            T ret = clazz.getDeclaredConstructor().newInstance();
            
            // 获取目标Java Bean的所有属性描述符
            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
            
            // 遍历所有属性,从Record对象中获取相应的值并设置到Java Bean的属性中
            for (PropertyDescriptor pd : pds) {
                Object value = getValue(r, pd);
                pd.getWriteMethod().invoke(ret, value);
            }
            
            return ret;
        } catch (Exception e) {
            // 如果有任何异常,抛出一个RuntimeException
            throw new RuntimeException(e);
        }
    }

    /**
     * 将Record对象列表转换为指定类型的Java Bean对象列表。
     *
     * @param list  要转换的Record对象列表
     * @param clazz 目标Java Bean的Class对象
     * @param <T>   目标Java Bean的类型
     * @return 转换后的Java Bean对象列表
     */
    public static <T> List<T> to(List<Record> list, Class<T> clazz) {
        try {
            // 使用反射获取目标Java Bean的构造器
            Constructor<T> constructor = clazz.getDeclaredConstructor();
            
            // 获取目标Java Bean的所有属性描述符
            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
            
            // 创建一个与Record列表大小相同的Java Bean列表
            List<T> ret = new ArrayList<>(list.size());
            
            // 遍历Record列表,对每个Record对象进行转换
            for (Record r : list) {
                T obj = constructor.newInstance();
                for (PropertyDescriptor pd : pds) {
                    Object value = getValue(r, pd);
                    pd.getWriteMethod().invoke(obj, value);
                }
                ret.add(obj);
            }
            
            return ret;
        } catch (Exception e) {
            // 如果有任何异常,抛出一个RuntimeException
            throw new RuntimeException(e);
        }
    }

    /**
     * 根据属性描述符从Record对象中获取属性值。
     *
     * @param r     要获取值的Record对象
     * @param pd    属性描述符,表示要获取的属性
     * @return 属性值
     */
    private static Object getValue(Record r, PropertyDescriptor pd) {
        String key = pd.getName(); // 获取属性名
        Class<?> type = pd.getPropertyType(); // 获取属性类型
        
        // 根据属性类型从Record对象中获取相应的值
        if (String.class.equals(type)) {
            return r.getStr(key);
        } else if (Integer.class.equals(type)) {
            return r.getInt(key);
        } else if (Boolean.class.equals(type)) {
            return r.getBoolean(key);
        } else if (java.math.BigDecimal.class.equals(type)) {
            return r.getBigDecimal(key);
        } else if (Long.class.equals(type)) {
            return r.getLong(key);
        } else if (java.math.BigInteger.class.equals(type)) {
            return r.getBigInteger(key);
        } else if (java.util.Date.class.equals(type)) {
            return r.getDate(key);
        } else if (Double.class.equals(type)) {
            return r.getDouble(key);
        } else if (Float.class.equals(type)) {
            return r.getFloat(key);
        } else if (java.time.LocalDateTime.class.equals(type)) {
            return r.getLocalDateTime(key);
        } else if (Short.class.equals(type)) {
            return r.getShort(key);
        } else if (Byte.class.equals(type)) {
            return r.getByte(key);
        } else if (Number.class.equals(type)) {
            return r.getNumber(key);
        }
        
        // 如果类型不匹配,则使用通用的get方法获取值
        return r.get(key);
    }

}

测试使用:

public static class MyBean{
    private String a;
    public void setA(String a) {
        this.a = a;
    }
    private BigDecimal b;
 
    public void setB(BigDecimal b) {
        this.b = b;
    }
    //get...
    @Override
    public String toString() {
        return "MyBean{" +
                "a='" + a + '\'' +
                ", b=" + b +
                '}';
    }
}
 
public static void main(String[] args) {
    Record r = new Record();
    r.set("a", "A");
    r.set("b", "888");
    MyBean t = RecordToBean.to(r, MyBean.class);
    System.out.println(t);
 
    List<Record> list = new ArrayList<>();
    list.add(r);
    list.add(r);
    List<MyBean> rs = RecordToBean.to(list, MyBean.class);
    System.out.println(rs);
}

 

标签:return,List,JavaBea,Record,Bean,key,Java,class
From: https://www.cnblogs.com/ZzwWan/p/18584525

相关文章

  • 牛客---HJ48 从单向链表中删除指定值的节点(用ArrayList模拟链表,因为方便查找操作)
    示例代码importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);......
  • 【数据结构】LinkedList与链表
    LinkedList与链表1.ArrayList的缺陷2.链表2.1链表的概念及结构2.2链表的实现3.链表面试题【本节目标】ArrayList的缺陷链表链表相关ojLinkedList的模拟实现LinkedList的使用ArrayList和LinkedList的区别1.ArrayList的缺陷上节课已经熟悉了ArrayList的使用,......
  • 在PbootCMS中如何使用[list:isico]变量判断文章是否有缩略图?
    在PbootCMS中,[list:isico] 变量用于判断文章是否上传了缩略图。通过这个变量,你可以在模板中灵活地控制文章列表中的图片显示逻辑。以下是详细的使用方法和示例:理解[list:isico]变量:[list:isico] 是一个布尔变量,返回值为1表示文章已上传缩略图,返回值为0表示文章未上传缩略图......
  • JavaScript操作addEventListener监听触发事件
    JavaScript的addEventListener方法允许你为指定的HTML元素添加事件监听器。以下是一些常见的事件类型,可以使用addEventListener来监听它们:1,点击事件(click)点击事件(click):当用户点击元素时触发。element.addEventListener('click',function(){console.log......
  • JavaScript操作DOM元素的classList
    在JavaScript中,classList是一个DOM元素属性,它提供了一组方法来添加、移除和切换元素的类名。classList属性返回一个DOMTokenList集合,表示元素的类名。这个集合提供了几个非常有用的方法,我们可以方便地对元素的类名进行操作,包括添加、移除、切换类名等。1,添加类名add(class1......
  • Lsky Pro挂载alist
    首先需要去修改lsky代码,如果是docker可以dockerexec-itlsky-pro/bin/bash然后安装个vimaptinstallvimcdappcdServices/lsviImageService.php然后vim输入:setnu显示行号,然后找到345行,粘贴进去'authType'=>1,lwebdav存储策略问题·Issue#497·lsky-org......
  • python - 列表(list)
    创建一个列表时,系统会分配一定的空间,当新增元素个数超出这个空间时,会自动进行扩容。这个结论很容易找到,我们可以写一段代码证明一下,内存占用是阶段变化的。fromsysimportgetsizeofli=[]foriinrange(64):li.append(i)print(f'length:{len(li)},size:{get......
  • Java面试要点54 - Java List的二分查找算法
    文章目录一、引言二、二分查找的基本原理三、JavaCollections工具类中的二分查找四、自定义比较器的二分查找实现五、处理特殊情况六、性能优化与最佳实践七、总结一、引言在Java程序开发中,查找操作是一个非常基础且关键的算法需求。其中,二分查找(BinarySearch)......
  • 执行SQL发生错误!错误:Unknown column 'sortdesc' in 'field list'
    根据错误信息,您遇到的问题是因为SQL语句中引用了一个不存在的列 sortdesc。以下是几种可能的解决方案:检查列名:确认SQL语句中引用的列名 sortdesc 是否正确。可能是拼写错误或列名不匹配。使用 DESCRIBEtable_name; 或 SHOWCOLUMNSFROMtable_name; 查看表的结......
  • MATLAB中listdlg函数用法
    目录语法说明示例显示颜色列表用于进行多选显示当前文件夹文件用于进行单选        listdlg函数的功是创建列表选择对话框。语法[indx,tf]=listdlg('ListString',list)[indx,tf]=listdlg('ListString',list,Name,Value)说明[indx,tf]=listdlg('List......