@Override
public T getEntity(Integer id) {
return (T) sf.getCurrentSession().get(clazz, id);
}
//下面是关于这个参数clazz的细节描述
在构造函数里面通过手段取得泛型化超类
/**这里重点说下泛型T,这是个抽象类,必然得有子类
如果userDao extends BaseDaoImpl<User>
* 如果OrderDao extends BaseDaoImpl<Order>
* 所以这个泛型是让子类继承它的时候要在后边指定类型的,你一旦指定
* 了这个类型,所有下边的方法里的参数就是这个类型了,非常方便,它是动态的
*
* 但是我在超类当中我得拿到T的具体类型,这里怎么拿到T的类型呢?
*
* 在java基础中讲过,一个对象的创建包括整个家族树的创建
* UserDaoImpl在创建的时候要走构造函数,构造函数中的第一条语句要么
* 是super要么是this,super:是调用父类的构造函数
* this:是调用自己的另外的构造函数
* 所以在超类的构造函数当中,你就有机会拿到子类的信息,
* this取的是子类的对象
* UserDaoImpl{
* super(); this();
* }
*
**/
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
SessionFactory sf;
//在这里加了一个构造函数 我不管你是User还是Order类,它们的构造都得调用
//父类的构造,在这里父类的构造函数里面this.getClass()取的是子类的描述符
//genericSuperclass 得到泛型化超类 然后再得到泛型化参数
private Class clazz;
public BaseDaoImpl(){
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class) type.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
}
@Override
public void saveEntity(T t) {
// TODO Auto-generated method stub
sf.getCurrentSession().save(t);
}
@Override
public void updateEntity(T t) {
// TODO Auto-generated method stub
sf.getCurrentSession().update(t);
}
@Override
public void deleteEntity(T t) {
// TODO Auto-generated method stub
sf.getCurrentSession().delete(t);
}
//这个属于批量写操作 update users set name =? where ?
@Override
public void executeByHQL(String hql, Object... objects) {
// TODO Auto-generated method stub
Query q = sf.getCurrentSession().createQuery(hql);
for(int i=0;i<objects.length;i++){
q.setParameter(i, objects[i]);
}
q.executeUpdate();
}
@Override
public T getEntity(Integer id) {
//这里是关于这个参数clazz的细节描述
return (T) sf.getCurrentSession().get(clazz, id);
}
@Override
public List<T> findByHQL(String hql, Object... objects) {
// TODO Auto-generated method stub
return null;
}
}
while(it.hasNext()){ // 这里指的就是一行row hbase
Result r = it.next();
//得到列族的集合
NavigableMap<byte[], byte[]> map = r.getFamilyMap(Bytes.toBytes("f1"));
//对集合进行遍历,集合中的每个元素是Entry
for(Map.Entry<byte[],byte[]> entrySet :map.entrySet()){
进入r.getFamilyMap
/**
Map of qualifier to values 列到值得映射
**/
public NavigableMap<byte[], byte[]> getFamilyMap(byte[] family) {
这是列 这是值
//返回值是 这个数组-》这个数组的映射
这是列名 long这是时间戳 byte[]是值
public NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> getMap() {
这是列族 这个是这个列族下的所有列以及它的值
@Test
public void scan3() throws IOException {
//创建conf对象
Configuration conf = HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询tableName对象
TableName tname = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tname);
Scan scan =new Scan();
//可以指定区间来扫描
scan.setStartRow(Bytes.toBytes("row0000001"));
scan.setStopRow(Bytes.toBytes("row0000100"));
final ResultScanner rs = table.getScanner(scan);
Iterator<Result> it = rs.iterator();
while(it.hasNext()){
Result r = it.next();
//这里是得到一行的所有map
//key(byte[])就是列族 value=Map<Col,Map<Timestamp,value>> 这个列下有很多版本
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map =r.getMap();
//对它进行迭代,每一个都是一个Entry 类型是 byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>
for(Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entrySet:map.entrySet()){
//这里就拿到了key即列族
String family = Bytes.toString(entrySet.getKey());
//这里拿到的值就是所有列的数据的map
NavigableMap<byte[], NavigableMap<Long, byte[]>> colDataMap = entrySet.getValue();
for(Map.Entry<byte[], NavigableMap<Long, byte[]>> ets:colDataMap.entrySet()){
// 这里拿到key即列
String col = Bytes.toString(ets.getKey());
//再拿到值,还是一个map 这是一个时间戳和值
NavigableMap<Long, byte[]> valueMap = ets.getValue();
//因为key是时间戳value是byte[]
for(Map.Entry<Long,byte[]> e:valueMap.entrySet()){
Long key = e.getKey();
String value =Bytes.toString(e.getValue()) ;
}
}
}
}
}