Hibernate笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

传智博客—赵涵笔记1HibernateHibernate简单应用(单表)1.导入hibernate所需要的jar包:antlr.jar:用来解析HQL语句。cglib.jar:用来修改类。asm.jar:在运行时候修改类。依赖于cglib.jar。commons-collections:提供集合功能,比java类中的集合提供更强大的功能。commons-logging.jar:记录日志。jta.jar:分布式事务。当有跨数据库访问的时候,需要这个包。dom4j.jar:用来解析XML文件。(记得导入数据库jar包)2.配置hibernate.cfg.xml文件(放在“src”下)!DOCTYPEhibernate-configurationPUBLIC-//Hibernate/HibernateConfigurationDTD3.0//EN=hibernate.dialectorg.hibernate.dialect.MySQLDialect/propertypropertyname=hibernate.connection.driver_classcom.mysql.jdbc.Driver/propertypropertyname=hibernate.connection.urljdbc:mysql:///zhaohan/propertypropertyname=hibernate.connection.usernameroot/propertypropertyname=hibernate.connection.password123/propertypropertyname=hbm2ddl.autocreate/propertypropertyname=show_sqltrue/propertymappingresource=com/it315/domain/User.hbm.xml//session-factory/hibernate-configurationHbm2ddl.auto的配置参数:Validate:加载hibernate时,验证创建数据库表结构。create:每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。批注[z1]:数据库的方言。批注[z2]:数据库驱动的名称。批注[z3]:连接数据库的URL地址。批注[z4]:用户名。批注[z5]:密码。批注[z6]:每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。批注[z7]:显示生成的SQL语句。批注[z8]:指定映射文件的路径。传智博客—赵涵笔记2create-drop:加载hibernate时创建,退出是删除表结构。update:加载hibernate自动更新数据库结构。3.User.javapackagecom.it315.domain;importjava.util.Date;publicclassUser{privatelongid;privateStringname;privateDatebirthday;……set,get方法省略}4.User.hbm.xml?xmlversion=1.0?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD3.0//EN=com.it315.domainclassname=Usertable=UserTableidname=idgeneratorclass=native//idpropertyname=namecolumn=user_name/propertypropertyname=birthdaycolumn=user_birthday/property/class/hibernate-mapping5.Main.javapackagecom.it315.main;importjava.util.Date;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.cfg.Configuration;importcom.it315.domain.User;publicclassMain{publicstaticvoidmain(String[]args){Configurationcfg=newConfiguration();批注[z9]:User.java所在的包。批注[z10]:与User.java映射的表名。批注[z11]:由hibernate根据底层数据库自行判断采用identity,hilo,sequence其中一种作为主键生成方式。批注[z12]:Name属性对应生成表中的user_name字段。批注[z13]:Configuration实例会根据当前的数据库配置信息,构造SessionFactory实例并返回。传智博客—赵涵笔记3SessionFactorysessionfactory=cfg.configure().buildSessionFactory();Sessionsession=sessionfactory.openSession();Useruser=newUser();user.setName(zhaohan);user.setBirthday(newDate());Transactiontc=session.beginTransaction();session.save(user);tc.commit();}}DomainObject的限制:○1必须有一个无参数的构造方法。○2有无意义的表示符id.(可选)○3非final的,对懒加载有影响。(可选)注意:初始化的代码是很耗资源的,所以将上面代码修改为:HibernateUtils.javapackagecom.it315.util;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;publicfinalclassHibernateUtils{privatestaticSessionFactorysessionFactory;static{Configurationcfg=newConfiguration();sessionFactory=cfg.configure().buildSessionFactory();}publicstaticSessiongetSession(){returnsessionFactory.openSession();}}Main.javapackagecom.it315.main;importjava.util.Date;importorg.hibernate.Session;importorg.hibernate.Transaction;importcom.it315.domain.User;importcom.it315.util.HibernateUtils;批注[z14]:如果配置文件的名称不是默认的“hibernate.cfg.xml”,那么configure()方法要指定文件名。批注[z15]:Session是持久层操作的基础,相当于jdbc中的connection.批注[z16]:对数据有更改的操作都要开启事务和提交事务。Hibernate默认的事务是关闭的。传智博客—赵涵笔记4publicclassMain{publicstaticvoidmain(String[]args){Sessionsession=null;Transactiontc=null;try{session=HibernateUtils.getSession();Useruser=newUser();user.setName(zhaohan);user.setBirthday(newDate());tc=session.beginTransaction();session.save(user);tc.commit();}catch(Exceptione){if(tc!=null){tc.rollback();thrownewRuntimeException(e.getMessage(),e);}}finally{if(session!=null){session.close();}}}}注意:Hibernate中的几个重要方法:○1save和persist的区别(在没有开启事务的前提下是有区别的,如果开启了事务,则效果是一样的。)○1save在没有开启事务的前提下,会将数据插入数据库,但是当发现事务没有开启的话,插入的数据就会立刻回滚。○2persist在没有开启事务的前提下,不会产生insert语句。○2saveOrUpdateidname=idunsaved-value=0generatorclass=native//id○3get和load的区别□1调用get()方法,会立刻访问数据库。生成select语句。□2调用load()方法,返回一个代理对象,只有在取得对象属性的时候才会真正的去访批注[z17]:设置没有保存的对象的id值为-1。调用session的saveOrUpdate()方法,如果这个对象的id和设置的这个-1是相等的,那么说明这个对象没有被保存过,就保存。如果不相等,那么就更新。传智博客—赵涵笔记5问数据库。例如:staticUsergetUser(longid){Sessionsession=null;Transactiontc=null;try{session=HibernateUtils.getSession();Useruser=(User)session.load(User.class,id);System.out.println(user.getClass());System.out.println(user.getName());returnuser;}catch(Exceptione){if(tc!=null){tc.rollback();thrownewRuntimeException(e.getMessage(),e);}}finally{if(session!=null){session.close();}}returnnull;}Hibernate中的对象的几种状态:○1瞬时:数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。○2持久:数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交,持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。○3托管:数据库中有数据与之相应,但当前没有session与之关联。托管对象状态发生改变,hibernate不能检测到。判断对象的状态是根据session判断的,看它与session是否关联。例如:刚查到的对象,在session还没有关闭之前,是持久状态,因为数据库中有数据与它对应,且相关联

1 / 51
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功