Hibernate笔记.doc_第1页
Hibernate笔记.doc_第2页
Hibernate笔记.doc_第3页
Hibernate笔记.doc_第4页
Hibernate笔记.doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

说 明笔记中每个知识点均标有如下标识中的一个或多个,释义如下:理解要求:了解:了解本知识点,明确本知识点的作用理解:理解本知识点所涉及内容的工作原理操作要求:操作:根据本知识点所涉及的内容,进行课堂案例的制作应用:根据本知识点所涉及的内容,进行融会贯通,灵活应用知识点相关:重点:本知识点为本课程重点内容难点:本知识点为本课程难点内容,理解难度较高(难点不一定是重点)目 录框架简介【了解】3Hibernate框架简介【了解】4Hibernate系统架构【理解】5Hiberante资源下载与介绍【了解】【操作】6Hibernate基础实例【理解】【操作】7映射模型类制作规范【理解】【应用】【重点】10映射配置文件(hbm.xml)详解【理解】【应用】【重点】11主键生成策略【理解】【应用】13Configuration【理解】【操作】16SessionFactory【理解】【操作】【重点】17Session简介【理解】【应用】【重点】18工具类H3Util制作【了解】【操作】19Transaction【理解】【操作】20Session【理解】【操作】【重点】21Criteria【理解】【应用】【重点】25SQLQuery【了解】【操作】28配置型SQL/HQL语句执行方式【了解】29Hibernate对象状态【理解】【重点】30Hibernate一级缓存【理解】【操作】【重点】【难点】31基本操作对一级缓存的影响【理解】【操作】【重点】33Session对象管理【了解】34关联关系介绍【理解】35一对多配置【理解】【应用】【重点】36一对多应用操作【理解】【应用】【重点】【难点】38多对多配置【理解】【应用】【重点】41多对多应用操作【理解】【应用】【重点】【难点】43实体参数【理解】【应用】45多表关联查询【理解】【应用】【重点】【难点】46数据抓取策略【理解】【应用】【重点】【难点】47二级缓存简介【理解】【重点】50二级缓存配置【了解】【操作】51二级缓存操作【理解】【操作】【难点】53补1:一对一外键约束配置【了解】【操作】【难点】56补2:一对一主外键约束配置【了解】【操作】【难点】57框架简介【了解】定义:框架是一种经过校验、具有一定功能的半成品软件u 经过校验:指框架本身经过测试,且框架自身所具有的功能已经实现u 具有一定功能:指框架可以完成特定的功能,不同的框架功能不同u 半成品软件:指框架自身是一个软件,但是该软件无法直接运行,需要配合其他的程序才可以完成指定的工作框架的工作模式:框架框架框架框架框架开发者开发者开发者开发者开发者Hibernate框架简介【了解】1.定义:Hibernate是一个基于Java的轻量级的ORM框架u 基于Java:底层是Java语言实现的u 轻量级:内存消耗比较少,运行速度比较快,性能稍高u ORM(Object Relation Mapping):l Object:对象类属性数据类型对象l Relation:关系型数据库表表名字段数据类型数据l Mapping:映射将具有对应关系的模型关联起来,操作对象,即操作数据库表2.Hibernate实质:自动完成JDBC+自动生成SQL语句说明:自动生成的SQL语句是一种匹配所有格式的语句,因此该语句不能根据用户需要进行优化,因此生成的SQL语句是一种最差实践,性能较低3.Hibernate是一种数据层解决方案,用于进行数据层开发,制作DAO4.常见的数据层解决方案JDBCHibernate市场占有率:ORM:非ORM9:1ORM市场:开源:收费9:1开源ORM市场:Hibernate:iBatis:其他6:3:1JPA(Java Persistence API )iBatis/MyBatisApache DBUtilsSpring JDBCTemplate、HibernateTemplate、等等Hibernate系统架构【理解】图的分类:系统架构图、技术架构图系统架构图:描述系统中的重要模块以及模块与模块之间的关系【上层依赖于下层】 1.包含内容:应用程序、Hibernate、数据库2.Hibernate位于APP与DB之间3.APP依赖Hibernate,Hibernate依赖DB4.Hibernate中有两种配置文件5.映射使用XML格式完成6. 持久化对象出现在APP与Hibernate间,起桥梁的作用,连接APP与Hibernate。Hibernate与APP间使用持久化对象进行数据交换1.Hibernate裂变成5块JDBC JNDI JTA SessionFactory Session2. APP需要操作的数据通过持久化对象交给Hibernate的Session对象完成3.APP中包含一种瞬时对象4.SessionFactory用于创建Session5.JDBC,JNDI,JTA作用未知1.Hibernate依赖由第三方厂商实现JDBC,JTA,JNDI技术完成任务,而非Hibernate自身实现2. Hibernate存在有事务及事务工厂3. Hibernate的连接需要由第三方提供4.SessionFactory依赖连接供应商和事务工厂来工作Hiberante资源下载与介绍【了解】【操作】1.下载HibernateHibernate 最高版本4.3,本课程基于Hibernate3.6.10学习下载地址:/projects/hibernate/files/hibernate3/2.厂商介绍JBOSSJBOSS服务器Web服务器:内置WEB容器(TOMCAT)应用服务器:内置WEB容器+EJB容器(JBOSS、Weblogic)HibernateJBPM3. 资源包目录层次documentation:帮助文档lib:开发使用jar包bytecode:字节码实现(代理对象相关)jpa:JPA规范包optional:可选包,包含开发Hibernate常用可选技术jar包required:必选包,包含开发Hibernate必须使用的jar包project:源码hibernate3.jar:核心jar包hibernate-testing.jar:测试包4.开发所使用的jar包:必选:(9个)1.核心jar包:hibernate3.jar(1个)2.lib/required/*.jar (6个)3.lib/jpa/hibernate-jpa-2.0-api-1.0.1.Final.jar (1个)4.DB驱动包:mysql的驱动jar包 (1个)可选:(2个)如果不使用,则无法查看Hibernate的运行日志5.log4j的jar包:log4j-1.2.16.jar(1个)6.slf4j整合log4j的jar包:slf4j-log4j12-1.7.2.jar(1个)【扩展】slf4j(简单日志门面技术)不同的日志记录技术,全部是自己的记录方式,规范不统一,slf4j提供一种标准的记录日志方式,整合不同的日志技术,slf4j本身不提供具体日志记录实现5.log4j技术(如果已经学习跳过)参看log4j快速入门手册Hibernate基础实例【理解】【操作】基础实例制作分析:O:Object对象(开发者完成)R:Relation关系型数据库表(开发者完成)M:Mapping对象与表间的对应关系(开发者完成)JDBC:Hibernate自动完成SQL:Hibernate自动完成步骤:1.创建工程(标准java工程)2.导入jar包(9个)3.制作R,创建表结构CREATE TABLE tbl_user (uuid varchar(32) NOT NULL,userName varchar(30) NOT NULL,age int(3) NOT NULL,address varchar(30) NOT NULL,PRIMARY KEY (uuid) ENGINE=InnoDB DEFAULT CHARSET=utf84.制作O,创建Java中的对象提供一个无参的构造方法(可以使用默认无参构造方法)提供一个主键属性(uuid)私有化其他的属性(userName,age,addres)封装所有属性(提供getter与setter方法)*不要声明为final类(与后期优化有关)*使当前类实现序列化接口(与后期服务器数据检测有关,目前可忽略)5.制作M,创建表与对象间的映射关系A.在创建的对象(Model)同层目录下创建与类名相同的xml文件,名称如下:UserModel.hbm.xmlB.从资源包中搜索*.hbm.xml(User.hbm.xml)C.将资源包中查找的信息复制过来,描述具体的对应关系类与表的映射主键的映射属性与字段的映射范例如下: 6.制作系统配置文件,用于描述连接的数据库相关信息及Hibernate的基本配置信息A. 在src目录中创建XML文件,名称如下:hibernate.hbm.xmlB.从资源包中搜索hibernate.cfg.xml文件C.将资源包中查找的信息复制过来,描述具体数据连接信息数据库连接的配置可选配置资源注册范例如下: com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/db0106 root root org.hibernate.dialect.MySQLDialect true 7.制作客户端程序,运行Hibernate范例如下:/1.创建一个要保存的数据UserModel um = new UserModel();um.setUuid(1L);um.setUserName(Jock);um.setAge(34);um.setAddress(金燕龙大厦);/2.加载配置信息Configuration conf = new Configuration().configure();/3.基于配置信息,创建SessionFactory对象SessionFactory sf = conf.buildSessionFactory();/4.打开一个与数据库相关的Session对象Session session = sf.openSession();/5.开启事务,基于Session得到Transaction t = session.beginTransaction();/6.通过session保存数据session.save(um);/7.提交事务mit();/8.操作完毕后,关闭session连接对象session.close();映射模型类制作规范【理解】【应用】【重点】模型制作规范:1.提供可访问的公共无参构造方法(可使用自动生成的)Hibernate在读取数据时,将读取的数据转换成一个对象,该对象的创建需要使用该构造方法2.提供一个标识属性,作为对象的主键,映射数据库表主键,通常使用uuid属性作为主键该属性用于Hibernate内部区分对象使用,Hibernate无法使用内存地址比对对象是否相同,Hibernate依赖该属性对对象进行区分,如果该属性值相同,Hibernate则认为是同一个对象3.对所有属性进行私有化声明,并进行标准封装注意:属性声明时使用封装类模型,避免使用基本数据类型4.不要使用final修饰符(否则将无法生成代理对象进行优化,一级缓存中学习)OID:Hibernate对于对象的管理标识,用于区分对象,对应数据库中的主键OID选取规则:优先考虑代理主键属性:身份证号具有业务含义,称为自然主键属性:uuid不具有任何业务含义,称为代理主键对象的属性选择:优先使用封装类,避免使用基本数据类型A.使用基本数据类型,对于没有输入值的数据,采用实际数据作为默认值B.使用封装类类型,对于米有输入值的数据,采用null作为默认值基本数据类型无法区分默认值是用户输入的还是没有输入产生的默认值,具有一定的安全隐患,因此放弃使用,改由封装类类型映射配置文件(hbm.xml)详解【理解】【应用】【重点】1.映射文件中包含内容:l 类与表的映射l 主键的映射l 属性与字段的映射l 关系的映射(后期)2.命名规范:模型类名.hbm.xml可以写成任意的名称a.xml,此格式不满足规范,但是可以使用(Hibernate低版本格式严格)3.class元素用于指定对象关系映射中的类与表的关系l name:模型类的全路径名格式l table:数据库表名l schema:数据库名4.id元素用于声明主键映射l name:数据模型中的OID,通常使用uuid属性(必须)l column:数据库表的主键,通常使用uuid字段(可选)l 如省略column配置,则默认column值与name值相同id元素的选择字段一定是作为对象的OID的字段5.property元素用于声明属性与字段的对应关系l name:数据模型中的属性名,也就是Java字段名(必须)l column:数据库表的字段名(可选)l 如省略column配置,则默认column值与name值相同三种声明格式:使用空标记(常用)使用非空标记使用子元素声明数据库字段名6.范例主键生成策略【理解】【应用】generator描述的是OID的生成策略手工控制策略l assigned:程序员手工控制生成策略自动生成策略l uuid(字符串类型:32位及以上)l increment(整型数值类型)通过获取max的值,执行SQL语句l identity (整型数值类型)通过数据库端实现,要求设置自增MySQL可用l sequence (整型数值类型) 通过数据库端实现,要求设置自增Oracle可用l native(整型数值类型)根据数据库的实现自动选择identity/ sequence联合主键/复合主键【了解】为兼容早期遗留系统而设计,目前几乎不采用该配置 【常见面试题】:请列举Hibernate的主键生成策略系统配置文件(cfg.xml)详解【理解】【应用】【重点】1.系统配置文件中包含内容:l 数据库连接的配置l 可选配置l 资源注册l 二级缓存(后期)2.命名规范:hibernate.hbm.xml可以写成任意的名称a.xml,此格式不满足规范,参看Configuration对象3.数据库连接的配置l hibernate.connection.driver_classn JDBC驱动类类名l hibernate.connection.urln JDBC连接字符串l hibernate.connection.usernamen JDBC连接用户名l hibernate.connection.passwordn JDBC连接用户名对应的密码4.可选配置l 必选:方言配置用于设置生成的SQL语句的格式org.hibernate.dialect.MySQLDialectl 其他可选配置n hibernate.show_sql设置是否将执行过程中运行的SQL语句输出到控制台开发阶段开启此属性,上线阶段关闭此属性n hibernate.format_sql设置show_sql属性打印出的SQL语句以分行的格式进行显示n hibernate.connection.pool_size设置Hibernate模型连接池最大连接数量n 使用c3p0连接池步骤:1.导入c3p0连接池jar包lib/optional/c3p0/*.jar2.cfg.xml中配置下列配置属性开启任意一句与c3p0有关的配置,即开启使用c3p0连接池217213091n hibernate.hbm2ddl【了解】设置是否根据hbm文件格式生成表结构,需要配合hbm.xml文件中对于属性类型与长度相关的配置使用n connection.autocommit【了解】设置是否自动提交事务5.资源注册将Hibernate的映射文件加入到系统配置中,否则将无法操作该模型注意:目录层次结构间使用/符号描述Configuration【理解】【操作】封装Hibernate系统配置信息的对象两种格式:早期格式:Configuration conf = new Configuration();【了解】读取perties常用格式:Configuration conf = new Configuration().configure();读取hibernate.cfg.xml常用格式:Configuration conf = new Configuration().configure(“配置文件名”); 【了解】读取指定的配置文件早期格式介绍:【了解】早期格式读取properties格式配置文件,无法进行资源注册的信息配置,需要使用下列格式进行资源注册Configuration conf = new Configuration();/格式一:手动添加映射配置文件,操作量较大conf.addResource(cn/itcast/api/UserModel.hbm.xml);/格式二:手动添加映射类,由类名自动查找该类同包结构下的类名.hbm.xml文件conf.addClass(UserModel.class);SessionFactory【理解】【操作】【重点】创建Session对象的工厂类,通过加载Configuration对象中封装的配置信息得到Configuration conf = new Configuration().configure();SessionFactory sf = conf.buildSessionFactory();注意:1.由于每次加载配置信息,均要读取XML文件,需要浪费大量时间,因此同一项目中,Configuration对象只会加载一次,SessionFactory对象也只加载一次2.对于同一个工程,连接数据库的信息唯一,基于加载的配置信息Configuration对象所创建的 SessionFactory对象用于创建连接数据库的对象,不同的连接对象使用的连接信息是相同的,因此SessionFactory对象是线程安全的Session简介【理解】【应用】【重点】1.描述单次应用程序与数据库间进行数据交换的对象,作用相当于Connection,但是其功能远远超过普通的JDBC连接对象2.Session对象基于SessionFactory对象获取Session s = sf.openSession();3.Session对象操作完成后要进行关闭,否则将一直占用该连接对象s.close();说明:Session对象由SessionFactory创建,每次创建并不是new出一个全新的Session对象,而是从数据库连接池中获取一个闲置的连接对象,使用完毕后,关闭Session对象也不是将该对象销毁,而是清空本次操作过程中所有的数据痕迹后,将该对象交还给连接池。如果使用同一个Session连续执行若干次任务,前一次执行任务所操作的数据痕迹没有及时清除,会影响下一次的操作,因此Session是线程不安全的。工具类H3Util制作【了解】【操作】H3Util.classpublic class H3Util private static Configuration conf = null;/静态的SessionFactoryprivate static SessionFactory sf = null;/使用静态代码块初始化对象staticconf = new Configuration().configure();sf = conf.buildSessionFactory();public static SessionFactory getSf()return sf;/* * 获取Session对象 * return 全新的Session对象 */public static Session getSession()return sf.openSession();Transaction【理解】【操作】1.描述Hibernate操作过程中绑定当前Session对象的事务控制对象2.获取事务对象通过使用Session中的beginTransaction()方法获取Transaction t = s.beginTransaction();3.事务回滚:t.rollback();4.事务提交:mit();Session【理解】【操作】【重点】1.插入数据save(Object)1.如果配置信息提供了OID生成策略,那么对象携带的OID将失效2.该操作返回的是添加的对象对应的OID注意:如果对象保存时,不能获取到OID的值,将抛出异常persist(Object)1.该操作可以保存对象2.如果手工给出了OID,并且又使用了自动生成OID,该操作将抛出异常2.删除数据delete(Object);1.删除时提供的对象必须拥有OID,否则不做任何操作2.删除一个不存在的OID对象时,抛出异常3.修改数据update(Object)1.修改时提供的对象必须拥有OID,否则抛出异常2.在一个Session内对同一个执行修改操作多次,只会执行对应SQL语句一次(一级缓存中详解)4.添加/修改数据saveOrUpdate(Object)该方法可以完成修改和添加操作,取决于是否提供OID判断是否提供OID的策略1.OID是否为null2.OID的值是否与配置中unsaved-value是否冲突5.查询单条数据get(Class, Serializable) load(Class, Serializable)1.查询时只能查询1条数据,并且需要提供OID,根据OID进行查询2.查询时必须指定查询数据模型,Hibernate根据模型查找对应映射文件,找到查询数据对应的表,查询完毕后将数据按照模型格式进行封装1. HQL语句书写规范【理解】【应用】【重点】1.HQL(Hibernate Query Language)语言:Hibernate专用的查询语言2.HQL与SQL语言对比:SQL语法中使用表与字段描述查询HQL语法中使用类与属性描述查询,由SQL衍生而来,具有SQL语言不具有的特殊语法例一:SQL:select * from tbl_user HQL:from UserModelHQL:select um from UserModel um例二:SQL:select userName,age from tbl_userHQL:select userName,age from UserModel 例三:SQL:select u.userName,u.age from tbl_user uHQL:select um.userName,um.age from UserModel um例四:HQL:select um.userName from UserModel 错误HQL:select userName from UserModel um 正确HQL:select userName from UserModel as um 正确Query【理解】【应用】【重点】1.Query对象用于进行查询操作,使用HQL语法完成2.Query对象由Session对象创建,传入字符串HQL参数Query q = session.createQuery(from UserModel);3.获取查询结果信息,如果查询的是映射的模型对象,根据配置信息封装为对应对象使用list()获取结果为列表信息将查询结果包装成对象,并将对象组装成一个List集合可以用于获取0到多条数据,如果是0条数据,返回的集合中没有数据使用uniqueResut()获取结果为单一信息 将查询结果包装成对象,直接返回用于获取0到1条数据,如果是0条数据,返回null注意:uniqueResut()返回结果不能超过1条,否则抛出异常4.投影查询通过设置HQL语句中select的内容进行的查询即为投影查询例如:select um from UserModel um(查询结果为单一项)select userName from UserModel(查询结果为单一项)select userName,age from UserModel (查询结果为多项)A.如果查询项为单一项且是一个对象,返回数据模型为查询的模型B.如果查询项为单一项且是一个属性,返回数据模型为对应的查询结果模型C.如果查询项为多项,返回的数据模型为对象数组Object,该对象数组中封装了若干个对象,内容为查询项目,顺序与HQL语句中的定义顺序一一对应例如:Select userName,age,address from UserModel查询结果中每条数据为Object,其中包含三个数据Object,第一个数据为userName的值,第二个数据为age的值,第三个数据为address的值5.分页查询HQL查询使用面向对象的格式进行分页查询的设置,Hibernate会根据系统配置中设置的dialect生成对应数据库使用的分页查询语句q.setFirstResult(int);设定查询的第一条数据编号,该值为索引值,从0开始q.setMaxResults(int);设置查询结果数据总量6.按条件查询固定值查询(不推荐使用) 【了解】无参数条件查询(少用) 【了解】传入可变参数查询(常用)格式一:HQL:from UserModel where userName = ?q.setParameter(0,”value”);弊端:索引传递参数,必须位置全完匹配,如果不匹配,错误格式二:HQL:from UserModel where userName = : userNameq.setParameter(“userName”,”value”);弊端:由于当前传递的参数是没有类型限定的,因此需要开发者传递参数时明确数据类型格式三:HQL:from UserModel where userName = ? and age = ?q.setString(0,”value”);q.setInteger(1,34);格式四:HQL:from UserModel where userName = :userName and age = : ageq.setString(“userName”,”value”);q.setInteger(“age”,34);格式四较为严谨,不会因为查询语句的条件位置发生变化而产生错误6.链式结构【了解】7.聚合函数Hibernate进行聚合函数的使用与SQL查询完全相同,但是查询结果类型为Java数据类型count返回的结果:Longmax/min 返回的结果:原始类型sum返回的结果:Long或Doubleavg返回的结果:Double注意:由于返回结果通常为单一数据,常使用uniqueResult()获得结果8.分组查询Query q = s.createQuery(select address,count(address) from UserModel group by address);与SQL基本相同9.排序查询Query q = s.createQuery(from UserModel order by age desc);与SQL基本相同10.投影数据封装【了解】对查询结果为投影格式的数据进行封装,包装为对象模型A.在模型类中提供对应的构造方法(注意无参构造方法的提供)B.书写HQL语句时,使用定义的构造方法Query q = s.createQuery(select new UserModel(age,userName,address) from UserModel);改造HQL语句:select new UserModel(userName,age) from UserModel注意:构造方法的参数顺序一定要和HQL中的查询投影顺序相同Criteria【理解】【应用】【重点】1.Criteria查询又名QBC查询,以面向对象格式完成查询操作,实现真正的自动生成SQL语句2.Criteria对象由Session对象获取,需要传入要查询的模型类s.createCriteria(UserModel.class);3.获取查询结果信息与Query对象完全相同list()获取多条数据uniqueResult()获取单挑数据4.投影查询A.QBC查询的默认投影格式为查询模型的全部属性B.设置查询单一属性,查询结果为该属性类型I.声明属性Property用于封装查询属性Property pro = Property.forName(userName);II.设置查询内容为该属性c.setProjection(pro);C.设置查询多属性,查询结果为对象数组I.声明用于封装查询属性的列表对象ProjectionList plist = PjectionList();II.声明要查询的每个属性Property pro1 = Property.forName(userName);Property pro2 = Property.forName(age);III.将待查询属性添加到属性列表中plist.add(pro1);plist.add(pro2);IV.设置查询内容为该属性列表c.setProjection(plist);5.按条件查询A.此功能是QBC查询中最强大的功能,基于面向对象的格式,描述查询条件短语含义Restrictions.eq等于=Restrictions.allEq使用Map,使用key/value进行多个等于的判断Restrictions.gt大于Restrictions.ge大于等于=Restrictions.lt小于Restrictions.le小于等于=Restrictions.between对应sql的between子句Restrictions.like对应sql的like子句Restrictions.in对应sql的in子句Restrictions.andand 关系Restrictions.oror关系Restrictions.sqlRestr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论