Hibernate基础知识

一、Hibernate初识

1、ORM:(Object/Relationship Mapping)--对象/关系映射

2、写SQL语句的缺点:

  a.不同的数据库使用的SQL语法不同。比如:PL/SQL(oracle数据库)与T/SQL(微软版本)

  b.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL,Oracle--rownumber、MySQL---使用关键字limit、SQLServer----还可以使用top关键字

  c.程序过分依赖SQL对程序的一直及扩展,维护等带来很大的麻烦。

3、Hibernate是一种能够减少对SQL语句依赖,可行的ORM框架技术。

  1)Hibernate简介

    Hibernate是java领域的一款开源的ORM框架技术

    Hibernate对JDBC进行了非常轻量级的对象封装

  2)Hibernate在我们的应用程序中充当着什么样的角色呢?

    举例,如下图所示:我们要开发不同的系统

    持久化层 --- 处于业务逻辑层和数据库之间的一个角色

    作用 -- 把程序中生成的对象持久化到数据库中,换句话说,就是把这些对象通过对象关系映射保存到数据库的表中

  3)其他主流的ORM框架技术

    ①MyBatis: 前身就是著名的iBatis

    ②Toplink:后被Oracle收购,并重新包装为Oracle AS TopLink

    ③EJB:本身是JAVAEE的规范

  

 

编写Hibernate例子的步骤:

  (1)创建Hibernate的配置文件(hibernate.cfg.xml)

  (2)创建持久化类

  (3)创建对象-关系映射文件

  (4)通过HIbernate API编写访问数据库的代码 

 hibernate必须的jar包:

  hibernate-release-4.2.4.Final\lib\required;

  Mysql的JDBCjar包:mysql-connecttor-java-5.1.7-bin.jar;

  Junit4的jar包:junit-4.10.jar

导入hibernate,Junit,mysql的驱动包步骤

  1.创建一个普通的java工程

  2.构建用户类库:windows --> preferences --> java --> build path --> user libraries --> new...(创建类库文件) --> Add Extra jars...(导入jar包)

  3.添加用户类库:在项目名上右键 --> properties --> java build path --> libraries --> Add libraries --> user libraries --> 勾选上 --> 完成

 

Hibernate配置文档(cfg.xml)

 

<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernamte.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>

编写持久化类(实体类),持久化类的设计原则要遵循javabean的设计原则,设计原则有四点:

  1. 这个类是一个公有类

  2. 提供公有的不带参数的默认的构造方法

  3. 属性要私有化private

  4. 属性要用setter/getter封装

创建对象关系映射文件

  1.src -> New -> other - > Hibernate -> Hibernate XML Mapping file (hbm.xml) 选择需要映射的刚创建的实体类,会将创建的字段和数据库字段进行映射。

  2.在cfg.xml中配置文件声明:<mapping resource="Student.hbm.xml" ></mapping>

使用Junit进行测试

  @Before 初始化方法

  @Test 测试注释标签

  @After 释放资源

/**新版本方法
 * 在eclipse中可以查看数据库的,具体步骤:Winows->Show view->other->Data soure Explorer即可。
 * 一定要导数据库的jar包。数据库浏览器(Data soure Explorer)的jar包和项目的
 * jar包并不能通用,需分别倒入。
 * 使用数据库逆向生成实体类的小伙伴,一定要在数据库中设置主键,要不就等着报错吧!!!!!!!
 */
public class StudentTest {
    private SessionFactory sessionfactory;
    private Session session;
    private Transaction transaction;
    @Before
    public void init() {
        Configuration configuration = new Configuration().configure();
/*注意,并不调用ServiceRegistry方法,而且在新版本中调用该方法有几率会出现一定的错误.
老师讲的课是由实体类直接生成的hbm.xml文件,会在hibernate.cfg.xml中的<session-factory>中生成一个
name属性,即<session-factory name="">,把name属性删除,否则会报错
*/
        sessionfactory = configuration.buildSessionFactory();
        session = sessionfactory.openSession();
        transaction = session.beginTransaction();
    }
    
    @Test
    public void studentTest() {
        Student student=new Student(1,"zhanhgsa","man",new Date());
        session.save(student);
    }

    @After
    public void destory() {
        transaction.commit();
        session.close();
        sessionfactory.close();
    }
}
Junit测试

 

 

二、Hibernate进阶

1.hibernate.cfg.xml常用配置

2.session简介

3.transaction简介

4.session详解

5.对象关系映射常用配置

  

1、Hibernate常用配置

hibernate.cfg.xml配置文档的常用配置.

程序在运行的时候会读取hibernate.cfg.xml配置文档,从而实现连接数据库,并且生成表结构.

设置了<property name="show_sql">true</property>与<property name="format_sql">true</property>则会把hibernate运行时对数据库的操作时的sql语句会显示在控制台并且格式化.

<property name="hbm2ddl.auto">create</property>即重新删除表结构再创建.所以之前的记录消失.

<property name="hbm2ddl.auto">update</property>它不会删除表结构也不会创建新的表结构,会保留原有的数据,只是更新.没有"hbm2ddl.auto"属性一样也是可以添加新的数据,会保留原有的数据.

<property name="hibernate.default_schema">hibernate</property>则在控制台输出的sql语句中,会在表名之前加上数据库名.

  

 

2、session简介

  1.不建议直接使用jdbc的connection操作数据库,而是通过session操作数据库。

  2.session可以理解为操作数据库的对象,操作数据库之前必须先获取session的实例

  3.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。

  4.把对象保存到关系数据库中需要调用session的各种方法:save(),update(),delete(),createQuery

  

 

3、transaction简介

Transaction事务简介:

  1. hibernate对数据库的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务并且没有手工提交事务,对象并不会真正保存在数据库中。

  2. 如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(注意:通常并不推荐这样做)

   综上,我们必须开启事务。

 

  使用Session的doWork()方法提交事务(需要重写execute()方法,在方法中设置connection自动提交事务)。需要注意的是:在使用save()方法后并不会真正输出sql语句,需要调用flush()强制输出sql语句才可以。然后因为采用了自动提交方式(setAutoCommit(true)),数据才真正保存在数据库。

  

 

4、session详解

如何获得session对象?

  (1)openSessionion

  (2)getCurrentSession

  如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

    如果是本地事务(jdbc事务) <property name="hibernate.current_session_context_class">thread</property>

    如果是全局事务(jta事务)    <property name="hibernate.current_session_context_class">jta</property>

 

1,事务: 事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做

2,JDBC事务:JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。

3,JTA事务:提供了跨数据库连接(或其他JTA资源)的事务管理能力

 

openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;

getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这是与openSession的区别之一 ;

一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;

 

openSession与getCurrentSession的区别:

(1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSesssion需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出!

(2)openSession每次创建新的session对象,getCurrentSession使用现有的session对象

 

5、对象关系映射常用配置 hbm.xml

<hibernate-mapping
  schema="schemaName" //模式的名字
  catalog="catalogName" //目录的名称
  default-cascade="cassade_style" //级联风格
  default-access="field/property/CalssName" //访问策略
  default-lazy="true/false" //加载策略
  package="packagename" //默认包名
/>
<class
  name="ClassName" //对应映射的类
  table="tableName" //对应映射数据库的表
  batch-size="N" //抓取策略,一次抓取多少记录
  where="condition" //条件 eg:抓取条件
  entity-name="EntiyName" //如果需要映射多张表
/>
<id //表的主键
  name="propertyName" //对应的属性
  type="typeName" //对应类型
  column="column_nam" //映射数据库中表当中字段名的名称
  length="length" //指定长度
  <generator class="generatorClass">//主键生成策略
/>
hbm.xml

  1、代理主键:是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式。

  2、自然主键:指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录。

   

 

 

 

posted @ 2018-12-05 13:42  silence丶秋枫  阅读(150)  评论(0编辑  收藏  举报