JPA反射机制实现对象获取-1

本文介绍了一个用于解析Java持久化应用程序(JPA)中POJO类信息的实用工具类。该工具能够获取POJO对应的表名、主键名称,并计算列信息列表等。适用于需要进行数据库操作的场景。

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

private static final Log log = LogFactory.getLog(JPASupport.class);

private static final long serialVersionUID = 1L;

/*
* 用于存放POJO的列信息
*/
private transient static Map<Class<? extends JPASupport>, List<String>> columnMap = new HashMap<Class<? extends JPASupport>, List<String>>();

/**
* 获取POJO对应的表名
* 需要POJO中的属性定义 @Table(name)
*
* @return String
*/
public String tableName()
{
log.debug("loading JAPSupport method tableName..");

Table table = this.getClass().getAnnotation(Table.class);

if (null != table)
{
return table.name();
}
else
{
throw new RuntimeException("undefine POJO @Table, need Tablename(@Table)..");
}
}

/**
* 获取POJO对应的主键名称
* 需要POJO中的属性定义 @Id
*
* @return String
*/
public String id()
{
log.debug("loading JAPSupport method id..");
log.debug(this.getClass().getName());

for (Field field : this.getClass().getDeclaredFields())
{
if (field.isAnnotationPresent(Id.class))
{
return field.getName();
}
}

throw new RuntimeException("undefine POJO @Id..");
}

/**
* 用于计算类定义
* 需要POJO中的属性定义 @Column(name)
*/
public void caculationColumnList()
{
if (columnMap.containsKey(this.getClass()))
{
return;
}

Field[] fields = this.getClass().getDeclaredFields();
List<String> columnList = new ArrayList<String>(fields.length);

for (Field field : fields)
{
if (field.isAnnotationPresent(Column.class))
{
columnList.add(field.getName());
}
}

columnMap.put(this.getClass(), columnList);
}

/**
* 获取用于WHERE的 有值字段表
* @return List
*/
public List<WhereColumn> returnWhereColumnsName()
{
Field[] fields = this.getClass().getDeclaredFields();
List<WhereColumn> columnList = new ArrayList<WhereColumn>(fields.length);

for (Field field : fields)
{
if (field.isAnnotationPresent(Column.class) && !isNull(field))
{
columnList.add(new WhereColumn(field.getName(),field.getGenericType().equals(String.class)));
}
}

return columnList;
}

/**
* Where条件信息
*/
public class WhereColumn
{
public String name;

public boolean isString;

public WhereColumn(String name, boolean isString)
{
this.name = name;
this.isString = isString;
}
}

/**
* 用于获取Insert的字段累加
* @return String
*/
public String returnInsertColumnsName()
{
StringBuilder sb = new StringBuilder();

List<String> list = columnMap.get(this.getClass());
int i = 0;

for (String column : list)
{
if (isNull(column))
{
continue;
}

if (i++ != 0)
{
sb.append(',');
}

sb.append(column);
}

return sb.toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值