Hibernate
- 格式:doc
- 大小:49.00 KB
- 文档页数:8
基础:1.至于我们为什么要用Hibernate,就从Hibernate的四个优点来说:首先、Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
其次、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作。
再次、Hibernate使用java的反射机制,而不是字节码增强程序类实现透明性最后、Hibernate的性能非常好,因为它是一个轻量级框架。
映射的灵活性很出色。
它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
2.反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
3.问题:为什么不通过NEW来获得类的属性和方法等?做一个反射机制的实例4.Hibernate的工作原理-ORM对象-关系映射(Object-Relationship Mapping)在我们的应用程序(App)中,数据用对象来体现,而在数据库中,数据是使用表的形式保存。
Hibernate用亍应用程序中的对象(Object)不表中的数据关系(Relationship)之间的映射(Mapping),即把对象保存到关系表中或者把关系表中数据取出映射为对象。
可以这样理解,当我们使用Hibernate框架技术,就可以直接从数据库中取出Java对象,或者把Java对象直接保存于数据库中,中间写sql语句等繁琐的步骤被Hibernate封装,对我们是透明的。
Hibernate 自动化的程度很高的组件,因此比较难以驾驭,在对Hibernate理解不够透彻的情况下使用,稍不留神可能就会影响性能。
业界还有一些自动化程度稍低的数据访问层组件,比如Ibatis,相当于半自动的仪器,可控性较Hibernate强一些,目前也比较流行。
5.建立一个hibernate项目的步骤:A:建立项目构造(项目名称、包、类等)。
B:导入jar包。
C:新建配置文件hibernate.cfg.xmlD:新建映射文件(建立数据库、实体类、映射文件)映射文件默认与实体类放在一起;命名规则为类名.hbm.xml6.完成一个小案例:tts_hibernate7.用hibernate完成增删改查tts_hibernate_28.主键的生成方式:1) identity 用于自动生成主键方式,除了Oracle 不支持,其他数据库一般都支持(较常用)2) sequence Oracle 中使用,用序列生成ID 主键3) native 主键生成方式如果是native ,那就看配置文件hibernate.cfg.xml 中方言<property name="dialect">是什么,如果方言是Mysql ,相当于identity ,如果方言是Oracle ,相当于sequence4) increment 不常用5)assigned 不常用,手动生成id9.将mysql链接换成Oracle链接:create table t_foo(t_id number(11)not null,t_value varchar(50) not null,primary key (t_id));create sequence foo_seq;修改配置文件:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 数据库连接信息--><property name="connection.url">jdbc:oracle:thin:@192.168.0.26:1521:tarena</property><property name="ername">openlab</property><property name="connection.password">open123</property><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><!-- Hibernate配置信息--><!-- dialect方言,用于配置生成针对哪个数据库的SQL语句--><property name="dialect"><!--方言类,Hibernate提供的,用于封装某种特定数据库的方言-->org.hibernate.dialect.OracleDialect</property><property name="hibernate.show_sql">true</property><!-- 在配置文件中关联映射文件--><mapping resource="com/tarena/tts/po/User.hbm.xml" /><mapping resource="com/tarena/tts/po/Foo.hbm.xml" /></session-factory></hibernate-configuration>10.hibernate的映射类型:stringintergerdoubledate 日期,只表示年月日datetime 日期,只表示年月日timestamp 时间戳,存放年月日时分秒yes_no 将在数据库中存一个字符Y 或者Ntrue_false 将在数据库中存放一个字符T 或者F ,功能同yes_no 是相同的。
数据库中类型和Java 中的类型不完全对应DROP TABLE IF EXISTS t_emp;CREATE TABLE t_emp (t_id int(11) NOT NULL AUTO_INCREMENT,t_name varchar(50) NOT NULL,t_salary double(9,2) NOT NULL,t_hire_date date NOT NULL,t_last_login timestamp NOT NULL,t_register char(1) NOT NULL,PRIMARY KEY (t_id)) ENGINE=InnoDB;varchar 对应Stringdate 对应年月日timestamp 对应年月日时分秒通常情况下,使用char(1) ,值为true/false ,来表示Boolean 类型。
11.练习以上的映射类型:项目名:tts_hibernate_2(部分)a.DROP TABLE IF EXISTS t_emp;CREATE TABLE t_emp (t_id int(11) NOT NULL AUTO_INCREMENT,t_name varchar(50) NOT NULL,t_salary double(9,2) NOT NULL,t_hire_date date NOT NULL,t_last_login timestamp NOT NULL,t_register char(1) NOT NULL,PRIMARY KEY (t_id)) ENGINE=InnoDB;b.新建实体类c.xxx.hbm.xmld.建立配置文件hibernate.cfg.xmle.建测试类<!-- 注意这里所有的type都是小写的--><property name="name" type="string" column="t_name"> </property> <property name="salary" type="double" column="t_salary"></property>12.案例:struts2与hibernate结合实现增删改查。
项目名:memory_SH13.(day02)对象的三种状态对于Hibernate而言,对象的状态分为3种:1) 暂时态当对象刚创建,和Session没有发生任何关系时,当程序运行完就立刻消失,被称为暂时态。
2) 持久态当执行如下代码时,对象变为持久态 Emp e = new Emp(); session.save();持久态的对象和Session发生了关系,如执行了save、get、query等方法Session中会缓存该对象(Session的缓存叫一级缓存)Session再获取对象时,首先去查找一级缓存,如果没有才查询数据库Session要负责将持久态对象的变化更新到数据库(在是flush()的时候更新,tx在提交的时候会自动调用session的flush())3) 游离态调用了session.evict(Object obj)方法,和Session解除了关系。
14.一级缓存机制其一,如果session被查询,session将先到缓存中查找是否有被查询的对象,找到则直接取出,否则才查询数据库;其二,session需要负责实时维护在缓存中的数据,保证缓存中的数据不数据库中数据的一致性,一旦用户对缓存中的数据做了修改,session立刻将数据更新到数据库中。
15.练习对象的三种状态,项目名:tts_hibernate_3foo.setValue("foo200");session.flush();foo.setValue("foo300");mit();session.close();解说:查看控制台,先执行了一次session.flash() ,之后mit()操作又自动执行了一次session.flash() ,所以,执行了2 次update 操作。