




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)Logic CC#SQL BaseHTML/CSSSQL Advance.Net OOPJavaScriptWinformsJavaWeb(JSP)JQueryMysqlAJ2EE(SSH2)Ajax&Web2.
2、0A MVCOOAD&UMLWindows MobileAndroidNTCSE&PM企业企业项目项目实训(商业项目)实训(商业项目)J2SE(OOP)LinuxOracleSqlServer” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 学完本门课程,你能够:理解Hibernate持久层框架应用概念使用Hibernate完美支持ORM对象关系映射使用Hibernate代替JDBC完成数据持久化操作” 如果十年前Sun没有做Java,人
3、们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 编写第一个Hibernate应用程序完成数据记录的增加” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 认识Hibernate,使用Hibernate的重要意义 使用Hibernate的准备工作与操作步骤 Hibernate配置文件与实体映射文件 使用Hibernate完成数据持久化(插入或保存)操作”
4、 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 在编写DAO层代码时,容易出现哪些问题?思考:这部分代码思考:这部分代码规律性很强,是否规律性很强,是否可以采用可以采用“通用通用”的方法的方法“集中集中”解解决?决?代码繁琐代码繁琐容易出错容易出错纯纯“体力体力”劳动劳动工作量大工作量大占用大量开发时间占用大量开发时间” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写
5、程序”Scott McNealy(Sun首席执行官) 使用Hibernate后的DAO层代码:代码精简易读代码精简易读封装了封装了JDBC操作,操作,以面向对象的方式以面向对象的方式操作数据操作数据开发工作量小,可开发工作量小,可以将精力集中在业以将精力集中在业务逻辑的处理上务逻辑的处理上public class FwxxDAOHibImpl extends BaseHibernateDAO implements FwxxDAO public FWXX get(int fwid) super.get(FWXX.class,fwid); public void add(FWXX fwxx) su
6、per.add(fwxx); public void del (int fwid) super.del(FWXX.class,fwid); public void update(FWXX fwxx) super.update(fwxx); Hibernate就是用来就是用来解决这些问题的解决这些问题的” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) Hibernate之父:Gavin KingJBoss核心成员之一,EJB3.0专家委员会成员 Hiber
7、nate In Action作者2001年开始开发Hibernate2003年Hibernate发展为Java世界级主流持久层框架充满激情脾气倔强永不言败” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 什么是持久化?内存内存姓名:小颖姓名:小颖性别:女性别:女特长:英语、程序设计特长:英语、程序设计瞬时状态瞬时状态磁盘磁盘持久状态持久状态用用JDBC完成数据在持久和瞬时状完成数据在持久和瞬时状态间的转换态间的转换:stmt.execute ( ).瞬时
8、状态:瞬时状态:保存在内存的程序数据,程序退出保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态后,数据就消失了,称为瞬时状态持久状态:持久状态:保存在磁盘上的程序数据,程序退保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持出后依然存在,称为程序数据的持久状态久状态持久化:持久化:将程序数据在瞬时状态和持久状态将程序数据在瞬时状态和持久状态之间转换的机制之间转换的机制持久化持久化” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官) 什么
9、是ORM?对象数据(对象数据( )name:小颖:小颖sex:女:女skill:英语、程序设计:英语、程序设计User对象对象持久化层持久化层业务逻辑层业务逻辑层表现层表现层数据库数据库TBL_User表表关系型数据关系型数据( ) 映射信息映射信息类: User表: TBL_User属性字段nameuser_namesexuser_sexskilluser_skillORM(对象(对象-关系映射):关系映射):完成对象数据到关系型数据映射的完成对象数据到关系型数据映射的机制称为对象机制称为对象-关系映射,简称关系映射,简称ORM。” 如果十年前Sun没有做Java,人们便会写.Net程序,如
10、果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)1、是一个主流的持久化框架A、在JDBC基础上进行封装B、只需要少量代码就可以完成持久化工作2、是一个优秀的ORM(对象-关系映射)机制A、通过映射文件保存映射信息B、在业务层以面向对象的方式编程,不用考虑数据保存形式” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)如何使用Hibernate实现“用户添加”功能?使用Hibern
11、ate的“5个准备,7个步骤”准备1:导入Hibernate库(Hibernate常用的jar包有17个)” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)准备2:根据需求设计数据库和表A、在MySql中创建test数据库,指定数据库编码为UTF8drop database if exists test;create database test character set utf8 collate utf8_unicode_ci;use test;B、在创
12、建好的test数据库中创建user用户表t_user(usert_user(user表名不要用表名不要用user,user,因为因为useruser是是MysqlMysql中的关键字中的关键字) )drop table if exists t_user;表名用成t_userCREATE TABLE t_user ( user_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(20) NOT NULL, user_pass varchar(30) NOT NULL, PRIMARY KEY (user_id) ENGINE=InnoDB
13、AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)准备3:根据数据库表结构编写实体类,一个实体类对应一个数据库表,由实体类创建的各个对象对应数据库表中的每一行记录packagepackage com.scxh.hit01.po;importimport java.io.Serializable;publicpublic classclass User implementsimple
14、ments Serializable/实体类可被序列化 privateprivate Long userId;/用户ID private private String userName;/用户名 privateprivate String userPass;/用户密码 public User()/无参数构造 public User(Long userId,String userName)/带初始化参数的构造 this.userId=userId; this.userName=userName; /以下是getter/setter方法 publicpublic Long getUserId()
15、returnreturn userId; public public voidvoid setUserId(Long userId) thisthis.userId = userId; public public String getUserName() returnreturn userName; public public voidvoid setUserName(String userName) thisthis.userName = userName; public public String getUserPass() returnreturn userPass; public pu
16、blic voidvoid setUserPass(String userPass) thisthis.userPass = userPass;” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)准备4:编写实体类与数据库表的映射文件(User.hbm.xml) ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)准备5:
17、编写配置文件(hibernate.cfg.xml)并放置于classpath根路径下(开发时放在src目录下即可)在JDBC时代,我们的这些配置往往是写在一个properties的属性配置文件中,在程序运行时通过IO流操作将其装载到内存,现在Hibernate为程序员量身订做了这样的一个xml配置文件,并且通过它自身的API来完成xml解析和读取” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)准备5:编写配置文件(hibernate.cfg.xml) j
18、dbc:mysql:/:3306/test?characterEncoding=utf8 root 123456 com.mysql.jdbc.Driver org.hibernate.dialect.MySQLDialect true true 配置数据库配置数据库链接链接数据库数据库“方言方言”运行时在控制台显示运行时在控制台显示SQL语句语句指定映射文件位置,可以配置多个指定映射文件位置,可以配置多个在控制台格式化显示在控制台格式化显示SQL语句语句” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是
19、为Sun的设备写程序”Scott McNealy(Sun首席执行官)1、使用Hibernate的五项准备工作是?A、添加Hibernate类库(将17个jar包放置于classpath路径下)B、根据需求拟出实体间的关联关系,设计出数据库和数据库表C、根据数据库表中字段编写出实体类,最好实现Serializable接口D、根据数据库表和实体间的对应关系编写映射配置文件,该文件一般放在实体包下面E、编写Hibernate核心配置文件,配置数据库连接和映射文件位置等2、Hibernate配置文件中必须配置的信息是哪些?A、数据库连接配置 B、映射文件位置3、使用Hibernate在数据库中添加一个
20、表时,都有哪些准备工作要做?A、根据新添加的表对应添加一个相应的实体类B、根据新添加的表和实体类编写并添加一个新的映射文件C、在hibernate.cfg.xml中增加新增映射文件的位置” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)1、Hibernate是全自动的持久层框架,尽管Hibernate可以自动创建数据库 表,但是,在开发中我们通常都不这么做,因为Hibernate只是根据一般 原则来创建你需要的表,对于底层数据库的类型及其优化模式, Hib
21、ernate是全然不知的(比如Hibernate建立的表可能根本无法利 用底层数据库的分区和索引等)2、映射文件理论上来讲放在工程内的任何地方都行,但是一个比较好的做 法是将它放置在与实体类相同的包中,虽然一个映射文件中可以配置多 个类的映射(使用多个class标签),但是我们强烈建议一个映射文件中 只配置一个实体类的映射,理由是便于工程化的管理和维护(这有点类 似在一个Java源文件中建议只定义一个类的道理是相同的)3、Hibernate中指定数据库方言是让Hibernate认识底层数据库的类型,以 便于Hibernate在进行数据库操作时有意识的作出某些优化调整,但是 Hibernate的
22、优化程度是非常有限的” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)使用Hibernate的7个步骤: ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)1、Hibernate立足于使用面向对象的设计模式来解决数据库中面向关系型的 数据表,Hibernate是一个优秀的ORM映射框架,它能自动实现将应用层中的 实体对
23、象操作转换成面向关系的数据表操作2、在JDBC时代,我们的持久层操作是编写并组装SQL语句,将组装好的SQL语句 发往数据库由数据库来执行数据表操作,编写SQL的过程需要程序员认识关 系型数据库的各种集合操作,不了解这些关系理论就无法编写SQL语句, Hibernate将面向关系的各种操作封装在底层,将面向对象的各种操作 留给应用层来完成,程序员只需要通过面向对象的操作就可以完成基于面 向关系型数据库的各种操作3、面向对象操作的效率极为低下,尽管Hibernate曾经做出了很多努力来提升 操作效率,但是由于Hibernate框架自身的原因始终不可能达到像JDBC那样 灵活的调整性能,于是Hib
24、ernate为自己开辟了一到留给程序员的逃生门, 那就是返回到原生JDBC时代” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)public class UserDaoImpl implements IUserDao public void addUser(User user) /1、读取配置文件(默认读取classpash根目录下的hibernate.cfg.xml) Configuration conf = new Configuration().co
25、nfigure(); /2、使用配置构建Session工厂对象 SessionFactory factory=conf.buildSessionFactory(); /3、使用Session工厂打开一个会话Session Session session=factory.openSession(); Transaction tx=null; try tx=session.beginTransaction(); /4、执行增删改需要开启事务(查询则不需要) session.save(user); /5、普通User对象与Session关联变成持久化对象 mit(); /6、提交事务,保存User对
26、象 catch(Exception e) if(null!=tx)tx.rollback(); /如果操作发生异常则回滚事务 e.printStackTrace(); finally session.close(); /7、关闭会话连接 ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)public class TestMain public static void main(String args) User user=new User(); user.
27、setUserName(李祥); user.setUserPass(lixiang); IUserDao dao=new UserDaoImpl(); dao.addUser(user); ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)A、Hibernate是对JDBC层所做的一种封装,虽然应用层是面向对象的操作 (dao.addUser(User user),但是底层仍然需要将其转化成JDBC执行SQL语句来完成数 据库操作,我们在hibernate
28、.cfg.xml文件中配置了true,因此我们可以看到在控制台打印Hibernate执行的 SQL语句, true则用于格式化打印输出,如果 没有配置它,打印出来的sql语句在控制台将不会换行B、new Configuration().configure();默认加载classpath根路径下的hibernate.cfg.xml文件, 如果需要加载你指定位置的配置文件可以调用: new Configuration().configure(String config);除非特别理由,通常是没有必要改动默认C、User.xml映射文件中指定主键生成方式为native,它表示Hibernate不负责
29、主键生成,主 键的生成由数据库来完成(这可能通过自动增长、序列或触发器等来完成),如果指定为 assigned则表示主键由应用程序指定,此时如果提交的实体对象ID值为null则会抛出异 常(建议实体对象ID为数字类型时都采用包装类型,不建议使用基本类型)D、Hibernate在映射文件中所做的任何字段、主键、外键、约束等映射仅仅是它自身对数 据操作所做的一种约束,它并不强制要求底层数据库必须存在这些约束” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)E、
30、任何时候当你看到控制台有SQL语句打印出来说明Hibernate执行过对数据库的IO操作, 在执行SQL语句过程中抛出的异常很大程度上是由底层数据库方抛出的异常F、Hibernate的事务默认是取消自动提交的,需要调用commit手动提交事务来完成操作,在 commit之前Hibernate仅仅是向数据库提交数据库脚本执行计划并未真正执行sql语句G、Session会话相当于JDBC中的Connection连接,Hibernate操作完成之后需要手动调用 close方法来关闭Session会话,如果希望Hibernate事务操作完成自动关闭Session可以 通过ThreadLocalSess
31、ionContext来完成,使用使用ThreadLocalSessionContext来操作要来操作要 求所有的求所有的CRUD(CRUD(包括查询包括查询) )都必须在一个事务上下文中来完成都必须在一个事务上下文中来完成,要使用 ThreadLocalSessionContext来完成操作必须使用下面的步骤来获取一个Session: (1)、在hibernate.cfg.xml文件中增加下面的属性配置: thread (2)、使用Session工厂调用getCurrentSession()方法来获取Session: Session session=factory.getCurrentSess
32、ion(); 通过上面的两个操作之后,你就不需要在finally块中去关闭Session了,事务被commit 或roolback之后其Session将会被自动关闭,但是应该注意的是使用” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)public class UserDaoImpl implements IUserDao public void addUser(User user) Configuration conf = new Configurati
33、on().configure(); SessionFactory factory=conf.buildSessionFactory(); Session session=factory.getCurrentSession(); /不再使用不再使用openSession()方法方法 Transaction tx=null; try tx=session.beginTransaction(); session.save(user); mit(); /提交事务之后自动关闭提交事务之后自动关闭SessionSession catch(Exception e) if(null!=tx)tx.rollba
34、ck(); /异常发生之后异常发生之后, ,事务事务回滚回滚也会自动关闭也会自动关闭SessionSession e.printStackTrace(); /不再需要在不再需要在finallyfinally块中去关闭块中去关闭SessionSession ” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)A、Hibernate一级缓存又称为Session缓存或事务级缓存,说它是一级缓存是为了区别于后面章节将要 介绍的二级缓存而言来说的,一二级缓存都是Hib
35、ernate支持的缓存机制,其中一级缓存是 Hibernate自带的,我们不能删除它,只能维护和管理它B B、在、在HibernateHibernate的缓存机制中的缓存机制中, ,以实体以实体ID(ID(在映射文件中通过在映射文件中通过idid标签指定标签指定) )值作为建值作为建, ,实体对象本身作实体对象本身作 为值进行缓存为值进行缓存( (相当于相当于HashMapHashMap的键值结构的键值结构),Hibernate),Hibernate在访问缓存中的实体对象时将根据实体的在访问缓存中的实体对象时将根据实体的 IDID值去检索实体对象值去检索实体对象, ,对于对于Hibernate
36、Hibernate的一级缓存的一级缓存, ,它不允许有两个它不允许有两个IDID值完全相同的实体对象值完全相同的实体对象, ,如果如果 在在SessionSession打开的情况下打开的情况下(Session(Session被关闭意味着一级缓存空间将被回收被关闭意味着一级缓存空间将被回收) )试图保存两个试图保存两个IDID值相同的值相同的 对象将会抛出键不唯一的对象将会抛出键不唯一的HibernateExceptionHibernateExceptionC、当Hibernate的Session调用save方法保存一个实体时,Hibernate同时也会将该实体缓存起来便于 下次访问该实体时直接
37、从缓存中提取温馨提示温馨提示: :1、Hibernate只有一级缓存才会检查缓存中实体ID的唯一性,因为一级缓存属于事务级缓存,用于维系 一个完整的原子化事务操作,二级缓存则不会检查实体ID的唯一性,二级缓存主要为提升Hibernate 查询性能而给出的第三方支持2、Hibernate的增删改查首先都是针对一级缓存进行操作的,根据不同的配置一级缓存可以将数据写 进二级缓存中,二级缓存是一个比会话事务更大范围的进程级缓存,一二级缓存都是基于键值数据 结构的缓存” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他们就是为windows写程序,而不是为Sun的设备写程序”Scott McNealy(Sun首席执行官)SessionSession调用调用savesave方法将直接执行方法将直接执行insertinsert语句插入参数实体对应的数据库记录语句插入参数实体对应的数据库记录, ,在在此有以下情况此有以下情况: :A A、如果、如果hbmhbm映
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年企业节能改造项目-高效空调设备采购与施工合作协议
- 银行视频监控工程质量管理体系和保证措施
- 2025年医疗招聘主管护师测试题附答案
- 2025年心肺复苏理论考试试题(含答案)
- 放射治疗质量监控小组职责
- 人教版四年级下册语文2025年课程改革计划
- 制药行业安全培训计划
- 建筑工程施工现场安全管理方案
- 市政管道闭水试验实施方案
- 企业员工食堂经营方主要负责人职责
- 2025年海洋工程行业投资趋势与盈利模式研究报告
- (2025年标准)分手房产归属协议书
- 酒吧承包经营合同(标准版)
- 厨房电器使用课件
- 军人压力调试课件
- 人教版一年级上册《劳动教育》-全册课件
- 筷子兄弟小苹果电声乐队总谱
- 妊娠合并心脏病及课件
- 私募股权投资基金激励制度(包含募资奖励、投成奖励、退出奖励等)
- 现代写作教程全套课件
- 双溪课程评量表
评论
0/150
提交评论