Hibernate 4.x 再学习系列 1 ORM

1.持久化

狭义理解,持久化指把对象永久保存到数据库中.

广义理解: 持久化包括和数据库相关的各种操作

  • 保存:把对象永久保存到数据库中。
  • 更新:更新数据库中对象(记录)的状态。
  • 删除:从数据库中删除一个对象。
  • 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
  • 加载:根据特定的OID,把一个对象从数据库加载到内存中

  OID: 为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。

在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier,即OID).

2.ORM

ORM(Object/Relation Mapping): 对象/关系映射

 

 

3.Hibernate - 优秀的ORM框架

 

1).创建 Hibernate 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
        
<hibernate-configuration>
    <session-factory>
    
        <!-- 配置连接数据库的基本信息 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.75.134:3306/hibernate_test01</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">mysql</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!-- 执行操作时是否在控制台打印出 SQL -->
        <property name="show_sql">true</property>
        
        <!-- 是否对 SQL 进行格式化 -->
        <property name="format_sql">true</property>
        
        <!-- 指定自动生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>
        
        <!-- 设置Hibernate 的事务隔离级别为READ COMMITED,值2 -->
        <!-- <property name="hibernate.connection.isolation">2</property> -->
        
        
        <!-- 配置 C3P0 数据库连接池 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.timeout">2000</property>
        <property name="hibernate.c3p0.idle_test_period">2000</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        
        
        <!-- 设定JDBC的 Statement从数据库读取数据时每次读取的记录条数 -->
        <property name="hibernate.jdbc.fetch_size">100</property>
        
        <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
        <property name="hibernate.jdbc.batch_size">30</property>
        
        <!-- 指定管理关联的hbm.xml文件-->
        <mapping resource="org/xtony/hibernate/entities/Worker.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

 

2).创建持久化 Java 类

  • 提供一个无参的构造器: 使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
  • 提供一个标识属性(identifier property):  通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
  • 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
  • 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成CGLIB 代理.
  • 重写 eqauls 和 hashCode 方法:  如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法

    Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因

3). 创建对象关系映射文件(*.hbm.xml)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-3-14 22:40:02 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="org.xtony.hibernate.entities.News" table="NEWS" dynamic-update="true">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" />
        </property>
        <property name="author" type="java.lang.String">
            <column name="AUTHOR" />
        </property>
        <property name="date" type="java.util.Date">
            <column name="DATE" />
        </property>
        
        <!-- 配置派生属性值 -->
        <property name="desc" formula="(select concat(author,':',title) from NEWS n where n.ID = id)"></property>
    </class>
</hibernate-mapping>

4).通过 Hibernate API 编写访问数据库的代码

public class HibernateTest
{

    @Test
    public void test()
    {
        //1.创建一个SessionFactory对象
        SessionFactory sessionFactory = null;
        
        //1.1)创建一个Configuration对象: 对应hibernate的基本配置信息和对象映射信息
        Configuration configuration = new Configuration().configure();
        
        
        //4.0之前这样创建
//        sessionFactory = configuration.buildSessionFactory();
        
//        创建一个ServiceRegistry对象: hibernate4.x 新添加的对象,hibernate的任何配置和服务都要在该对象注册后才能有效
        StandardServiceRegistry  serviceRegistry = 
                new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        
        
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        
        //2.创建一个Session对象
        
        Session session = sessionFactory.openSession();
        
        //3.开启事务
        
        Transaction transaction = session.beginTransaction();
        
        //4.执行保存操作
        News news = new News("Java", "atguigu", new Date(new java.util.Date().getTime()));
        session.save(news);
        
        //5.提交事务
        transaction.commit();
        
        //6.关闭Sessioin
        session.close();
        
        //6.关闭SessionFactory
        sessionFactory.close();
    }

}

 

posted @ 2015-03-16 17:03  chgxtony  阅读(228)  评论(0编辑  收藏  举报