基于java反射的类型转换工具类

1 篇文章 0 订阅

适用于数据持久层pojo对象转换数据传输层DTO

utils.TypeConverter

import cn.temp.tempbeans.api.dto.ValidDTO;
import cn.temp.tempbeans.pojo.User;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/***
 * author:zjhChester
 * date:2020-07-01
 * environment: jdk1.8
 * 适用场景:适用于数据持久层pojo对象转换数据传输层DTO
 */
public class TypeConverter {
	public <T, S> T convert(S s, Class<T> clz) throws IllegalAccessException, 

InstantiationException {
        //获取输出对象的属性列表
        Field[] f1 = clz.getDeclaredFields();

        Map<String,Object> map = new HashMap<>();
        for (Field f : f1) {
            //将输出对象的属性名装入map
            map.put(f.getName(),null);
        }
        //获取输入对象的属性列表
        Field[] f2 = s.getClass().getDeclaredFields();
        for (Field f : f2) {
            //便利执行  匹配输入对象的属性名
          if(map.containsKey(f.getName())){
              //设置私有属性可见性
              f.setAccessible(true);
              try {
                  //属性一致则将输入对象的属性值存放到的map的以对应属性名为key的

值中   覆盖原来的null
                  map.put(f.getName(),f.get(s));
              } catch (IllegalAccessException e) {
                  e.printStackTrace();
              }
          }
        }
        //反射获取输出对象实例
        T t = clz.newInstance();
        for (Map.Entry<String,Object> e:map.entrySet() ) {
            //过滤map中的空值对象,即无匹配属性
            if(e.getValue()!=null){
                    for (Field f : f1) {
                        f.setAccessible(true);
                        //将符合 map的key==输出对象的属性名     并且map的

value.getClass() == 输出对象的属性类型
                        if(f.getName().equals(e.getKey())&&map.get(f.getName())!

=null && f.getType().equals(map.get(f.getName()).getClass())){
                            //存放到输出对象的属性中
                            f.set(t,e.getValue());
                        }
                    }
            }
        }
        //返回输出对象
        return t;
    }

    public static void main(String[] args) throws InstantiationException, 

IllegalAccessException {
        User user = new User();
        user.setId(1);
        user.setUsername("zjh");
        ValidDTO convert = new TypeConverter().convert(user, ValidDTO.class);
        System.out.println(user);
        System.out.println(convert);
    }
}


dto.ValidDTO

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
//swaggerModel描述
@ApiModel("valid数据格式检测注解测试")
public class ValidDTO {

    @NotNull(message = "id不能为空")
    private Integer id;

    /***    swaggerModel成员变量描述
     *     @ApiModelProperty注解如果注释类型是integer 等基本类型包装类 需要赋初值
      */
    @ApiModelProperty("ValidDTOName")
    @NotBlank(message = "name不能为空")
    private String username;

    @ApiModelProperty("ValidDTOEmail")
    @Email(message = "邮箱格式不对")
    @NotBlank(message = "邮箱不能为空")
    private String email;

    @Max(value = 10,message = "money长度超长")
    private Integer money;

    /**
     * 不写message的默认提示:cn.temp.tempbeans.conf.Exception - 最大不能超过2
     */
    @Max(value = 2)
    private Integer age;
}

pojo.User

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
@ApiModel("用户对象")
public class User {
//    @ApiModelProperty(value = "用户id")
//    @NotNull(message = "id不能为空")
    private Integer id;
//    @ApiModelProperty(value = "用户username")
//    @NotBlank(message = "username不能为空")
    private String username;
//    @ApiModelProperty(value = "用户password")
//    @NotBlank(message = "password不能为空")
    private String password;




}

结果

13212312

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于JDBC实现自定义持久层框架可以分为以下几个步骤: 1. 设计数据访问接口:首先,你需要定义数据访问接口,包括插入、更新、删除和查询等操作的方法。这些方法应该是通用的,可适用于不同的实体类。 2. 编写实现类:接下来,你需要编写具体的实现类来实现数据访问接口。在这个实现类中,你可以使用JDBC来连接数据库,并执行SQL语句。 3. 定义实体类:为了与数据库中的表进行映射,你需要定义实体类。这些实体类应该与数据库表的结构相对应,并且包含与表中列对应的属性。 4. 建立连接:在进行数据库操作之前,你需要建立与数据库的连接。可以使用JDBC提供的`java.sql.Connection`对象来创建连接。 5. 执行SQL语句:通过使用JDBC提供的`java.sql.Statement`或`java.sql.PreparedStatement`对象,你可以执行SQL语句。可以通过编写动态SQL语句或使用预编译语句来实现各种操作。 6. 处理结果集:对于查询操作,你需要处理返回的结果集。可以使用JDBC提供的`java.sql.ResultSet`对象来遍历结果集并获取数据。 7. 关闭连接:完成数据库操作后,记得关闭连接以释放资源。可以使用`java.sql.Connection`对象的`close()`方法关闭连接。 通过以上步骤,你可以基于JDBC实现自定义持久层框架。当然,在实际应用中,你还可以考虑使用连接池、事务管理等技术来提高性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值