可以处理 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;
...
}
我有一个简单的模型,我想使用 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;
...
}