框架——Hibernate

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();
}


}









猜你喜欢

转载自blog.csdn.net/qq_39212006/article/details/80567477
今日推荐