可以处理 public 个字段的 BeanPropertySqlParameterSource 模拟

Analog of BeanPropertySqlParameterSource that can handle public fields

我有一个简单的模型,我想使用 Spring JDBCTemplate 将其实例保存在 MySQL 中。我使用使用简单 sql (insert into user(id, email...) value (:id, :email...)) 保存模型对象的 DAO。是否有任何框架可以从模型中提取参数(当模型只是具有 public 字段的 POJO 时)。所以,我需要类似于 Spring 的 BeanPropertySqlParameterSource 的东西,但能够使用 public 字段而不是属性。

模型示例class:

public class User {
    public int id;
    public String email;
    public String login;
    public String password;
}

我知道扩展AbstractSqlParameterSource可以解决我的问题,但我希望找到现有的框架。

UPD

基于AbstractSqlParameterSource的实现:

public class PublicFieldsSqlParameterSource extends AbstractSqlParameterSource {

    Map<String, Object> props = new HashMap<>();

    public PublicFieldsSqlParameterSource(Object object) {
        Field[] fields = object.getClass().getFields();
        for (Field field : fields) {
            String name = field.getName();
            try {
                Object value = field.get(object);
                props.put(name, value);
            } catch (IllegalAccessException ignored) {
            }
        }
    }

    @Override
    public boolean hasValue(String paramName) {
        return props.containsKey(paramName);
    }

    @Override
    public Object getValue(String paramName) throws IllegalArgumentException {
        return props.get(paramName);
    }
}

正如我在评论中提到的,如果不想要 getter/setters 的原因是代码混乱,我会推荐 Lombok

这里是一个典型的模型class,可以通过Spring构造(@NoArgsConstructor + @Data for getters and setters)。 @Builder@AllArgsConstructor 允许生成包含所有字段的构建器模式。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SubscriptionData {

    @Id
    @Indexed
    private UUID key;

    private String productId;

    private String receiptString;

    private Date expirationDate;

}

这是一个带有构造函数注入的 Spring 服务示例。 @RequiredArgsConstructor 使用所有未初始化的 final 字段创建一个构造函数,并且 onConstructor 参数向其添加 Spring-@Autowired 注释。如果您有很多服务依赖项,这可以消除很多混乱。

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__({ @Autowired }))
public class OperatorServiceImpl implements OperatorService {

  private final WhoisService whoisService;

  ...
}