BeanPropertySqlParameterSource的模拟,可以处理公共字段

时间:2015-07-27 13:55:30

标签: java spring-jdbc

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

模型类的示例:

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);
    }
}

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,如果不想要getter / setter的原因是代码混乱,我建议Lombok

这是一个典型的模型类,可以由Spring(@NoArgsConstructor + @Data为getter和setter构建)。 @Builder@AllArgsConstructor允许生成包含所有字段的Builder模式。

@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;

  ...
}