Hibernate学习笔记1

来源:互联网 发布:linux locale命令i18n 编辑:程序博客网 时间:2024/05/01 23:21
【什么是Hibernate?】*一个框架*一个Java领域的持久化框架*一个ORM框架【对象的持久化】狭义的理解:“持久化”仅仅指把对象永久保存到数据库中广义的理解:“持久化”包括和数据库相关的各种操作:  -保存:把对象永久保存到数据库中  -更新:更新数据库中对象(记录)的状态。  -删除:从数据库中删除一个对象。  -查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。  -加载:根据特定的OID,把一个对象从数据库加载到内存中。OID:为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为逐渐,而在对象术语中,则叫做对象标识(Object identifier-OID)。【ORM】*ORM(Object/Relation Mapping):对象/关系映射  -ORM主要解决对象-关系的映射    --------------------------------     |面向对象概念   |面向关系概念  |    --------------------------------    |类             |表            |    --------------------------------    |对象           |表的行(记录)|    --------------------------------    |属性           |表的列(字段)|    --------------------------------  -ORM的思想:讲关系数据库中该表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。  -ORM采用源数据来描述对象-关系映射细节,源数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。          -----------------------------          |域模型                     |业务逻辑层|(对象,属性,关联,继承和多态)|<------          -----------------------------      |                                             |          ---------------                    |          |  ORM API    |                    | 持久化层 ---------------    参照     -------------------          |  ORM 实现   |------------>|对象-关系映射文件|          ---------------             |(XML)            |                                      -------------------          --------------------------- 数据库层 |关系数据模型             |          |(表,字段,索引,主键和外键)|          ---------------------------【流行的ORM框架】*Hibernate:  -非常优秀、成熟的ORM框架。  -完成对象的持久化操作  -Hibernate允许开发者采用面向对象的方式来操作关系数据库。  -消除那些针对特定数据库厂商的SQL代码*iBatis:  -相对Hibernate灵活高,运行书读快  -开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练掌握sql语句优化功能*TopLink*OJB

Hiberbate实现:

publiv void save(Session sess, Message m) {sees.save(m);}
JDBC实现:

public void save(Connection conn, Message m) {PreparedStatement ps = null;String sql = "insert into message values (?,?)";try {ps = conn.prepareStatement(sql);ps.setString(1, m.getTitle());ps.setString(2, m, m.getContent());ps.execute();} catch (SQLException e) {e.printStackTrace();} finally {if(ps != null)try {ps.close();} catch (SQLException e) {e.printStackTrace();}}}
【导入Hibernate环境】*导入Hibernate必须的jar包:antlr-2.7.6.jar:一个语言转换工具,Hibernate利用它实现HQL到SQL的转换commons-collections-3.1.jar:collections Apache的工具集,用来增强Java对集合的处理能力dom4j-1.6.1.jar:dom4j XML解析器hibernate3.jar:核心包javassist-3.9.0.GA.jar:代码生成工具,Hibernate用它在运行时扩展Java类jta-1.1.jar:标准的Java事务处理接口slf4j-api-1.5.8.jar:hibernate使用的一个日志系统/*********************************************************/上网下载hibarnate的文件hibernate-distribution-3.6.10.Final-dist,解压缩,将其中的hibernate-distribution-3.6.10.Final----------------------------------               |-------hibernate-distribution-3.6.10.Final               |       -----------------------------------               |                     |--------hibernate3.jar               |-------lib\required中的所有(6个)jar包               |-------jpa                       ---                        |---hibernate-jpa-2.0-api-1.0.1.Final.jar网上下了:mysql-connector-java-5.1.18-bin.jar网上下了:hibernate-jpa-2.0-api-1.0.1.Final.jar/*********************************************************/之后将这些jar包选择到build path下。【Hibernate开发步骤】|-------------------------------------||           Application               |--->4.通过Hibernate API编写访问数据库的代码|    |-------------------------|      ||----|    Persistent Objects   |------|--->1.创建持久化类  |----|-------------------------|------||              Hibernate              |||-----------------|  |------------|  |||hibernate.cfg.xml|  | *.hbm.xml  |  |--->2.创建对象-关系映射文件||-----------------|  |------------|  ||-------------------------------------||-------------------------------------||              Database               |--->3.创建Hibernate配置文件|-------------------------------------|    在src中新建一个包(Package),Name:net.lasolmi.app然后在这个新建的包中新建一个class,Name:News在News.java中输入:


package net.lasolmi.app;public class News {private Integer id;private String title;private String content;}
对应的:Source --> Generat Getters and Setters...
然后就出现了一些函数
变成:
package net.lasolmi.app;public class News {private Integer id;private String title;private String content;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}
【创建持久化Java类】
*提供一个无参的构造器:使Hibernate可以使用Constructor.newlnstance()来实例化持久化类。
*提供一个标志属性(identify property):通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate();
*为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans风格的属性实型持久化。
*使用非final类:在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何借口,Hibernate使用CGLIB生成代理。如果使用的是final类,则无法生成CGLIB代理。
*重写equals和hashCode方法:如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。
【1.创建持久化Java类】
*Hibernate不要求持久化继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因。
|--------------|
|     News     |
|--------------|
|id:Integer    |
|title:String  |
|content:String|
|--------------|
【2.创建对象-关系映射文件】
*Hibernate采用XML格式的文件来指定对象和关系数据之间的联系。在运行时Hibernate将根据这个映射文件来生成各种SQL语句
*映射文件的扩展名为:.hbm.xml
新建一个文件:new --> file,File name:
那么这个文件是什么样子的呢,我们可以参照Hibernate中给我们的例子,
在Hibernate的project\testing\src\main\java\org\hibernate\testing\cache里面有一个
Item.hbm.xml文件
将其复制过来到自己的project中,然后在其基础上进行修改就行了。(但是很抱歉我的文件里面没有找到,所以还是按照教程上的分析)
在net.lasolmi.app下新建一个文件:Item.hbm.xml
编辑Item.hbm.xml文件:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="net.lasolmi.app"><!-- 映射类和映射表 --><class name="News" table="NEWS_TABLE"><!-- 映射OID和数据表的主键 --><id name="id" column="NEW_ID"><generator class="native"/></id><!-- 映射属性和字段 --><property name="title" column="TITLE"/><property name="content" column="CONTENT"></class></hibernate-mapping>
【3.创建Hibernate配置文件】
*Hibernate从其配置文件中读取和数据库连接的有关信息,这个文件应该位于应用的classpath下。
找到一个:hibernate.cfg.xml,在src下粘贴:




数据库的方言在哪里取?找到hibernate.property,打开,搜索"MySQL",得到如下信息:
## MySQL


...
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
...
<!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><!-- 配置session-factory节点 -->    <session-factory>                <!-- 连接数据库的基本信息:user, password, url, driverclass -->        <property name="connection.username">root</property>        <property name="connection.password">1230</property>        <property name="connection.url">jdbc:mysql:///test</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>                <!-- 配置数据库方言 -->        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>                <!-- 在进行数据库相关操作时,是否在控制台打印SQL -->        <property name="show_sql">true</property>                <!-- 配置是否自动生成数据表 -->        <property name="hbm2ddl.auto">create</property>                <!-- 关联Hibernate映射文件 -->        <mapping resource="net/lasolmi/News.hbm.xml">    </session-factory></hibernate-configuration>
【4.通过Hibernate API编写访问数据库的代码】
*测试代码
在net.lasolmi.app下创建一个class,Name:Main
注意:有两个Session,选择经典的那个

package net.lasolmi.app;import javax.transaction.Transaction;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;public class Main {public static void main(String[] args) {//1.创建一个Configuration对象:该对象封装了Hibernate的配置信息,包括cfg.xml文件和hbm.xml文件Configuration configuration = new Configuration().configure();//2.创建SessionFactory对象:该对象对应Habernate配置文件对应的数据库和数据库表SessionFactory sessionFactory = configuration.buildSessionFactory();//3.创建Session对象:Hibernate应用和数据库的一个连接Session session = sessionFactory.openSession();//4.打开事物Transaction tx = session.beginTransaction();//5.执行保存操作News news = new News();news.setContent("Hibernate");news.setTitle("ORM");session.save(news);//6.提交事务tx.commit();//7.关闭Sessionsession.close();//8.关闭SessionFactorysessionFactory.close();}}
【Configuration类】
*Configuration类负责管理Hibernate的配置信息。包括如下内容:
-Hibernate运行的低层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)
-持久化类与数据表的映射关系(*.hbm.xml文件)
*创建Configuration的两种方式
 -属性文件(hibernate.properties):
  Configuration cfg = new Configuration();
 -Xml文件(hibernate.cfg.xml)
  Configuration sfg = new Configuration().configure();
 -Configuration的configure方法还支持带参数的访问:
  File file = new File("simpleit.xml");
  Configuration cfg = new Configuration().configure(file);
【SessionFactory接口】
*针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
*Configuration对象根据当前的配置信息生成SessionFactory对象。SessionFactory对象一旦构造完毕,即被赋予特定的配置信息
 - Configuration cfg = new Configuration().configure();
 - SessionFactory sf = cfg.buildSessionFactory();
*SessionFactory是生成Session的工厂:
 - Session session = sf.openSession();
*构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
【Session接口】
*Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,现实质性flush之前,所有的持久层操作的数据都缓存在session对象处。先党羽JDBC中的connection。
  Hibernate:Database<-->JDBC Connection<-->Session<-->SessionFactory<-->Client Application
  JDBC: Database<-->JDBC Connection<-->ConnectionPool<-->Client Application
*持久化类与Session关联起来后就具有了持久化的功能。
*Session类的方法:
  -取的持久化对象的方法:get() load()
  -持久化对象都得保存,更新和删除:
   save(),update(),saveOrUpdate(),delete()
  -开启事物:beginTransaction().
  -管理Session的方法:isOpen(),flush(),clear(),evict(),close()等











0 0