Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

1、hibernate 也可以通过标准的 SQL 进行查询

(1)、将SQL查询写在 java 代码中

/**
 * 查询所有
 */
@Test
public void testQuery(){
    // 基于标准的 sql 语句查询
    String sql = "select * from t_person";
    // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
    SQLQuery query = session.createSQLQuery(sql);
    // 因为是基于表的操作,所以返回的是标准值的Object数组
    List<Object[]> list = query.list();
    for(Object[] objs : list){
        System.out.println(Arrays.toString(objs));
    }
}

@Test
public void testQuery2(){
    // 基于标准的 sql 语句查询
    String sql = "select * from t_person";
    // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
    SQLQuery query = session.createSQLQuery(sql);
    // 指定查询结果与某个持久化类绑定
    query.addEntity(Person.class);
    List<Person> list = query.list();
    for(Person p : list){
        System.out.println(p);
    }
}

@Test
public void testQuery3(){
    // 基于标准的 sql 语句查询
    String sql = "select * from t_person where id in (:ids)";
    // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类
    SQLQuery query = session.createSQLQuery(sql);
    // 指定查询结果与某个持久化类绑定
    query.addEntity(Person.class);
    // 绑定参数
    query.setParameterList("ids", new Object[]{3,6,9});
    List<Person> list = query.list();
    for(Person p : list){
        System.out.println(p);
    }
}

(2)、将SQL语句写在配置文件中

配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
    <sql-query name="mysqlquery">
        <![CDATA[select * from t_person where id < :id]]>
    </sql-query>
</hibernate-mapping>

java 代码:

@Test
public void testQuery4(){
    Query query = session.getNamedQuery("mysqlquery");
    query.setInteger("id", 8);
    List<Object[]> list = query.list();
    for(Object[] objs : list){
        System.out.println(Arrays.toString(objs));
    }
}

2、数据抓取策略

数据抓取通过持久化映射文件来配置,代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
    <class name="Person" table="t_person">
        <id name="id" column="person_id">
            <generator class="native"/>
        </id>
        <property name="name" column="t_name"/>
        <property name="age"/>
        <property name="passwork"/>
        <property name="birthday"/>
        <!--
            fetch 数据抓取策略
                join 表示通过连接语句,将关联的数据获取到,立即查询
                select(默认) 表示通过另外的一条sql语句查询出关联数据,要用到的时候才会发起查询,延迟查询
                subselect 通过另外的一条SQL语句查询,要用到时候才会发起查询,延迟查询
         -->
        <set name="addres" cascade="all" inverse="true" fetch="join">
            <!-- 指定 addres 集合中的数据对应t_person的的一个外键 -->
            <key column="p_id"/>
            <!-- 指定Person 关联的实例类型 -->
            <one-to-many class="Address"/>
        </set>
    </class>
    <class name="Address" table="t_address">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="zipCode"/>
        <property name="address"/>
        <!--
            多的一端使用 many-to-one 进行配置
        -->
        <many-to-one name="person" column="p_id"/>
    </class>
</hibernate-mapping>

java代码如下:

/**
 * 批量写入数据
 */
@Test
public void testAdd(){
    tx = session.beginTransaction();
    for(int i = 0; i < 10; i++){
        Person person = new Person("ldh_"+i, 22+i, 123456+i, new Date());

        Set<Address> addSet = new HashSet<Address>();
        for(int j = 0; j < 10; j++){
            Address add = new Address("5000"+i+j,"湖南郴州"+j);
            add.setPerson(person);
            addSet.add(add);
        }
        person.setAddres(addSet);

        session.persist(person);
        if(i % 10 == 0){
            session.flush();
            session.clear();
        }
    }
    tx.commit();
}

@Test
public void testQuery(){
    Person p = (Person)session.get(Person.class, 1);
    System.out.println(p);
    System.out.println(p.getAddres().size());
}

3、批量抓取

持久化映射文件代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="learn.hibernate.bean">
    <class name="Person" table="t_person">
        <id name="id" column="person_id">
            <generator class="native"/>
        </id>
        <property name="name" column="t_name"/>
        <property name="age"/>
        <property name="passwork"/>
        <property name="birthday"/>
        <!--
            fetch 数据抓取策略
                join 表示通过连接语句,将关联的数据获取到,立即查询
                select(默认) 表示通过另外的一条sql语句查询出关联数据,要用到的时候才会发起查询,延迟查询
                subselect 通过另外的一条SQL语句查询,要用到时候才会发起查询,延迟查询

            如果查询的数据比较多可以用 batch-size 来提高搜索
            例如:batch-size="3" 批量抓取,表示每次查询出三条关联数据,如果有10条记录,那么会分四次查询出来
         -->
        <set name="addres" cascade="all" inverse="true" batch-size="3">
            <!-- 指定 addres 集合中的数据对应t_person的的一个外键 -->
            <key column="p_id"/>
            <!-- 指定Person 关联的实例类型 -->
            <one-to-many class="Address"/>
        </set>
    </class>
    <class name="Address" table="t_address">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="zipCode"/>
        <property name="address"/>
        <!--
            多的一端使用 many-to-one 进行配置
        -->
        <many-to-one name="person" column="p_id"/>
    </class>
</hibernate-mapping>

java 代码如下:

@Test
public void testQuery2(){
    Query query = session.createQuery("from Person");
    List<Person> list = query.list();
    for(Person p : list){
        System.out.println(p);
        System.out.println("------------------------");
        Set<Address> adds = p.getAddres();
        Address[] arr = new Address[adds.size()];
        adds.toArray(arr);
        System.out.println(Arrays.toString(arr));
    }
}

可以查看:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html

时间: 2024-10-23 17:17:20

Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取的相关文章

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Hibernate学习---第六节:数组&amp;list&amp;map&amp;set的映射配置

1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类

Hibernate学习---第七节:关联关系

一.关联关系一对一外键(双向) 1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的) * 属性通常建议提供 getter/setter 方法 * 持久化类不能使用 fi

hibernate学习笔记之四(Hibernate中的类型)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) Hibernate中的类型 在*.hbm.xml文件中,<property name="password" column="t_pass">,hibernate根据type转换将java转换成hibernate类型,然后再转换成SQL类型,<property name="password" type="...&q

Hibernate学习---第十二节:Hibernate之锁机制&amp;乐观锁实现

1.悲观锁 它指的是对数据被外界修改保持保守态度,因些,在整个数据处理过程中,将数据牌锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层的锁机制才能保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据). 一个典型的悲观锁调用示例: select * from account where name = "12345" for update 通过for update子句,这条SQL锁定了account表中所有符合检索条件的记录.本次事务

hibernate学习笔记02-- eclipse 下 hibernate+mysql 的实现。

hibernate 环境的配置步骤: 加入 hibernate 所需的 jar 包,并将这些 jar 添加到 project 中,如图: hibernate.cfg.xml 的建立.hibernate 的 hibernate.cfg.xml 配置文件默认在 project/src 目录下,如图: hibernate.cfg.xml 中的内容如下(当然,这是从 hibernate 的参考文档中拷贝过来的,还未修改): <?xml version='1.0' encoding='utf-8'?>

Hibernate学习---第五节:普通组件和动态组件

一.普通组件映射配置 1.创建组件类,代码如下: package learn.hibernate.bean; /** * 组件类 */ public class Phones { private String companyPhone; private String homePhone; private String personalPhone; public Phones() { } public Phones(String companyPhone, String homePhone, St

Hibernate学习---第四节:一级缓存

一.Hibernate 一级缓存的概念: 一级缓存生命周期很短与 session 生命周期一致,所以一级缓存也叫 session 级缓存或事务级缓存.位于缓存中的对象处于持久化状态,它和表中的相关记录对应,session 能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库中表的记录,这一过程称为清理缓存. (1).一级缓存实现原理.session 缓存是由它的实现类 sessionImpl 中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象,保持它的生命周期不会结束

Hibernate学习---第十节:Hibernate之QBC、样例查询&amp;离线查询

一.QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成 1.java 代码如下: /** * 查询所有 */ @Test public void testQuery(){ // 获取 Criteria 对象 Criteria criteria = session.createCriteria(Person.class); List<Person> list = criteria.list(); for(Perso