spring jpa 使用rowMapper 解决联合主键为空 (基本数据映射 只需继承后添加联合主键类)

本文介绍了如何在Spring JPA中使用RowMapper处理联合主键的情况。通过创建一个抽象的BasicMapper类,实现了从ResultSet到对象的基本数据映射。该映射类检查字段类型,支持基本数据类型,并提供了自定义类型映射的抽象方法。通过这种方式,可以方便地将数据库记录映射为带有联合主键的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import org.springframework.jdbc.core.RowMapper;
import java.lang.reflect.Field;
import java.math.BigDecimal;


public abstract class BasicMapper<T> implements RowMapper<T> {

private Class<T> targetClazz;
public BasicMapper(Class<T> targetClazz) {
this.targetClazz = targetClazz;
}
@Override
public T mapRow(ResultSet rs, int arg1) throws SQLException {
T obj = null;
try {
obj = (T) targetClazz.newInstance();
Field[] fields = targetClazz.getDeclaredFields();
for (Field field : fields) {
String columnName = field.getName().toUpperCase();
if (isNULL(rs, columnName) || isCustomType(field)) {
boolean isAccessible = field.isAccessible();
field.setAccessible(true);
if (isBasicType(field)) {
field.set(obj, rs.getObject(columnName));
} else if (isCustomType(field)) {
@SuppressWarnings("unchecked")
T obj1=(T) field.getType().newInstance();
Field[] fields2 = obj1.getClass().getDeclaredFields();
for (Field field2 : fields2) {
String columnName1 = field2.getName().toUpperCase();
if (isNULL(rs, columnName1)) {
boolean isAccessible1 = field2.isAccessible();
field2.setAccessible(true);
if (isBasicType(field2)) {
field2.set(obj1, rs.getObject(columnName1));
}
field2.setAccessible(isAccessible1);
}
}
field.set(obj, obj1);
}
field.setAccessible(isAccessible);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
/**
* 此方法用于自定类型,类对象映射,
* 被映射的子类对象不能有自定义类型(如有自定类型 会映射不上)
* @param field 反射的单个属性
* @return  
*/
protected abstract boolean isCustomType (Field field) ;

private boolean isBasicType(Field field){
if (field.getType() == int.class ||field.getType() ==Integer.class) { // int
return true;
} else if (field.getType() == boolean.class || field.getType() == Boolean.class) { // boolean
return true;
} else if (field.getType() == String.class) { // string
return true;
} else if (field.getType() == float.class) { // float
return true;
} else if (field.getType() ==double.class || field.getType() == Double.class) { // double
return true;
} else if (field.getType() == BigDecimal.class) { // bigdecimal
return true;
} else if (field.getType() == short.class || field.getType() == Short.class) { // short
return true;
} else if (field.getType() == Date.class ||java.util.Date.class.isAssignableFrom(field.getType())) { // date
return true;
} else if (field.getType() == Timestamp.class) { // timestamp
return true;
} else if (field.getType() == Long.class || field.getType() == long.class) { // long
return true;
}
return false;
}
private  boolean isNULL(ResultSet rst,String columnName){
try {
if(rst.findColumn(columnName)>0){
return  true;
}
} catch (Exception e) {
return  false;
}
return false;
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值