您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Hibernate笔记整理完整版
TarenaHibernate笔记整理完整版1.基本概念:(1)有什么用是开源的用于封装数据访问层的组件,我们称为数据访问层框架(或持久层框架);是对JDBC+SQL的轻量级封装。(2)出现背景,需要解决的问题:a)SQL语句过于繁杂,和数据库的耦合度高b)不同数据库之间SQL的不同,导致移植困难:例如分页查询的区别(Oracle与MySql之间区别)c)二维关系表和对象之间数据结构的不匹配:我们从数据库中取出的数据时结构集(一张表),而我们开发时需要将查询到得结果集封装为对象,然而数据库中二维表的数据结构和内存中java对象的数据结构是不匹配的(表中的数据需要经过处理才能变为Java对象)。(3)工作原理-----ORM思想对象-关系映射(Object-RelationMapping):Hibernate用于应用程序中的对象(Object)与表中的数据关系(Relationship)之间的映射(Mapping),即把对象保存到关系表中或者把关系表中数据取出映射为对象。可以这样理解:Hibernate可以直接从数据库中取出Java对象,或者把Java对象直接保存于数据库中,中间sql语句等繁琐的步骤被Hibernate封装。2.Hibernate的基本使用核心步骤:1)导入Jar包:Hibrenate开发包,数据库驱动包2)Hibernate配置文件(只有1个):hibernate.cfg.xml用于数据库连接信息及Hibernate的一些配置信息(指定数据库方言类型)----主要用于定义数据库连接参数,指定数据库方言类型。-------------hibernate.cfg.xml?xmlversion='1.0'encoding='utf-8'?!DOCTYPEhibernate-configurationPUBLIC-//Hibernate/HibernateConfigurationDTD3.0//EN=coonection.driver_classcom.mysql.jdbc.Driver/propertypropertyname=connection.urljdbc:mysql://localhost:3306/jd1112db?useUnicode=true&characterEncoding=utf8/propertypropertyname=connection.usernameroot/propertypropertyname=connection.passwordtaodongjie199012/property!--Day01Tarena数据库连接池--propertyname=connection.pool_size1/property!--必配参数通过dialect(方言)来弥补数据库之间的差异--propertyname=dialectorg.hibernate.dialect.MySQLDialect/property!--调试工具hibernate执行sql语句时,在控制台显示--propertyname=show_sqltrue/property!--hibernate运行时加载的Hibernate映射配置文件--mappingresource=tarena/xuesheng/entity/User.hbm.xml//session-factory/hibernate-configuration3)Hibernate映射文件(可以有n个):用于指明类和表之间的对应关系,Hibernate根据该文件生成SQL语句;映射名称为*.hbm.xml推荐:类名Emp,映射文件Emp.hbm.xml----------*.hbm.xml?xmlversion=1.0?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=tarena.xuesheng.entity.Usertable=t_user1idname=idcolumn=idtype=integergeneratorclass=identity/generator/idpropertyname=namecolumn=nametype=string/property/class/hibernate-mapping4)测试类TestUser.javapublicclassTest3{@Testpublicvoidtest1(){Tarena//创建一个User对象Useruser=newUser();user.setName(kobe);//调用Hibernate的API用于装载Hinernate配置文件Configurationconf=newConfiguration();//在类路径中装载默认的配置文件hibernate.cfg.xml//如果配置文件关联了映射文件,同时也装载了映射信息conf.configure();//默认加载src/hibernate.cfg.xml//如果装载指定的配置文件//创建SessionFactorySessionFactoryfactory=conf.buildSessionFactory();//创建Session:与数据库之间的通话(类似于Connection)Sessionsession=factory.openSession();//获得事务Transactiontx=session.getTransaction();//开启事务tx.begin();//插入数据,或者删除,更新数据session.save(user);//delete(user),update(user),//提交事务tx.commit();//关闭sessionsession.close();}}----------封装为HibernateUtil:publicclassHibernateUtil{publicstaticConfigurationconf;privatestaticSessionFactorysessionFactory;static{conf=newConfiguration();conf.configure();sessionFactory=conf.buildSessionFactory();}publicstaticSessiongetSession(){returnsessionFactory.openSession();}}----------按主键进行查询方法:publicvoidtestFindAll(){Sessionsession=HibernateUtils.getSession();Tarena//HQL查询语句hibernatequerylanguage面向对象的查询语句Queryquery=session.createQuery(“fromUser”);//User类名---fromUserwhereListUserlist=query.list();session.close();for(Useruser:list){System.out.println(user.getId()+””+user.getNickname());}----------核心API:Configuration:配置和映射文件加载----Hibernate主配置,映射文件另一种方法:程序块中追加类----conf.addClass(User.class)进行追加SessionFactory:session对象工厂.getSession()---获得SessionSession:用于进行增删改操作.get(对象名.class,主键条件值).createQuery(“from对象名”);--创建Query对象session.close();---关闭连接Transaction:用于事务管理(无法自动提交,需要手动代码commit)Transactiontx=session.beginTransaction();---开始事务tx.commit();---提交事务Query:用于查询(是结果集对象)---是HQL(hibernatequerylanguage)语言List对象名list=query.lsit();---查询结果返回为集合Iteratorit=query.iterator();---返回迭代器3.主键生成方式常用主键生成方式:1)identity:用于自动生成主键方式,除了Oracle不支持,其他数据库一般都支持(较常用)。2)sequence:Oracle中使用,用序列生成ID主键:先调用指定的序列获取值,然后再执行插入操作,写入数据表主键字段。3)native:主键生成方式如果是native,就看配置文件hibernate.cfg.xml中方言propertyname=”dialect”是什么;如果方言是Mysql,相当于identity,如果方言是Oracle,相当于sequence4)increament:先获取主键最大值,然后再执行最大值+1,执行插入。(并发性太高系统不安全)5)assigned:告诉Hibernate框架忽略主键值的生成,程序员需要显示指定值。uuid:采用UUID算法生成一个主键值(字符串)hilo:采用高地位算法生成一个主键值(数值)4.Hibernate数据类型(了解)Hbm.xml映射文件propertytype=””可以使用两种类型:推荐使用Hibernate类型a.java类型Tarenajava.lang.Integerjava.lang.Stringjava.sql.Dateb.Hibernate类型integer,double,long,stringdate,time,timestamptrue_false,yes_no---相当于boolean类型5.改造ProjectDAOImpl实现为Hibernate结构工厂方法实现Action与DAO的解耦:publicclassDAOFactory{publicstaticProjectDAOgetProjectDAO(){returnnewHibernateProjectDAOImpl();}作用:1)创建实例2)工厂设计模式用于解耦6.Hibernate框架特性:(1)一级缓存:每个Session对象都有一个一级缓存,当对某个对象获取时,首先去一级缓存中获取,没有采取数据库查询。当数据被缓存到session中时,session就要负责维护缓存中的数据,这是Hibernate的重要机制:一级缓存机制。理解:1)如果session被查询,session将先到缓存中查找是否有被查询的对象,找到则直接取出,否则才查询数据库。2)session需要负责实时维护在缓存中的数据,保证缓存中的数据与数据库中数据一致性,一旦用户对缓存中的数据做了修改,session立刻将数据更新到数据库中。3)当session关闭后,将销毁一级缓存。4)一个session对象不能访问其他session对象的一级缓存。ThreadLocal利用一级缓存:利用ThreadLocal实现在多个类中只使用同一个session对象,改造HibernateUtil的getSession(
本文标题:Hibernate笔记整理完整版
链接地址:https://www.777doc.com/doc-4423754 .html