Hibernate笔记1

来源:互联网 发布:数据恢复精灵破解 编辑:程序博客网 时间:2024/04/30 11:21

源地址:http://blog.csdn.net/xiaojianfengye1/article/details/7980497

1.   Hibernate开发步骤

1.1建立JavaEE项目

1.2导入相关的jar包

必须导入的jar包(版本号可能有变动):

antlr-2.7.6.jar一个语言转换工具,Hibernate利用它实现 HQL 到 SQL 的转换

commons-collections-3.1.jarcollectionsApache 的工具集,用来增强Java对集合的处理能力

dom4j-1.6.1.jar     dom4j XML 解析器

hibernate3.jar  Hibernate核心包

javassist-3.9.0.GA.jar    代码生成工具, Hibernate用它在运行时扩展 Java类

jta-1.1.jar标准的 JAVA 事务处理接口

log4j.jarhibernate使用的一个日志系统,结合slf4j-api-1.5.8.jar和slf4j-log4j12.jar一起使用

slf4j-api-1.5.8.jar

slf4j-log4j12.jar

mysql-connector-java-5.1.7-bin.jar 数据库驱动(这个看使用什么数据库就用什么jar包)

1.3创建数据库表

1.4创建域对象(JavaBean对象,实体)

1.5创建说明实体和表的映射关系的[映射文件]Xxx.hbm.xml

Xxx.hbm.xml通常放在和实体同一个包下。Xxx为实体的名字,即类名(简单名字)。

1.6创建[配置文件]hibernate.cfg.xml

一般情况下配置hibernate.cfg.xml放在src的根目录下,即要保证它在classpath下。

1.7创建测试类

2.什么是hibernate?为什么要使用hibernate?

2.1 jdbc/dbutils不足之处

   1)底层代码较多(JDBC)

   2)SQL代码写死在代码,不能够动态生成(JDBC/DBUTILS)[最大的缺陷]

   3)代码中,需要在关系和对象之间调用访问(JDBC)

2.2什么是hibernate?

    A开源的持久层框架.

    BORM映射工具,建立面向对象的域模型和关系数据模型之间的映射.

    C对JDBC进行复杂封装,负责java对象的持久化(CURD).

    D在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。

2.3为什么要使用hibernate?

A hibernate主要解决持久层的一切问题。

B hibernate对JDBC访问数据库的代码做了封装,动态产生SQL,大大简化了数据访问层繁琐的重复性代码。

C hibernate是一个基于jdbc的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。

D hibernate使用java的反射机制增强程序类实现透明性 。

E hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。

3.Hibernate入门例子详解

需求:对顾客(Customer)进行增删改查(CRUD)

3.1创建数据库表

customers.sql:

use jdbcdemo;

droptable ifexists customers;

createtable ifnotexists customers(

      idintprimarykey auto_increment,

      namevarchar(10),

      ageint,

      desvarchar(50)

);

3.2创建实体类Customer

publicclass Customer {

      private Integerid;

      private Stringname;

      private Integerage;

      private Stringdes//顾客描述

省略setter和getter……

}

3.3创建映射文件Customer.hbm.xml

映射文件通常放在和实体类同一个包下,名字为通常为:类名.hbm.xml(建议)。

也可以使用其他名字,但为了见名知义,通常是[类名.hbm.xml]。

该文件主要的作用是告诉Hibernate框架如何处理实体的属性和表中字段的关系,即如何映射。

配置格式可以参照:

Hibernate\project\tutorials\web\src\main\resources\org\hibernate\tutorial\domain目录下的Person.hbm.xml文件。

<?xmlversion="1.0"encoding="UTF-8"?>

<!-- 文档申明:可以到hibernate-xx.jar包的org.hibernate包下hibernate-mapping-3.0.dtd文件中拷贝

也可以拷贝Hibernate提供的例子中的 -->

<!DOCTYPEhibernate-mappingPUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

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

 <!-- package指定实体类所在的包,指定后<class>中name属性可以不写全类名 -->

<hibernate-mappingpackage="com.maple.customer.domain">

      <class name="Customer"table="CUSTOMERS">

          <id name="id"column="ID"type="integer">

                <generatorclass="increment"/><!-- ID自动增长 -->

          </id>

          <propertyname="name"column="NAME"type="string"/>

          <propertyname="age"column="AGE"type="integer"/>

          <propertyname="des"column="DES"type="string"/>

      </class>

</hibernate-mapping>

<!--    <class

          name="Customer"  要保存的实体

           table="CUSTOMERS"实体要保存到的表,即表名>

          <id

          name="id"实体中的属性id

          column="ID"表中的字段id,该表说明实体中id属性对应表中的id字段

          type="integer"  Hibernate中的数据类型,相当翻译的角色,

          主要用于Java的数据类型和数据库的数据类的转换,都是小写的。

          stringinteger character

          booleantext binary date timestamp>

                <generatorclass="increment"/>ID自动增长

          </id>

          <propertyname="name" column="NAME" type="string"/>

          <propertyname="age" column="AGE" type="integer"/>

          <propertyname="des" column="DES" type="string"/>

      </class>-->

3.4创建配置文件hibernate.cfg.xml

该文件要在放src根目录下,且名字必须为hibernate.cfg.xml。

<?xmlversion="1.0"encoding="UTF-8"?>

<!-- 文档申明:可以到hibernate-xx.jar包的org.hibernate包下hibernate-configuration-3.0.dtd文件中拷贝

也可以拷贝Hibernate提供的例子中的 -->

<!DOCTYPEhibernate-configurationPUBLIC

      "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

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

<hibernate-configuration>

      <session-factory>

          <!-- 参照Hibernate根目录\project\tutorials\web\src\main\resources下hibernate.cfg.xml配置

          或者参照Hibernate根目录\project\etc下的hibernate.properties文件配置 -->

          <!-- 定义访问数据库的相关属性 -->

          <propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>

       <propertyname="connection.url">jdbc:mysql://localhost:3306/jdbcdemo</property>

       <propertyname="connection.username">root</property>

       <propertyname="connection.password">admin</property>

       <!--设置数据库的引擎 参照hibernate.properties文件-->

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

       <!--动态显示生成的sql语句 -->

       <propertyname="show_sql">true</property>

       <!--设置要加载的映射文件,可以加载多个 -->

       <mappingresource="com/maple/customer/domain/Customer.hbm.xml"/>

      </session-factory>

</hibernate-configuration>

3.5保存一个对象到数据库

publicvoid save() {

          /*

           * 创建一个配置对象,底层调用了this(new SettingsFactory() )

           * 即传入一个设置工厂对象来构建配置对象

           */

          Configurationconfig = new Configuration();

          /*

           * 去classpath下加载hibernate.cfg.xml文件

           * 通过dom4j解析hibernate.cfg.xml文件的内容并设置到

           * config对象上返回

           */

          config.configure();

          /*

           * 通过配置对象创建一个SessionFactory对象(实际是SessionFactoryImpl对象)

           * 即将配置对象的属性复制了一份到SessionFactory对象中

           * session工厂是不可变的,永远保存,修改了hibernate.cfg.xml文件后,

           *  又会创建新的SessionFactory

           * SessionFactory是一个重量级对象,每次创建该对象都会消耗大量资源和时间,因此只需

           *  创建一个SessionFactory的实例(可放在静态代码块中创建),它是线程安全的。

           */

          SessionFactorysessionFactory = config.buildSessionFactory();

          /*

           * 从session工厂中获取一个session对象

           * Session是一个接口,SessionImpl是实现类,

           * Session是一个轻量级对象,每次创建该对象都不会消耗大量资源和时间,Session是线程不安全的。

*

* 从连接池的角度理解SessionFactory和Session(只是类比,它们与连接池无关):

* SessionFactory相当于连接池,Session相当于连接池中的一个空闲连接

* sessionFactory.openSession()就是从连接池中取得了一个空闲连接

           */

          Sessionsession = sessionFactory.openSession();

          Transactiont =     session.getTransaction(); //得到一个事务对象

          t.begin();//开启事务

          Customerc = new Customer("李四", 23,"我的是李四");

           /*

            * 保存对象,其实还没真正保存,对象还保存在session对象的缓存中,

            * 只是查询了一下数据库获取最大的ID值,用于自增。

            * 通过单步调试可以看到

            */

          session.save(c);

          t.commit();//提交事务,真正将对象保存到数据库

          session.close();//释放资源

      }

4.Hibernate的工作流程

Hibernate执行过程:创建Configuration对象config,config去加载hibernate.cfg.xml文件,hibernate.cfg.xml文件中绑定了Xxx.hbm.xml映射文件。加载完后通过config创建SessionFactory对象,再从SessionFactory对象上获取Session对象。还可以从Session上获取事务对象。

 

工作流程:

1.读取并解析配置文件

2.读取并解析映射信息,创建SessionFactory

3.打开Sesssion

4.创建事务Transation

5.持久化操作

6.提交事务

7.关闭Session

8.关闭SesstionFactory

5.Java对象持久化概念

5.1什么是中间件

  代码独立性高,灵活

  能够在不同的数据库平台中移植

  中间件变了,不会影响业务层

域对象:

实体域对象

问题中的"名词" Customer

过程域对象

问题中的"动词" CustomerDAO


原创粉丝点击