




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 hibernate入门1.1 框架介绍1.2 回顾l 传统使用JDBC开发l 使用工具包,DbUtils (commons-.)1.3 hibernate 介绍l 轻量级:依赖其他内容较少,消耗资源成本少。l 持久层:与数据库进行数据交换。l ORM ,对象关系映射(object relation mapping)对象:java一切都是对象,一般情况使用JavaBean关系:数据库中的表(二维表)映射:配置文件1.4 流行框架2 第一个案例2.1 编写步骤l 创建java项目l 导入jar包l 核心配置文件 hibernate.cfg.xml (configuration)l JavaBean + 映射文件 (bean名称.hbm.xml)注意:必须将映射文件,添加核心配置文件中l 操作 api2.2 导入jar包l 版本:3.6.10l 导入jar(n个)%h%/hibernate3.jar核心%h%/librequired必须目录下的所有%h%/libjpajava 规范(java persist api)java持久api,hibernate对其支持(一般注解开发)注意:数据驱动2.3 核心配置文件l 名称:hibernate.cfg.xmll 位置:src (classpath)l 内容:(driver、url、username、password、 方言)l 约束com.mysql.jdbc.Driverjdbc:mysql:/localhost:3306/h_day01_dbroot1234org.hibernate.dialect.MySQL5Dialect注意:必须手动创建数据库2.4 javabean和映射文件2.4.1 javabean 字段public class User private Integer uid;/注意:必须是整形private String username;private String password;2.4.2 映射文件l 名称:User.hbm.xmll 位置:javabean同包l 内容:(配置javabean属性 和 表中字段 对应关系)l 约束注意:映射文件必须添加到核心配置文件中l 解决方案:hibernate.cfg.xml表不存在方案1:数据库手动创建表(建议)方案2:hibernate自动创建(上课优先)3 CRUD操作添加:save更新:update删除:delete通过id查询 ,get(Class , id)查询所有:new Query(from .).list()分页:setFirstResult(int)setMaxResults(int)Testpublic void demo04()Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();/分页查询 ,提供hibernate提供的api分页/ * 回顾sql select * from t_user limit startIndex,pageSize;/ * startIndex 开始索引/ * pageSize 每页显示个数Query query = session.createQuery(from User);/ 第一页/query.setFirstResult(0);/query.setMaxResults(2);/ 第二页query.setFirstResult(2);/回顾算法: startIndex = (pageNum - 1 ) * pageSize;query.setMaxResults(2);List allUser = query.list();for (User user : allUser) System.out.println(user);session.getTransaction().commit(); /获得之前开启的事务session.close();sessionFactory.close();Testpublic void demo03()Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();/查询所有-使用hibernate 查询 query 语句 hql/ * hql hibernate提供面向对象的查询语句,类似与sql/ * sql 格式: select 表中字段 from 表名 where .,例如: select * from t_user/ * hql 格式:select 对象属性 from 对象 where . ,例如:from UserQuery query = session.createQuery(from User);List allUser =query.list();for (User user : allUser) System.out.println(user);session.getTransaction().commit(); /获得之前开启的事务session.close();sessionFactory.close();Testpublic void demo02()Configuration config = new Configuration().configure();SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();/通过id查询User user = (User)session.get(User.class, 1);System.out.println(user);session.getTransaction().commit(); /获得之前开启的事务session.close();sessionFactory.close();Testpublic void demo01()User user = new User();user.setUid(1);user.setUsername(杰克);Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Transaction transaction = session.beginTransaction();/更新 - 通过id更新所有内容,如果没有设置nullsession.update(user);mit();session.close();factory.close();4 api详解4.1 结构图PO persistent object 持久对象应用程序通过po类与hibernate进行交互。4.2 Configurationl hibernate 提供用于加载配置文件的。l 核心配置文件种类:perties 和 hibernate.cfg.xml一般情况使用 hibernate.cfg.xml ,可以配置不同内容(基本信息,映射文件)perties 只能配置基本信息(key=value)参考:%h%/project/etc/pertiesl 构造方法,new Configuration() hibernate将加载 perties 配置文件l 提供方法:configure() 加载hibernate.cfg.xml 配置文件通过 configure(String ) 指定自定义的cfg.xml文件。l 加载映射文件 hbm.xmladdResource() 加载自定义的映射文件。例如:config.addResource(cn/itcast/domain/User.hbm.xml);addClass() 加载自定义映射文件。例如:config.addClass(User.class);建议:映射文件与Java通同名同包,且扩展名为hbm.xml注意:如果重复添加JavaBean,提示错误4.3 SessionFactoryl hibernate提供 工厂,用于生成sessionl 每一个应用程序只能有一个实例(单例),类似Jdbc时学习的连接池l 线程安全的,及不同的线程都可以获得不同session。l 获得实例 configuration.buildSessionFactory()l 获得sessionopenSession()创建一个回话,每执行一次,session都是新的。getCurrentSession() 获得当前线程中绑定的session,暂时不能用。l SessionFactory 缓存配置信息(例如: hibernate.cfg.xml / .hbm.xml 配置内容)4.4 Sessionl hibernate 提供 操作 PO类l 线程不安全,及每一个用户必须独享自己的session。l 常用apisave/update/delete/createQuery (list/setFirstResult/setMaxResults)l 操作事务session.beginTransaction() 开启事务session.getTransaction() 获得当前事务4.5 事务操作l 开启事务:beginTransaction()l 提交事务:commit()l 回滚事务:rollback()5 主配置文件详解l 名称:hibernate.cfg.xmll 位置:src (classpath) - WEB-INF/classesl 配置 BeanFactory异常原因:java web 6.0项目,默认进行Bean校验,通常不使用。解决方案:方案1:删除此jar方案2:hibernate 配置取消com.mysql.jdbc.Driverjdbc:mysql:/h_day01_dbroot1234org.hibernate.dialect.MySQL5Dialecttruetruenonethread6 问题l 如果使用session.openSession() 可以通过执行多次 session.beginTransaction() 进行多次事务操作。l 但如果使用session.getCurrentSession() 只能使用一次,如果进行提交,默认情况下,将进行session.close(),解决此问题,spring采用 OpenSessionInViewFilter 过滤器。Testpublic void demo01()Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.getCurrentSession();/开启事务Transaction transaction = session.beginTransaction();/* 操作User user = new User();user.setUsername(rose2);user.setPassword(1234);session.save(user);/5 提交mit();/再开启 Spring OpenSessionInViewFilterTransaction transaction2 = session.beginTransaction();/* 操作User user2 = new User();user2.setUsername(tom);user2.setPassword(1234);session.save(user2);/5 提交mit();/6 释放session.close();/7 关闭工厂factory.close();7 映射文件详解l 文件名称: javabean名称.hbm.xmll 位置:javabean同包l 内容:7.1 约束7.2 属性基本设置普通属性 name : 默认用于配置javabean属性名称length : 配置长度,字符串默认255,mysql类型 varchar(255)column : 当前属性对应表中字段(列)名称,默认name的值方式1:column属性(attribute) , 方式2:子标签 type: 数据字段类型方式1:hibernate类型,例如:string方式2:java类型,例如:java.lang.String方法3:mysql类型,例如:varchar(50)日期时间类型date , 日期 java.util.Date , 对应jdbc类型:java.sql.Datetime , 时间 java.util.Date , 对应jdbc类型:java.sql.Timetimestamp,时间戳 java.util.Date (注意:时间戳随着数据更改变化) , 对应jdbc类型:java.sql.Timestamp项目使用:字符串、long (date.getTime()、日期时间类型使用数据的datetime 表示日期时间。7.3 属性和字段选择其他配置access ,用于确定当前属性如何进行数据封装property : 默认值,hibernate采用javabean属性 与 表字段进行对应。在javabean必须提供 getter/setter方法field : hibernate采用 javabean 字段 与 表字段进行对应。 可以没有getter/setter方法例如:private String username;noop : 提供给hibernate hql使用,数据库没有对应字段。一般不使用。precision 和 scale 给 oracle配置,在mysql没有作用。precision 配置数字位数scale 配置小数位数 例如:numeric(precision,scale) , 12.34 numeric(4,2)7.4 优化hibernate生成sqll 添加insert 和更新update 可以设置,允许当前属性是否在sql语句中 。默认值:trueinsert=false 表示生产insert语句,没有当前字段。update=false 表示生产update语句,没有当前字段。 设置动态 insert和update,默认值:falsedynamic-insert=true 如果生产insert语句,属性内容为null,生产的sql语句中将没有该字段。dynamic-update=true 只有内容被修改才进行更新。默认更新所有。注意:如果使用动态更新,数据必须是查询获得的,此时修改的内容将被更新,其他内容不变。7.5 派生属性l 派生属性内容,一般情况都是从数据库另一个张表B查询获得。聚合函数:count()/max()/min()/avg()/sum()等l sql语句要求,如果使用字段,默认从当前表A(配置文件描述的表)获得字段,如果要从B表中获得字段,必须使用表的别名。l hibernate生成sql语句Hibernate: select book0_.bid as bid1_0_, book0_.title as title1_0_, book0_.price as price1_0_, (select count(*) from t_order o where o.book_id = book0_.bid) as formula0_0_ /需要B表别名 from t_book book0_ where book0_.bid=?8 OID映射8.1 什么是OIDl java区分对象:hashCode相同l 数据库记录:主键primary key 相同l hibernate 通过OID确定相同。及OID相同,对象就相同。OID取值为数据库主键的值。new User().setUid(1) java是一个对象A,hibernate是一个PO对象Cnew User().setUid(1) java是另一个对象B,hibernate是同一个PO对象Cl PO持久对象中的数据,对应 表中一条记录。8.2 配置OID8.3 基本设置 属性(attribute)配置name : OID 属性名称column : 表字段列名access : 确定访问属性或字段length :表字段长度type : 表字段类型unsaved-value : save或update方法使用依据String ,默认null,如果使用unsaved-value=abc ,当执行save方法,设置“abc”相当之前null8.4 主键生成策略 主键生成策略,hibernate根据设置生成OID的值方案#1 increment , hibernate 自己维护表的数据自动增强,在执行insert语句执之前,先查询。select max(cid) from . 查询最大值,累加1当前OID的值。问题:高并发、或集群 存放问题。#2 identity , hibernate 将使用数据库底层自动增强。例如:mysql auto_increment#3 sequence , hibernate 将使用数据库底层序列。例如:oracle 序列#4 hilo , hibernate采用高低位算法(不支持自动增强,也不支持序列)。high lowtable ,设置数据库中,另一个表A的表名。column,表A的列名max_lo,一次操作多少条记录。100表示可以允许一次操作100条记录。算法:max_lo * next_value + next_value例如: hi_value next_value 100 #5 native ,根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】# 以上5个类型要求:整形(long, short 或者 int)#6 uuid ,随机字符串32长度# 以上6种OID值都是有hibernate自动生成:代理主键#7 assigned : 自然主键,生成手动设置。例如身份证建议:native、uuid、assigned (identity、sequence)9 要求:l 搭建hello worldl 主配置文件:多读(key),value多敲l 映射文件: | l api 练习:不使用工具 7步骤10 持久对象状态l hibernate之后操作通过对象状态确定如何使用apil 状态分类(3种):transient 瞬时态、persistent持久态、detached脱管态瞬时态:session没有缓存数据,数据库没有对应的数据。例如:new 对象持久态:session缓存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题08 书面表达(Units1-8必背满分范文热点预测)20篇(解析版)
- 2025年玻璃钢化设备项目申请报告模范
- 车辆转让附带二手车交易税费代缴协议
- 城市地下综合管廊测绘合同
- 高档物品典押抵押贷款协议
- 文化创意园区厂房拆迁及艺术补偿协议
- 建筑材料采购合同与一般购销合同标准对比
- 生态停车场车位购置及生态补偿协议
- 出租车公司新能源充电桩股权投资合同
- 口才机构人员管理制度
- 招标代理公司招标代理服务方案(技术标)
- 新能源汽车与传统汽车的对比
- 中班健康课件《夏天少喝饮料》
- 卒中防治中心建设情况汇报
- 紫罗兰永恒花园
- 酸感受离子通道的结构与功能
- 人教版四年级数学下册期末试卷(附答案)
- (完整版)A4拼音四线格打印模板
- DB31∕T 1249-2020 医疗废物卫生管理规范
- 救护车音响电路设计及引力波的实验探测给我们的启示
- 2023届湖北省武汉市东湖高新区数学六年级第二学期期末综合测试试题含解析
评论
0/150
提交评论