hibernate学习笔记
hibernate 学习笔记精要

使用hibernate编程,继承了面向对象编程的特点,使我们屏蔽了直接的拼sql语句对数据库表进行操作。
JDBC操作数据库很繁琐,sql语句编写并不是面向对象的,可以在对象和关系表间建立关联来简化编程,跨数据库平台,只需改写方言Dialect学习建立user library->hibernate,并加入相应的jar包:可以在项目右键build path->configure build path->add library选择user library,在其中新建library,命名为hibernate,加入所需的包(hibernate core、required、slf4j jar、log4j.jar)配置文件hibernate.cfg.xml一般放在src根目录下面,这样当读取这个配置文件时,就可以直接使用configuration.configure()方法,而不需设置这个配置文件所在路径所有的POJO最好都放到一个package下面,这样与之对应的映射文件*.hbm.xml也都放在了那下面在hibernate3以后开始支持annotation,目标是建立符合JPA标准的annotation,可以下载与hibernate版本对应的annotation包,引入三个jar包:hibernate-commons-annotations.jar,ejb3-persistence.jar,hibernate-annotations.jar。
new Configuration时,要使用AnnocationConfiguration使用注解时,如果想要当自己一键入@就给提示,content-assist的activation中加上@符号就可以了。
目前比较流行的ORM框架有hibernate,toplink,jdo,ibatis(“半自动化”的ORM实现,而非“一站式”),jpa;jpa(意愿一统天下)slf是一个日志框架,针对不同的实现,我们只需引入相关的jar包,比如slf4j nop,log4j, jdk logging, commons-logging,这种方式很像JPA,JDBC我们可以常常看看project->etc下面的一些文件,主要是些配置文件,我们用的时候可以参考,比如log4j.properties注解有的是写给javac编译器看的,有的是写给java运行环境看的。
Hibernate学习笔记

Hibernate项目的构建与配置1.在项目里倒入Hibernate所必须的Jar包(1)Hibernate框架可以使用在任何的Java项目里,并不一定是Web项目。
只需要在项目里倒入Hibernate所必须要使用的jar包就可以了。
(2)在Hibernate的官网下载hibernate-release-4.2.2.Final.zip解压,要使用Hibernate必须导入的jar包就在目录“hibernate-release-4.2.2.Final\lib\required”下。
倒入此路径下的所有jar包就可以了。
2.配置hibernate.cfg.xml文件(1)配置hibernate.cfg.xml文件可以参考“\project\etc”目录下的hibernate.cfg.xml文件与hibernate.properties文件。
(2)使用Hibernate连接MySQL的hibernate.cfg.xml配置文件如下:<hibernate-configuration><session-factory>(设置显示Hibernate产生的SQL语句)<property name="show_sql">true</property>(设置MySQL的SQL语法的方言)<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>(设置MySQL的驱动程序)<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>(设置MySQL的数据库路径、用户名、密码)<property name="hibernate.connection.url">jdbc:mysql:///java</property><property name="ername">root</property><property name="hibernate.connection.password">lizhiwei</property>(设置当数据库要保存的表不存在时,就新建表)<property name="hibernate.hbm2ddl.auto">update</property>(设置对象与数据库表的关系映射文件)<mapping resource="vo/User.hbm.xml"/></session-factory></hibernate-configuration>(3)此配置文件一般放在项目的src目录下。
Hibernate学笔记

Hibernate学习笔记Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
支持各种主流数据库。
核心APIHibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
通过这些接口,可以对持久化对象进行存取、事务控制。
SessionSession接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。
但需要注意的是Session对象是非线程安全的。
同时,Hibernate的session不同于JSP应用中的HttpSession。
这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactorySessionFactory接口负责初始化Hibernate。
它充当数据存储源的代理,并负责创建Session对象。
这里用到了工厂模式。
需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
TransactionTransaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。
Hibernate笔记完整版

day1一. hibernate数据持久化组件对象持久化(Object Persistence):把数据保存在永久存储介质中(数据库)1.为什么要持久化:a.内存是暂时存储设备,断电后数据易丢失b.网络传输无法传输内存中的对象,需要将对象外化c.内存中数据查询,组织不方便d.内存只能存储少量数据2.怎样持久化a.对象序列化 --> 二进制流合并存储,粒度大,无规律不支持检索只适合少数个别对象的序列化b.用JDBC/EJB/ORM 将数据存入数据库用JDBC:(Java DB Connection)优点:底层开发,控制力强(细); 效率最高; 标准的(SQL)JDBC,有可移植性缺点:过于复杂; 代码量大; 可维护性差(代码重用性低);用EJB:(Entity Java Bean)优点:直接自动生成JDBC代码; 持久对象(PO)的状态由服务器管理; 声明式的事务缺点:功能不全(特殊的组件,不能做继承关系); EJB容器是侵入性容器,失去OO的优点; 调试更复杂用ORM:(object relation mapping)对象关系映射优点:自动生成JDBC(代码量下降); 使用(plain oldest java object---pojo),非侵入型; 提供状态管理; 难度下降,不需要容器缺点:由于开源, 文档少; bug多; 技术支持差结论: 用java开发-->必须将数据持久化-->用数据库持久化-->须用ORM-->需要用Hibernate二. Hibernate1.POJO类plain oldest java object,就是标准的Java Bean。
2.HibernateHibernate -->一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组件。
其底层也是由JDBC实现的。
hibernate是通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的信息,以及连接数据库的驱动。
Hibernate学习笔记

主讲:刘涛(Robin)第一天:第一章Hibernate入门1、持久化:狭义:将数据持久地保存(将处于临时状态的数据持久的保存到文件或数据库中);广义:对数据进行CRUD操作;employee(idnameagedeptidaddressid)2、ORM:将内存中的对象映射到关系型数据库中;面向对象的java 关系型数据库-----------------------------------类表属性字段(列)关系表OID PK注意:派生属性不需要映射派生属性,即可以由其他属性计算出来的属性3、公用持久化模板的要求:1)提供API供客户使用,执行CRUD操作;2)提供一种语言访问数据库(面向对象的);如HQL:Hibernate Query Language 3)允许客户制定表和类之间的映射关系,一般写在xml中;4)提供一些优化机制,来提高性能,如:缓存、延迟加载等;4、什么是Hibernate?1)中间件,介于应用程序和数据库之间的软件;2)持久化工具,封装了和数据库访问的细节,可以让程序开发人员更加关注于业务逻辑的处理;3)ORM工具,将面向对象的java同关系型数据库进行映射,可以实现内存中的数据和数据库中数据的双向同步更新;5、Hibernate涉及的文件:1)pojo:封装数据;2)配置文件:hibernate.properties 或hibernate.cfg.xml,用来配置和数据库连接相关的信息;3)映射文件:xx.hbm.xml(hbm:hibernate mapping),用来映射表和类之间的对应关系;4)hibernate API:1.核心接口:CRUD操作,事务处理等;2.回调接口:当特定时间触发时,回调客户端程序;3.类型:hibernate有自己定义的类型;4.可扩展接口:可以以hibernate为基础进行扩展;6、核心接口:1)org.hibernate.cfg.Configuration:1.对hibernate进行配置,根启动hibernate;2.创建SessionFactory;2)org.hibernate.SessionFactory: 1.重量级的(非常的占用资源),不要频繁的创建,删除,一般一个数据库对应一个SessionFactory;2.线程安全的;3.缓存sql语句;如:student(idnameage)缓存的四条sql语句:select id,name,age from student where id=?delete from student where id=? update student set name=?,age=? where id=?insert into student values(?,?,?)4.维护着hibernate的二级缓存(可选的);5.创建Session;3)org.hibernate.Session:1.轻量级的,可以频繁的创建和删除,一般一个事务中的操作对应一个Session;2.线程不安全的(多线程访问需要进行线程控制);3.维护着hibernate的一级缓存(必用的);4.可以执行CRUD操作;session.save(...);session.delete(...);session.update(...);session.get(...);session.load(...);4)org.hibernate.Transaction:hibernate中的事务控制,包括:jdbc 事务、JTA事务、CORBA事务;5)org.hibernate.Query:通过HQL执行查询操作; ---> "Hibernate Query Language" session.createQuery(String queryString)sql:select id,name,age from studenthql:from Student6)org.hibernate.Criteria:擅长于做动态查询7、Hibernate编程步骤:1)创建pojo类;2)创建配置文件(包含数据库连接的相关信息,以及连接的映射文件);3)创建映射文件;4)调用hibernate的API;1.创建Configuration;2.创建SessionFactory;3.创建Session;4.启动事务,session.beginTransaction();5.执行CRUD操作;6.提交或回滚事务;mit(),transaction.rollback()create table xuxiang_student(id number(7) primary key,name varchar2(25),age number,gendar varchar2(10),address varchar2(50));添加Hibernate驱动:项目名--->右键--->Properties--->Java Build Path--->Libraries--->Add Library...--->MyEclipselibraries--->Hibernate 3.0 Core Librariessrc--com.briup.first--StudentTestDTD,XML,Schema第二章对象/关系映射基础1、映射文件:xx.hbm.xml在同一个映射文件中,可以映射多个pojo类,但建议只映射一个;2、常用标签介绍:1)<class>:用来映射表2)<id>:用来映射主键3)name:类中set/get方法后的名字4)column:表中的列名5)type: hibernate数据类型6)<generator>:用来制定主键的生成方式1. increment:由hibernate按照自增长方式产生唯一主键,注意在多线程访问时不要使用;对应的java类:org.hibernate.id.IncrementGenera tor2. identity:由支持identity的数据库产生主键;--org.hibernate.id.IdentityGener atorid number primary key identity 3. sequence:由数据库sequence来产生唯一主键;--org.hibernate.id.SequenceGener atorcreate sequence xuxiang_sequence start with 100;4. hilo:由数据库按高低值算法产生唯一主键(主键高值存在于表中);--org.hibernate.id.TableHiLoGene rator算法:id=hi*(max_lo+1)+lo如下,则有:id=100*(100+1)+0=10100 create table xuxiang_hi(nextval number);insert into xuxiang_hivalues(100);commit;5. seqhilo:由数据库按高低值算法产生唯一主键(主键高值存在于sequence中);--org.hibernate.id.SequenceHiLoG enerator6. assign:手动指定主键值;7)<property>:用来映射普通的列;8)<discriminator>:识别器,整个类层次映射成一张表时使用;9)<one-to-one>:用来映射一对一关系;10)<many-to-one>:用来映射多对一关系;11)<many-to-many>:用来映射多对多关系;12)<composite-id>:用来映射联合主键;positecreate table xuxiang_student2(id1 number,id2 number, name varchar2(25),age number,primary key(id1,id2));13)<component>:用来映射组合关系;ponent--User,Addresscreate table xuxiang_user(id number primary key,name varchar2(25),age number,city varchar2(20),street varchar2(50));14)<subclass>:用来映射子类;15)<formula>:计算表达式,映射派生属性时经常使用;User--Date bornDate3、作业:建一个表product,对其进行CRUD操作,要求主键由sequence生成,映射派生属性totalPrice;create table xuxiang_product(id number primary key,name varchar2(25),price number,count number);第二天:4、Hibernate中的类型:1)值类型:没有映射文件,不能直接映射到数据库中;基本数据类型,对象类型(如Address) 2)实体类型:有映射文件,可以直接映射到数据库中;第三章关联关系映射1、一对一映射:1)唯一外键关联;表上:table user table addressid<PK> idname city... ...addressid<FK>类上:class User class Addressid idname city... ...Address address User user对应的映射文件:User.hbm.xml<many-to-one name="address" class="Address"column="addressid"unique="true" />注意:由于<one-to-one>已被主键关联占用,为了与其区别,故引入了<many-to-one>!Address.hbm.xml<one-to-one name="user"class="User" />com.briup.third.one2one.fk create table xuxiang_address( id number primary key,city varchar2(20),street varchar2(50));create table xuxiang_user(id number primary key,name varchar2(25),age number,addressid number references xuxiang_address(id));2)主键关联;表上:table user table addressid<PK> id<PK,FK>name city... ...类上:class User class Addressid idname city ... ...Address address User user映射文件:User.hbm.xml<one-to-one name="address"class="Address" />Address.hbm.xml<one-to-one name="user"class="User" /><generator class="foreign"><paramname="property">user</param></generator>com.briup.third.one2one.pk create table xuxiang_user2(id number primary key,name varchar2(25),age number);create table xuxiang_address2( id number referencesxuxiang_user2(id),city varchar2(20),street varchar2(50),primary key(id));2、一对多映射:1)单向:只能在类上体现,表上是不能体现的,故单向和双向的表是完全相同的;表上:table user table addressid<PK> idname city... ...addressid<FK>类上:class User class Addressid idname city... ...Address address映射文件:User.hbm.xml<many-to-one name="address" class="Address"column="addressid" notnull=" true"/>Address.hbm.xml不需要作任何配置;com.briup.third.many2one.unidire ctcreate table xuxiang_address3( id number primary key,city varchar2(20),street varchar2(50));create table xuxiang_user3(id number primary key,name varchar2(25),age number,addressid number references xuxiang_address3(id));2)双向:表上:table user table addressid<PK> idname city... ...addressid<FK>类上:class User class Addressid idname city... ...Address address List users映射文件:User.hbm.xml<many-to-one name="address" class="Address"/>Address.hbm.xml<set name="users"><key column="addressid"/><one-to-many class="User"/></set>注意:cascade:设置级联sava-update:级联保存、更新delete:级联删除none:不级联,默认值all:级联保存、更新、删除inverse:在映射一对多关系时,一般将该属性设置为true,表示表间的关联关系由一方设置,减少update语句,提高性能。
Hibernate课堂笔记

Hibernate部分学习笔记讲师:梁建全liangjq@目录Hibernate部分学习笔记 (1)Day01 (5)一、Hibernate基本概念 (5)1、Hibernate是什么,有什么作用和好处 (5)2、Hibernate实现原理 (5)3、Hibernate框架主要结构 (5)二、Hibernate基本应用 (6)1、Hibernate使用步骤 (6)三、映射类型 (9)1、Hibernate映射类型主要有以下几种: (9)四、主键生成 (10)Day02 (11)一、Hibernate框架的基本特性 (11)1、Hibernate一级缓存 (11)A.一级缓存的特点 (11)B.一级缓存的好处 (11)C.使用建议 (11)2、Hibernate对象持久性 (13)3、Hibernate延迟加载 (14)A.针对于以下方法,Hibernate默认使用延迟加载机制: (14)B.Session的get和load方法区别: (14)C.延迟实现原理 (15)D.Hibernate框架如何动态生成一个代理类 (15)E.使用建议 (15)二、Hibernate综合练习 (15)前期案例:任务列表示例重构(采用Struts2+Hibernate) (15)A.Hibernate前期准备 (15)B.为了更好使用一级缓存,采用ThreadLocal封装Session (16)C.采用Hibernate重构ProjectDAO (17)D.为了支持延迟加载API,采用拦截器实现OpenSessionInView模式 (18)Day03 (20)一、什么是关联映射,有什么好处 (20)二、一对多关联映射 (20)示例:d_order和d_item存在一对多的业务关系 (20)一对多关系映射的实现步骤: (20)三、多对一关联映射 (21)多对一关系映射实现步骤: (21)四、关联操作 (22)1、关联查询 (22)2、利用lazy属性控制延迟加载 (22)3、级联操作(采用关系级联方式进行添加、删除、更新操作) (22)A.在关联属性映射部分添加cascade属性,可以指定以下属性 (22)B.Inverse属性的作用 (22)C.级联添加 (23)D.级联删除 (23)Day04 (24)一、如何使用Myeclipse生成映射文件和实体类? (24)1、如何根据DB生成实体类和映射文件 (24)A.利用Myeclipse追加Hibernate框架步骤: (24)B.利用Myeclipse根据表生成实体类和映射文件 (26)二、多对多关系映射 (29)三、继承关系映射 (30)1、继承关系映射(1) (30)A.首先将Book继承自Product类 (30)B.修改Book.hbm.xml描述信息 (30)2、继承关系映射(2)---理解 (31)Day05 (33)一、其他映射 (33)1、List集合映射 (33)2、formula子查询映射 (33)3、Component组件映射 (34)4、联合主键映射 (35)案例:采用联合主键映射+组件映射对t_person表进行操作。
Hibernet课堂学习笔记(精髓)

Hibernet:把一个对象转化为一条记录或者把一条记录转化为一个对象。
1读取并且解析配置文件2.获得sessionfactery3获取session。
属性名和字段名一致时候://1.获取配置文件Configuration cft=new Configuration().configure();//2.获取sessionfactorySessionFactory sf=cft.buildSessionFactory();//3.获取session//Session session=sf.openSession();Session session=sf.getCurrentSession();Session session2=sf.getCurrentSession();在配置openSession()的时候需要在最后手动关闭session.close();当使用getCurrentSession()的时候不需要手动关闭session,他会自动关闭在Hibernate.cfg.xml中配置current_session_context选项中选择thread。
如下图:Format_sql-true,show_sql-true的作用是可以显示出hibernate操作的底层源代码实例:package com.bchy.s33;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.bchy.geimei.entity.Login;public class Getsession {public static void main(String[] args) {//1.获取配置文件Configuration cft=new Configuration().configure();//2.获取sessionfactorySessionFactory sf=cft.buildSessionFactory();//3.获取session/*Session session=sf.openSession();Session session2=sf.openSession();*/Session session=sf.getCurrentSession();Session session2=sf.getCurrentSession();if(session==session2){System.out.println("ok!!!");}//4.开启一个事物Transaction tx=session.beginTransaction();//5.操作数据库Login l=new Login();l.setLogin_id(81);/* l.setLogin_name("张三");l.setPassword("123");*/System.out.println("。
马士兵hibernate学习笔记(文字整理版)

马士兵hibernate学习笔记(文字整理版)课程容 (5)1 HelloWorld (5)2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping (5)3 常见的0/R框架(了解) (5)4 hibernate基础配置(重点) (5)5 ID生成策略(重点 AUTO) (5)6 Hibernate核心开发接口介绍(重点) (5)7 对象的三种状态(了解) (5)8 关系映射(重点) (5)9 Hibernate査询(HQL) (5)10 在Struts基础上继续完善BBS200 (5)11 性能优化(重点) (5)12 补充话题 (5)风格 (5)1 先脉络,后细节 (5)2 先操作,后原理 (5)3 重Annotation,轻xml配置文件 (5)资源 (5)1 . (5)2 hibernate zh_CN文档 (5)3 hibernate annotation references (5)环境准备 (5)1 下载hibernate-distribution-3.3.2.GA-dist (5)2 下载hibernate-annotations-3[1].4.0.GA (5)3 注意阅读hibernate compatibility matrix(hibernate download) (5)4 下载slf4jl.5.8 (6)Hibernate HelloWorld (6)1 建立新java 项目,名为hibernate_0100_HelloWorld (6)2 学习建User-library-hibernate,并加入相应的jar包 (6)3 引入mysql的JDBC驱动包 (6)4 在mysql中建立对应的数据库以及表 (6)5 建立hibernate 配置文件hibernate.cfg.xml (6)6 建立Student 类 (6)7 建立Student 映射文件 Student.hbm.xml (6)8 将映射文件加入到hibernate.cfg.xml中 (6)9 写测试类Main,在Main中对Student对象进行直接的存储测试 (6)10 FAQ: (6)11 Note: (6)12 建立能力 (7)建立 Annotation 版本的 HelloWorld (7)1 创建teacher 表,create table teacher (id int primary key, name varhcar(20), title varchar(lO)); (7)2 创建Teacher 类 (7)3 在hibernate lib 中加入annotation的jar包 (7)4 参考Annotaion文档建立对应的注解 (7)5 在hibernate.cfg.xml中建立映射<mapping class:.../〉 . (7)6 参考文裆进行测试(注意文裆中缺少configure()的小bug) (7)7 FAQ: 不给提示 (7)What is and Why 0/R Mapping (7)1 JDBC操作数据库很繁琐 (7)2 Sql语句编写并不是面向对象的 (7)3 可以在对象和关系表之间建立关联来简化编程 (7)4 0/R Mapping 简化编程 (7)5 0/R Mapping跨越数据库平台 (7)6 Hibernate_0200_OR_Mapping_Simulation (7)0/R Mapping Frameworks (7)1 hibernate (7)2 toplink (8)3 jdo (8)4 JPA (8)Hibernate基础配置 (8)1 对应项目:Hibernate_0300_BasicConfiguration (8)2 介绍MSQL的图形化客户端 (8)3 hibernate.cfg.xml: hbni2ddl.auto (8)4 搭建日志环境并配置显示DDL语句 (8)5 搭建jUnit环境 (8)6 hibernate.cfg.xml:show_sql (8)7 hibernate.cfg.xml:format_sql (8)8 表名和类名不同,对表名进行配置 (8)9 字段名和属性相同 (8)10 字段名和属性名不同 (8)11 不需要psersistence的字段(不用列) (8)12 映射日期与时间类型,指定时间精度 (8)13 映射枚举类型( 比较少用) (9)14 字段映射的位置(field或者get方法) (9)15 Lob (9)16 课外:CLOBBLOB类型的数据存取 (9)17 课外:Hibernate自定义数据类型 (9)18 hibernate 类型 (9)ID生成策略 (9)1 对应项目:hibernate_0400_ID (9)2 注意: (9)3 xml生成id (9)4 注解方式:GeneratedValue (9)5 FAQ; (10)6 联合主键 (10)核心幵发接口介绍 (12)1 hibernate_0500_CoreAPI (12)2 Hibernate API文档需要单独下载 (12)3 Configuration (12)4 SessoinFactor (12)5 Session (12)6 SchemaExport (自动建表) (13)7 Query 接口 (13)8 Note: (13)三种对象状态 (14)1 上一个 project (14)2 三种状态的区分关键在于 (14)3 三种状态: (14)4 对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比如改变属性的 (14)关系映射(重要) (15)对象之间的关系 (15)1 这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于 (15)2 简化问题: (15)3 —对一 (15)4 —对多 (15)5 组件映射 (15)一对一关联 (16)1 一对一单向外键关联 (16)2 一对一双向外键关联 (16)3 一对一单向主键关联(不重要) (17)4 一对一双向主键关联(不重要) (17)5 联合主键 (17)组件映射 (17)1 项目:hibernate_1100_component (17)2 对象关系:一个对象是另外一个对象的一部分 (17)3 数据库表:一表 (17)4 annotation: Embeddable Embbeded (17)5 xml: 使用<component,例如: (18)多对一与一对多 (18)1 多对一单向关联 (18)2 一对多单向关联 (19)3 一对多(多对一)双向关联 (19)多对多 (20)1 单向关联: (20)2 双向关联: (21)关联关系中的CRUD_Cascade_Fetch (21)1 hibernate_1700_one2many_many2one_bi_crud (21)2 设定cascade以设定在持久化时对于关联对象的操作(CUD,R归Fetch管) (21)3 cascade仅仅是帮我们省了编程的麻烦而已,不要把它的作用看的太大 (21)4 铁律:双向关系在程序中要设定双向关联 (22)5 铁律:双向mappedBy (22)6 fetch (22)7 Update时ManyToOne()中的cascade参数关系 (22)8 Delete时ManyToOne()中的cascade关系 (22)9 O/RMapping 编程模型 (23)10 要想删除或者更新先做load,除了精确知道ID之外 (23)11 如果想消除关联关系,先设定关系为null.再删除对应记录,如果不删记录,该记录变成垃圾数据 (23)12 练习:多对多的CRUD (23)关系映射总结 (24)1 什么样的关系,设计什么样的表,进行什么样的映射 (24)2 CRUD,按照自然的理解即可(动手测试) (24)集合映射(不太重要) (24)1 项目名称:hibernate_1800_Collections_Mapping (24)2 Set (24)3 List (与Set差不多多个OrderBy) (24)4 Map (24)继承映射(不太重要) (24)1 三种方式 (24)作业: (24)1 学生课程、分数的设计(重要) (24)2 设计: (25)3 树状结构的设计(至关重要) (25)Hibernate 查询(Query Language) (26)HQL vs EJBQL (26)1 NativeSQL >HQL.> EJBQL(JPQL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)" 262 总结:QL应该和导航关系结合,共同为査询提供服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一次课:持久化:就是把瞬时状态的数据转变为持久化状态的数据,这一个过程就是持久化。
(java中内存分为:栈(变量,方法,形参都是在栈上),堆(new出来的对象在堆上))1)瞬时状态:刚new出来,在内存中存在的对象就是瞬时状态的。
如果程序结束,对象就会被回收。
2)持久化状态:在磁盘或者是数据库中存在的数据就是持久状态。
Hibernate是什么?1)是一个优秀的持久化框架,对jdbc进行进一步的封装。
(hibernate,ibatis )。
2)是一个ORM (Object relation mapping ).Mysql,oracle,access 是关系型数据库= hibernate操作的是对象。
使用hibernate的步骤:1)新建项目2)引入jar包(hibernate最少依赖8个jar包)3)新建 hibernate配置文件(hibernate.cfg.xml) ,放在src根目录下面。
用于数据库的配置信息。
<hibernate-configuration><!-- 配置连接信息 --><session-factory><!-- 数据库的驱动类 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 配置数据库的用户名 --><property name="ername">root</property><!-- 配置密码 --><property name="connection.password">abc</property><!-- 配置数据库的url --><property name="connection.url">jdbc:mysql:///fwcz</property><!-- 配置数据库方言 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 自动建表第一次使用的时候,设置create,表建成之后,设置为update --><property name="hbm2ddl.auto">create</property></session-factory></hibernate-configuration>4)写bean/vo类,并且编写映射文件。
<hibernate-mapping package="com.hibernate.bean"><!--class name属性表示的是类名 --><class name="User" table="tbl_user"><!-- 表示主键 id name属性代表的是类中的属性 column表示的是字段名--><id name="id" column="uid"><!-- 主键的生成方法 sequence 代表oracle的序列,increment myql 中的自动增长,native 本地的,表示的是hibernate根据数据库自动选择 --><generator class="native"></generator></id><!-- 配置剩余的属性 --><property name="name" column="uname"></property><property name="pass" column="upass"></property></class></hibernate-mapping>5)将映射文件添加到hibernate.cfg.xml文件中<mapping resource=”com/hibernate/bean/User.hbm.xml”/>6)数据测试://向数据库中添加一条数据//1.读取配置文件Configuration cfg = new Configuration().configure();//2.创建一个工厂SessionFactory factory = cfg.buildSessionFactory();//3.获得session (是一个连接对象 Connection)Session session = factory.openSession();//4.开始事务Transaction tx = session.beginTransaction();//5.添加用户User u = new User();u.setName("admin");u.setPass("123");session.save(u);//保存对象//6.提交事务mit();//7.关闭session.close();Hibernate操作数据库的几个对象:1)Configuration:Configuration cfg = new Configuration().configure(); 读取文件名为hibernagte.cfg.xml 文件中的信息//如果修改过配置文件名称Configuration cfg = new Configuration().configure(“配置文件名”);2)SessionFactory:用于产生Session的工厂类,耗费大量的资源。
一个项目中只存在一个。
cfg.buildSessionFactory();3)Session类:jsp/servlet中的session代表的是浏览器一次会话。
而hibernate中的Session,代表的是程序与数据库之间的链接。
相当于 Connection。
Session session = facory.openSession(); //打开一个新的session连接。
一定要关闭4)Transaction: 代表的是事务。
对数据库的一次操作,要么都成功,要么都失败Transation tx = session.beginTransaction();mit();//事务提交添加用户save : User u = new User();u.setName("admin1111");u.setPass("123");session.save(u);//保存对象查询用户:get() /load();User u = (User)session.get(User.class,1); //查询id号为1的用户//立即发送sql语句,然后返回一个对象User u = (User)session.load(User.class,1);//没有发送sql语句,先到hibernate 缓存中查。
如果没有使用User对象(u.setName(),u.getName()),不会发送sql语句。
懒加载。
删除用户:User u = (User)session.get(User.class,1); //获得id号为1的数据session.delete(u);修改用户: 1) User u =new User();u.setId(2);u.setName("admin");session.update(u);2)//先查询id号为2的数据User u = (User)session.get(User.class,3); //对象此时存在于数据库,内存中也有,缓存也有u.setPass("mmmmmmmmmmmmmm");添加或者修改: saveOrUpdate()User u = new User();u.setId(2);u.setName("张三");u.setPass("aaaa");session.saveOrUpdate(u); //用于修改,也可以用于添加hibernate注解(annotation):1.导入完整的jar包(20个)2.编写bean类://在与表对应的那个bean类上加注解@Entity//表示一个实体类,与数据库中的某一张表对应@Table(name="tbl_user") //指定实体类对应的表名public class User implements Serializable{ //建议implements Serializableprivate int id;//编号private String name;private String pass;//对应主键,在属性的get方法上面@Id//代表主键@Column(name="uid") //配置主键,对应数据库中的uid这一列, 如果属性名和列名相同的情况下如果主键是使用native @GeneratedValue(strategy = GenerationType.)可以省略public int getId() {return id;}public void setId(int id) {this.id = id;}//name是一个普通的属性,不是主键@Column(name="uname")public String getName() {return name;}public void setName(String name) { = name;}@Column(name="upass")public String getPass() {return pass;}public void setPass(String pass) {this.pass = pass;}3.将实体类添加到hibernate.cfg.xml文件中<mapping class=”包名.类名”/>4.读取配置的文件AnnotationConfiguration类第三章:HQL查询语句1)hibernate中的 get()方法只能取出一条数据,delete()无法删除多条。