Hibernate 学习笔记第一篇

ORM 框架出世的原因:

  1> 对象模型中对象与对象之间的关联关系在关系形数据库中无法一一对应。

  2> 对象模型中对象的继承关系在关系型数据库中无法表示。

  3> 对象模型中对象与对象的等值性在关系型数据库中表示困难。

  4> 对象模型中有关联的对象之间的导航访问在关系型数据库中无法实现。

 以上因原就是通常所说的对象模型与关系型数据库的主抗不匹配,所以市场上需要一个做这样关系映射的中间件。

 ORM 技术实现的产品

  JBOSS 公司的Hibernate ,Oracle 公司的TopLink,Apache 组织的OJB,SUN公司的JDO。

 Hibernate 概述:

 hibernate 是由JBOSS 公司的架构师 Gavin king 设计,开发的一个开源的ORM框架。

  1>它是连接java程序与关系型数据库的中间件。

  2>它对JDBC 的API做了轻量级的封装,用来处理java对象的执久化工作。

  3>分层架构处于执久层,封装了所有数据库的实现细节,使业务逻辑层可以专注于业务逻辑的实现。

  4>它是一个ORM工具,能够建立面向对象的域模型与关系模型的映射。

 Hibernate 的下载和配置:

 1>到官方网站http://www/hibernate.org/6.html下载hibernate-distribution-3.3.2.GA

 2>解压后在根目录下有hibernate3.jar 它是hibernate 的核心包,把它放入到项目的CLASSPATH中,

   在lib/required 包下有hibernate 所依赖的jar包,把它放入到项目的CLASSPATH中。

   说明:

   hibernate 3.3 与 hibernate3.2 版本的比较:

   1> 把字节码处理的类由三个asm.jar asm-attrs.jar cglib-2.1.5jar换成了javassist-3.9.0.GA.jar.

      注:所以Hibernate3.3后字节码增强就由javassist.jar 处理。如果你还打算使用 cglib.jar 那么你需要自己手动的更改。

      必须在hibernate.properties 中编码 hibernate.bytecode.provider=cglib 。把cglib的jar包放入到CLASSPATH中,只有上述方       法起作用,

      不可以放到到hibernate.cfg.xml,或是web.xml中。

   2> 把通用日志commons-logging.jar 换成了 slf4j-api-1.5.8.jar,但仍然需要添加slf4j-log4j12-1.5.8.jar 和log4j-1.2.15.jar.

  添加配置hibernate 的全局配置文件:

  Hibernate框架需要配置一些全局的配置文件,一般这个文件被取名成hibernate.cfg.xml[hibernate.properties],这个文件在

  hibernate 解压包根目录下 project/etc下, 可以把hibernate.cfg.xml 复制到项目的src下。

  hibernate.cfg.xml 内容如下:

 <?xml version="1.0" encoding="ISO-8859-1"?>

<!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://127.0.0.1/hibernate2</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">root</property>

<property name="hibernate.connection.isolation">2</property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="hibernate.show_sql">true</property>

<property name="hibernate.hbm2ddl.auto">update</property>

<property name="hibernate.format_sql">true</property>

     <mapping class="com/wlzx/modle/Book.hbm.xml"/>

     </session-factory>

</hibernate-configuration>

   hibernate.cfg.xml 参数说明:

   hibernate.connection.driver_class: 与项目关联的数据库驱动类,本例为MySQL 

   hibernate.connection.url :               与项目关系的数据地址

   hibernate.connection.username :    数据库用户名

   hibernate.connection.password :    数据库密码

   hibernate.connection.isolation:       数据库的事务机制 2为read_commit 配合乐观锁的使用

   hibernate.dialect :                  数据库的方言

   hibernate.show_sql :                      是否显示SQL 语句

   hibernate.hbm2ddl.auto :           根据 hibernate的配置文件成生 数据库表结构,有以下可以配置

  #hibernate.hbm2ddl.auto create-drop

#hibernate.hbm2ddl.auto create

#hibernate.hbm2ddl.auto update

#hibernate.hbm2ddl.auto validate  

hibernate.format_sql:                   是不是要格式化SQL  默认 false

<mapping class="com/wlzx/modle/Book.hbm.xml"/> : 对应此实体类的hibernate 配置文件

第一个Hibernate应用程序:

 执久化类就是其实例数据要被执久化到数据库中的类,通常是领域模型实体类,hibernate 中的执久化类就是一个PO.

 hibernate po 中的规定:

   1> 提供一个对象标识(OID)的属性,

   2> 为所有的属性提供getters(),setters()方法。

   3> 有一个默认的构造方法。

   4> 如果属性是集合类型,则必须定义成接口类型 list set map.

   5> 如果类要实现可序列化,就必须实现java.io.Serializable.

   6> 实体类不能定义成final ,否则影响懒加载的执行,在调用load方法时会立刻发送SQL 语句。

 第一步:准备实体类  

   public class Book {

     private int id;

     private int version;

     private String bookName;

     private double money;

     private Date printTime;

        getters();

        setters(); 

    }

 第二步:对此实体类编写对应的配置文件Book.hbm.xml ,此文件必须与实体类放入到同一个目录下

    <?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.wlzx.modle.Book" table="book">

<id name="id" column="id">

<generator class="native" />

</id>

<version name="version"></version>

<property name="bookName" column="book_name" type="string" not-null="true" />

<property name="money" />

<property name="printTime"></property>

</class>

</hibernate-mapping>

    标签说明:

    class : 用来定义一个执久化类及对应的数据库 

       table : 给执化化数据库的表名起一个别名

    id:     指定每个持久化类的唯一标识,对应数据库表中的主键。

       column :给此id在数据库表中起一个别名

       generator: 指定对象标识符的生成器名

       class:     生成器把对象标识符的生成工作由底层数据库完成。

    version: 乐观锁

    property :指定持久化类的每一个要映射到数据库表的字段的属性信息。

       name:  对应持久化类中的属性名,

       column:对应要执久化到数据库中的表中字段名, 

       type:  指定要执化到数据库中的字段类型。 

       not-null: 到数据库中是否可以为空。

  第三步:在hibernate.cfg.xml 配置此文件的存入地址

  <mapping resource="com/wlzx/modle/Book.hbm.xml"/> 

    注: 对应此实体类的hibernate 配置文件 包名要以"/" 分开。

  第四步:生成对应的数据库表结构

      create table book (

        id integer not null auto_increment,

        version integer not null,

        bookName varchar(255),

        money double precision,

        printTime datetime,

        primary key (id)

    );

   第五步:执行测试

      1> 创建工厂 SessionFactory 工具类

  public class HibernateUtil {

   static Configuration config = new Configuration().configure();

   public static SessionFactory getSessionFactory(){

    return config.buildSessionFactory();

   }

}

     2> 做单元测试

@Test

public void bookTest() throws ParseException{

DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Session session = sessionFactory.openSession();

   Transaction tran =  session.beginTransaction();

Book book = new Book();

book.setBookName("EJB 权威指南");

book.setMoney(89.98);

String time ="2010-12-25 12:22:30";

Date parseDate =  format.parse(time);  

book.setPrintTime(parseDate);

session.save(book);

  tran.commit();

}

原文地址:https://www.cnblogs.com/java20130726/p/3218411.html