1.Hibernate简介
Hibernate框架是当今主流的Java持久层框架之一,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。
2.为什么使用Hibernate
代码精简易读
封装了JDBC操作,以面向对象的方式操作数据
开发工作量小,可以将精力集中在业务逻辑的处理上
3.流行的ORM框架
Hibernate:
非常优秀、成熟的 ORM 框架。
完成对象的持久化操作
Hibernate 允许开发者采用面向对象的方式来操作关系数据库。
消除那些针对特定数据库厂商的 SQL 代码
myBatis:
相比 Hibernate 灵活高,运行速度快
开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能
TopLink
OJB
4.Hibernate具有以下几点优势
对JDBC做了轻量级封装,简化了持久层的代码重复性。
是一个优秀的ORM实现,简化了DAO层编码工作。
使用Java的反射机制并实现透明性。
支持关系型数据库,从一对一到多对多的各种复杂关系可扩展性强,当功能不够用时,可以自行编码进行扩展
5.Hibernate用法
在Hibernate执行过程中通常会用到5个核心接口,分别为:Configuration接口、SessionFactory接口、Session接口、Transaction接口和Query接口。Hibernate的执行流程
6.Hibernate开发步骤
1. 创建 Hibernate配置文件
2. 创建持久化类
3. 创建对象-关系映射文件
4. 通过 HibernateAPI 编写访问数据库的代码
持久化类的编写应该遵循以下规则
持久化类中必须提供无参数public构造器
所有属性使用private修饰并提供public的setter和getter方法
必须提供标识OID,与数据库表的主键对应
持久化类属性应尽量使用基本数据类型对应的包装类型
持久化类不要使用final修饰,否则将无法产生代理对象
Hibernate的核心文件
Hibernate映射文件用于向Hibernate提供,将对象的持久化到关系型数据库中的相关信息,每个映射文件的的结构基本都是相同的,其普遍的代码形式如下:
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="XXX"table="xxx">
<id name="id"column="id">
<generator class="native"/>
</id>
<propertyname="XXX" column="xxx" type="string" />
</class>
</hibernate-mapping>
示例配置文件
注:要建在src下
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配制文件的dtd信息 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--数据库驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!--连接数据库的url -->
<property name="hibernate.connection.url">
jdbc:mysql:///hibernate?characterEncoding=utf8
</property>
<!--数据库的用户名 -->
<property name="hibernate.connection.username">
root
</property>
<!--数据库的密码 -->
<property name="hibernate.connection.password">
root
</property>
<!-- C3P0连接池设定 -->
<!-- 使用c3po连接池 配置连接池提供的供应商 -->
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以毫秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,
就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位 -->
<property name="c3p0.idle_test_period">3000</property>
<!--其它配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!--自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 用来关联hbm配置文件 -->
<mapping resource="com/ruanyuan/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
package com.ruanyuan.domain;
/***
* 客户实体类
* @author Administrator
*
*/
public class Customer {
private Integer id; //主键id
private String name; //姓名
private Integer age; //年龄
private String sex; //性别
private String city; //所在城市
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", age=" + age
+ ", sex=" + sex + ", city=" + city + "]";
}
}
映射文件
<?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>
<!-- name代表的是实体类名 talbe代表的是表名 -->
<class name="com.ruanyuan.domain.Customer" table="customer">
<!-- name=id 代表的是customer类中属性
column=id 代表的是table表中的字段 -->
<id name="id" column="id">
<generator class="native"/><!-- 主键生成策略 -->
</id>
<!-- 其它属性使用property标签来映射 -->
<property name="name" column="name" type="string" />
<property name="age" column="age" type="integer" />
<property name="sex" column="sex" type="string"/>
<property name="city" column="city" type="string"/>
</class>
</hibernate-mapping>
package com.ruanyuan.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
//声明一个私有的静态final类型的Configuration对象
private static final Configuration config;
//声明一个私有的静态final类型的SessionFactory对象
private static final SessionFactory factory;
//通过静态代码块构建SessionFactory
static {
config = new Configuration().configure();
factory = config.buildSessionFactory();
}
//提供一个公有的静态方法供外部获取,并返回一个sesison对象
public static Session getSession() {
return factory.openSession();
}
}
测试类
package com.ruanyuan.test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import com.ruanyuan.domain.Customer;
import com.ruanyuan.util.HibernateUtils;
public class QBCTest {
// qbc查询全部
@Test
public void qbcTest1() {
Session session = HibernateUtils.getSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> cs = criteria.list();
for (Customer c : cs) {
System.out.println(c);
}
session.getTransaction().commit();
session.close();
}
// 只返回一个值
@Test
public void qbcTest2() {
Session session = HibernateUtils.getSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
// criteria.add(Restrictions.eq("id", 1)).add(Restrictions.eq("name",
// "李四")); // where id=1 and name="李四"
criteria.add(Restrictions.and(Restrictions.eq("id", 1),
Restrictions.eq("name", "王五")));
Customer c = (Customer) criteria.uniqueResult();
System.out.println(c);
session.getTransaction().commit();
session.close();
}
// where id=1 or name="王五"
@Test
public void qbcTest3() {
Session session = HibernateUtils.getSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.or(Restrictions.eq("id", 1),
Restrictions.eq("name", "王五"))); // where id=1 or name="李四"
List<Customer> cs = criteria.list();
for (Customer c : cs) {
System.out.println(c);
}
session.getTransaction().commit();
session.close();
}
// 分页
@Test
public void qbcTest4() {
Session session = HibernateUtils.getSession();
session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<Customer> cs = criteria.list();
for (Customer c : cs) {
System.out.println(c);
}
session.getTransaction().commit();
session.close();
}
}