package jef.database; import java.sql.SQLException; /** * 持有一个查询结果,以及对应的resultset中的记录 * * @author Administrator * * @param <T> */ public class RecordHolder<T extends IQueryableEntity> { private T object; private RecordsHolder<T> parent; int status = 0;// 1表示是删除的,-1表示是已经删除的 int index;// 0表示rs的第一条记录。 public static final int INSERT = -1; public static final int INSERTED = -2; public static final int DELETE = -3; public static final int DELETED = -4; public static final int CACNLED = -5; int getStatus() { return status; } boolean isInsert() { return status == INSERT; } boolean isInserted() { return status == INSERTED; } boolean isBeingDelete() { return status == DELETE; } boolean isDeleted() { return status == DELETED; } void setDeleted() { if (this.status == DELETE) { this.status = DELETED; } else { throw new IllegalArgumentException("the record is not about to delete."); } } void setInserted() { if (this.status == INSERT) { this.status = INSERTED; } else { throw new IllegalArgumentException("the record is not about to insert."); } } RecordHolder(RecordsHolder<T> parent, int index, T object) { this.parent = parent; this.index = index; if (index < 0) status = INSERT; this.object = object; } /** * 获得记录对应的Entity Bean * * @return */ public T get() { if (status == DELETED) return null; return object; } /** * 更新此条记录。并提交到数据库。最后释放游标 * * @throws SQLException * @retuen true返回是否更新了记录 */ public boolean commit() throws SQLException { return parent.commit() > 0; } /** * 删除此条记录,并提交到数据库 * * @throws SQLException */ public void delete() throws SQLException { if (status == INSERT) { this.status = CACNLED; } else if (status == INSERTED) { throw new UnsupportedOperationException("Can not delete a record inseted right now."); } else if (status == DELETED) { throw new UnsupportedOperationException("Can not delete a record deleted right now."); } else { this.status = DELETE; } parent.commit(); } /** * 关闭当前ResultSet,如果有未提交的修改直接丢弃 * * @throws SQLException */ public void close() throws SQLException { parent.close(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("index:").append(index).append('\t'); sb.append(status); return sb.toString(); } }