一、Hibernate检索
1、Hibernate提供五种检索数据的方式
1)导航对象图检索方式:根据已加载的对象导航到其他对象。
Customer c = (Customer)session.get(Customer.class, 1); // 持久态对象
c.getOrders().size(); // c 对象关联 order 集合 ,hibernate 会自动检索 order数据
2)OID检索方式:根据对象的OID来检索对象。
session.get/session.load
3)HQL检索方式:使用面向对象的HQL查询语言
session.createQuery(hql);
4)QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口。
session.createCriteria(Xxx.class);
5)本地SQL检索方式:使用本地数据库的SQL查询语句。
session.createSQLQuery(sql);
2、HQL是Hibernate最常用检索方式。
支持所有SQL支持检索方式。
步骤:
1)获得Session
2)编写HQL
3)通过session.createQuery(hql)创建Query对象
4)为Query对象设置条件参数
5)执行查询list()---返回一个集合列表、uniqueResult();---返回一个查询结果
*Query接口支持方法链编程风格,将上面所有步骤写入一句程序代码中。
3、编写测试用例,创建初始数据
创建4个Customer,每个Customer 创建 10个 Order
package lsq.hibernate.domain;
import java.util.HashSet;
import java.util.Set;
public class Customer {
private Integer id;
private String name;
private int age;
// 关联多个order
private Set<Order> orders = new HashSet<Order>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
package lsq.hibernate.domain;
public class Order {
private Integer id;
private String address;
private Double money;
// 关联一个客户
private Customer customer;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
Order.hbm.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="lsq.hibernate.domain.Order" table="orders" catalog="hibernate3day3">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="address"></property>
<property name="money"></property>
<many-to-one name="customer" class="lsq.hibernate.domain.Customer" column="customer_id" ></many-to-one>
</class>
</hibernate-mapping>
Customer.hbm.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="lsq.hibernate.domain.Customer" table="customers" catalog="hibernate3day3">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<property name="age"></property>
<!-- 由一方控制级联,将外键维护权交给多方 -->
<set name="orders" cascade="all-delete-orphan" inverse="true">
<key column="customer_id"></key>
<one-to-many class="lsq.hibernate.domain.Order"/>
</set>
</class>
</hibernate-mapping>
hibernate.cfg.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- JDBC基本连接参数 -->
<session-factory> <!-- 理解为连接池 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate3day3</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置方言 -->
<property name=