Java 可以处理公共字段的BeanPropertySqlParameterSource的模拟
我有一个简单的模型,我想使用SpringJDBCTemplate将其实例保存在MySQL中。我使用DAO,它使用简单的sql(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;
插入到用户(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
。