Hibernate学习笔记(1)

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 if exists customers;

createtable if notexists customers(

      idintprimarykey auto_increment,

      namevarchar(10),

      ageint,

      desvarchar(50)

);

3.2创建实体类Customer

publicclass Customer {

      private Integer id;

      private String name;

      private Integer age;

      private String des //顾客描述

省略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文件。

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

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

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

<!DOCTYPE hibernate-mappingPUBLIC

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

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

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

<hibernate-mapping package="com.maple.customer.domain">

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

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

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

           </id>

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

           <property name="age"column="AGE" type="integer"/>

           <property name="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。

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

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

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

<!DOCTYPE hibernate-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文件配置 -->

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

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

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

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

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

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

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

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

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

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

       <mapping resource="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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值