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

Java 可以处理公共字段的BeanPropertySqlParameterSource的模拟,java,spring-jdbc,Java,Spring Jdbc,我有一个简单的模型,我想使用SpringJDBCTemplate将其实例保存在MySQL中。我使用DAO,它使用简单的sql(插入到用户(id,email…)值(:id,:email…)保存模型对象。是否有任何框架可以从模型中提取参数(当模型只是带有公共字段的POJO时)。因此,我需要类似于Spring的BeanPropertySqlParameterSource,但能够处理公共字段而不是属性 模型类的示例: public class User { public int id;

我有一个简单的模型,我想使用SpringJDBCTemplate将其实例保存在MySQL中。我使用DAO,它使用简单的sql(
插入到用户(id,email…)值(: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);
    }
}
公共类PublicFieldsSqlParameterSource扩展了AbstractSqlParameterSource{
Map props=newhashmap();
public PublicFieldsSqlParameterSource(对象){
Field[]fields=object.getClass().getFields();
用于(字段:字段){
字符串名称=field.getName();
试一试{
对象值=field.get(对象);
道具放置(名称、值);
}捕获(IllegalAccessException被忽略){
}
}
}
@凌驾
公共布尔值(字符串参数名){
返回props.containsKey(paramName);
}
@凌驾
公共对象getValue(字符串paramName)引发IllegalArgumentException{
返回props.get(paramName);
}
}

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

这里是一个典型的模型类,它可以由Spring构造(
@noargsconstuctor
+
@Data
用于getter和setter)
@Builder
@allargsconstuctor
允许生成包含所有字段的生成器模式

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

    @Id
    @Indexed
    private UUID key;

    private String productId;

    private String receiptString;

    private Date expirationDate;

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

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

  private final WhoisService whoisService;

  ...
}

现有的框架称为JavaBeans。为您的字段添加公共访问器,这样您就可以自然地使用库了。这就是编码约定的目的。@SkinnyJ我当然知道javabean,但它们的通用性是有限的。我相信在我的例子中使用公共字段是很好的。您能详细说明一下不向您的用户类添加getter/setter的原因吗?它是现有的API吗?如果不是,原因是不要让getter/setter污染您的类,我建议使用lombok:来生成访问器。我们在Spring中广泛使用Lombok,它可以删除很多只用于约定的代码,但会降低代码的可读性。您没有回答问题本身,但您的答案是最有用的。使用Lombok我可以避免使用样板代码,而使用常规的
BeanPropertyRowMapper