动态遍历QBean对象的所有属性

时间:2022-04-20 19:16:41

最近一个叫queryDSl的框架与数据库打交道,经过一番测试,觉得这个框架的确好用,它没有像hibernate那样那么庞大,又不像mybatis那样移植性不好。但是看了一些人的保存操作是一个一个的字段写的,本人觉得太过于繁锁,若一个表有四、五十个字段或者更多的话,工作量将会无比庞大。因此,本人摸索出了一个可以动态遍历一个QBean所用属性的方法,可避免前面提到的那种弊端。



/**
     * 添加或者更新的方法,可通用,需要传入一个dto以及Qbean对象,若id为空,则是插入,不为空,则是更新操作
     *
     * @param qBean
     * @param dto
     * @return
     */
     @SuppressWarnings("all")
    public OrgBaseRoomsDto saveOrUpdate(QRooms qBean, RoomsDto dto) {

        // 获取dto的反射对象,动态完善插入或者更新语句
        Class clazz = dto.getClass();

        // 获取全部的字段属性,不包括那些以fk,pk结尾的字段
        Path[] ps = qBean.all();

        // 获取id,判断id是否为空
        String id = dto.getId();
        if (id == null) {// id为空,插入操作

            id = IdGenerator.genId();
            dto.setId(id);

            SQLInsertClause insert = queryFactory.insert(qBean);
            for (Path path : ps) {
                String fieldName = path.getMetadata().getName();
                try {

                  StringBuilder sb = new StringBuilder("get");

                    // 将字段首字母大写
                   
                    char[] cs = fieldName.toCharArray();
                    cs[0] -= 32;
                    String temp = new String(cs);
                  
                    sb.append(temp);
                
                    Method getMethod = clazz.getMethod(sb.toString(), null);
                    Object value = getMethod.invoke(dto, null);

                    insert.set(path, value);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
            insert.execute();

        } else {// id不为空,更新操作
            update(qBean,dto);
        }

        return dto;
    }


/**
     * 添加或者更新的方法,可通用,需要传入一个dto以及Qbean对象,若id为空,则是插入,不为空,则是更新操作
     *
     * @param qBean
     * @param dto
     * @return
     */
     @SuppressWarnings("all")
    public OrgBaseRoomsDto saveOrUpdate(QRooms qBean, RoomsDto dto) {

        // 获取dto的反射对象,动态完善插入或者更新语句
        Class clazz = dto.getClass();

        // 获取全部的字段属性,不包括那些以fk,pk结尾的字段
        Path[] ps = qBean.all();

        // 获取id,判断id是否为空
        String id = dto.getId();
        if (id == null) {// id为空,插入操作

            id = IdGenerator.genId();
            dto.setId(id);

            SQLInsertClause insert = queryFactory.insert(qBean);
            for (Path path : ps) {
                String fieldName = path.getMetadata().getName();
                try {
                    // 将字段首字母大写
                    StringBuilder sb = new StringBuilder("get");
                    char[] cs = fieldName.toCharArray();
                    cs[0] -= 32;
                    String temp = new String(cs);
                    // 完善get方法名
                    sb.append(temp);
                    // 获取get方法,获取get值
                    Method getMethod = clazz.getMethod(sb.toString(), null);
                    Object value = getMethod.invoke(dto, null);

                    System.out.println(getMethod.getName() + "=======" + value);
                    // 完善插入语句
                    insert.set(path, value);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
            insert.execute();

        } else {// id不为空,更新操作
            update(qBean,dto);
        }

        return dto;
    }


值得说明的是。dto实际上就相当于一个javaBean