Hibernate文档.docx
- 文档编号:30521231
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:108
- 大小:359.52KB
Hibernate文档.docx
《Hibernate文档.docx》由会员分享,可在线阅读,更多相关《Hibernate文档.docx(108页珍藏版)》请在冰豆网上搜索。
Hibernate文档
Hibernate
1.1简介
一.orm和Hibernate
为什么orm框架编程语言和底层数据库发展不协调,催生了orm框架orm
ORM(对象关系数据库映射)Object/releationMappingorm理解成一种规范面向对象的简单易用性和数据库技术的优势
面对象设计————面向对象编程-————数据库持久化必须返回数据库的访问模式orm模型
编程语言的优势:
1.面向对象的建模,操作;2.多态,继承。
3.简单易用易理解;
数据库的发展并未同步编程语言的发展:
1.大数据的查找和排序2.集合数据连接的操作。
映射3.数据库的并发和事务
4.数据的约束和隔离
orm模型流行的orm模型:
JpAHibernate(开源orm框架)IbatisTopLink
解决办法
1。
jdbc人工转换
2.使用orm模型
优势:
1,开发速度快,节约成本。
updatetableseta=xxx,b=xxx,c。
。
。
。
。
whereid=xxx;
HIbernate:
优势:
1.Hibernate对jdbc访问数据库代码分装大大简化了数据库访问的重读代码;
2.HIbernate主流的持久化框架,很大程度上简化了dao编码工作;
3.Hibernate使用的反射机制,而不是使用字节码程序的透明性
4.多种数据库的支持实现复杂的映射关系
5。
完全的面向对象。
6.开源和免费的linces
7.轻量级的封装、
8.可扩展性。
劣势:
1.学习成本高、表的关系十分复杂数据量十分庞大的时候不推荐使用HIbernate
原生态的jdbc操作数据库;
一.引入
●模型不匹配(阻抗不匹配)
Java面向对象语言,对象模型,其主要概念有:
继承,关联,多态等;数据库是关系模型,其主要概念有:
表,主键,外键等
●解决办法
1.使用jdbc手工准换
2.使用orm(ObjectRelationMapping对象关系映射)框架来解决,主流的有Hibernate,Toplink,OJB,ibatis(半自动的)
●优势
开发速度快节约成本
Hibernate的优点:
1、Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2、Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作。
3、Hibernate使用java的反射机制,而不是字节码增强程序类实现透明性
4、Hibernate的性能非常好,因为它是一个轻量级框架。
映射的灵活性很出色。
它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
5、Hibernate使数据库的操作完全面向对象。
而不是从前的面向关系进行操作。
●劣势
学习成本高表的关系十分复杂并且数据量十分庞大不推荐使用Hibernate推荐使用JDBC或者Ibatis
JDBC的优点和缺点
JDBC的优点
直接底层操作,提供了很简单、便捷的访问数据库的方法,跨平台性比较强。
灵活性比较强,可以写很复杂的SQL语句。
JDBC的缺点
因为JAVA是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。
操作比较繁琐,很多代码需要重复写很多次。
如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。
JDBC的程序操作可以封装一些什么内容?
又不可以封装哪些内容?
Hibernate
为什么要用Hibernate
Hibernate实现了面向对象的数据库编程
Hibernate比起JDBC来,在代码的书写上比较简单化了。
Hibernate提出了缓存机制,这样可以使访问数据的效率提高很大。
Hibernate的配置
使用mysql数据库进行演示安装好如果没有服务的话在安装目录下的bin目录中找到mysqld在cmd中进入到这个目录中,然后mysqld.exe--install安装这个服务。
首先建立一个工程,然后添加Hibernate能力
然后填写相应的配置即可。
DriverName:
mysql
URL:
jdbc:
mysql:
//localhost:
3306/hzgghibernate
Username:
root
Password:
root
1.2创建映射类实例由表到类
创建的两个实体对象和xx.hbm.xml.
1.2.1使用单体对象进行增删改查
以book为例idbnameauthor
如出现中文乱码加入如下代码
jdbc:
mysql:
//localhost:
3306/hzgghibernate?
useUnicode=true&characterEncoding=utf-8
importjava.util.List;
importorg.hibernate.HibernateException;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hzgg.hibernate.model.Book;
importcom.util.HibernateSessionFactory;
publicclasstest{
/**
*1.获得Session
*2.操作领域对象
*3.使用Session方法进行增删改查
*4.如果是dml操作。
需要提交事务
*5.关闭Session
*@paramargs
*/
publicstaticvoidmain(String[]args){
//save();
//queryById
(2);
//queryAll();
//delete();
//update();
}
//保存数据
publicstaticvoidsave(){
Sessionsession=null;
Transactiontx=null;
try{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
Bookbook=newBook("2c","brudddce");
//Productp=newProduct();
//p.setName("chide");
//p.setDate(newDate(0));
//p.setPrice(3.33);
//session.save(p);
session.save(book);
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
tx.rollback();
e.printStackTrace();
}finally{
mit();
HibernateSessionFactory.closeSession();
}
}
//单个查询
publicstaticBookqueryById(intid){
Sessionsession=HibernateSessionFactory.getSession();
Bookbook=(Book)session.get(Book.class,id);
System.out.println(book.getBname());
//HibernateSessionFactory.closeSession();
returnbook;
}
//查询全部
publicstaticvoidqueryAll(){
/**
*遇到写语句的时候用Query类
*SQl
*HQLfromcalss
*/
Sessionsession=HibernateSessionFactory.getSession();
Stringhql="fromBook";
Queryquery=session.createQuery(hql);
List
for(Bookbook:
list){
System.out.println(book.getBname());
}
HibernateSessionFactory.closeSession();
}
//删除数据
publicstaticvoiddelete(){
Sessionsession=null;
Transactiontx=null;
try{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
Bookbook=queryById
(1);
session.delete(book);
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
tx.rollback();
e.printStackTrace();
}finally{
mit();
HibernateSessionFactory.closeSession();
}
}
//更新数据
publicstaticvoidupdate(){
Sessionsession=null;
Transactiontx=null;
try{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
Bookbook=queryById
(2);
book.setAuthor("kkkk");
session.update(book);
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
tx.rollback();
e.printStackTrace();
}finally{
mit();
HibernateSessionFactory.closeSession();
}
}
publicstaticSessionbuildSession(){
/**
*1.加载配置文件Configuration
*2.生产SessionFactory
*3.创建Session
*/
Configurationconf=newConfiguration();
conf.configure("hibernate.hbm.xml");
SessionFactoryfactory=conf.buildSessionFactory();
Sessionsession=factory.openSession();
returnsession;
}
}
代码分析
配置文件:
Hibernate.connection.url表示要链接的数据库地址
Hibernate.connection.driver_class表示要链接的数据库的驱动类
Hibernate.connection.username要连接的数据库的用户名
Hibernate.connection.password要连接的数据库的密码
Hibernate.dialect表示要使用的数据库的类型
org.hibernate.dialect.MySQL5Dialectmysql数据库
org.hibernate.dialect.Oracle9Dialectoracle数据库
org.hibernate.dialect.SQLServerDialectSQLServer数据库
hibernate.hbm2ddl.auto
validate:
加载hibernate时验证创建表结构
update:
加载hibernate时自动更新数据库结构,如果表存在不用创建,如果不存在就创建。
create:
每一次加载hibernate时都创建表结构
create-drop:
加载hibernate时创建,退出时删除
●Cnfiguration类负责管理Hibernate的配置信息。
包括如下内容:
•Hibernate运行的底层信息:
数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。
•持久化类与数据表的映射关系(*.hbm.xml文件)
●创建Configuration的两种方式
•属性文件(hibernate.properties):
Configurationcfg=newConfiguration();
•Xml文件(hibernate.cfg.xml)
Configurationcfg=newConfiguration().configure();
第二种创建方式较为常见。
Hibernate.cfg.xml文件默认的目录为系统的根目录。
(展示源代码以得到证实)
●Configuration对象根据当前的配置信息生成SessionFactory对象。
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。
同时,SessionFactory还负责维护Hibernate的二级缓存)。
Configurationcfg=newConfiguration().configure();
SessionFactorysf=cfg.buildSessionFactory();
●是线程安全的。
●SessionFactory是生成Session的工厂:
Sessionsession=sf.openSession();
●构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
●在Hibernate中,Transactiontx=session.beginTransaction()相当于给数据库操作起事务。
Smit()则为提交事务。
●Hibernate的整个运行过程如下:
1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,
2、并用这些信息生成一个SessionFactory对象,
3、然后从SessionFactory对象生成一个Session对象,
4、并用Session对象生成Transaction对象;
A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。
1.2.2主配置文件和类对应的的映射
1.2.3主键生成策略
根据主键生成策略的不同Hibernate在发送sql的时间不同
如果主键是increment时候当调用save方法的时候会马上发送sql
如果是assigned的时候当调用save方法不会马上发送sql而是当commite的时候发送sql
;
表示符生成器
描述
Increment
由hibernate自动以递增的方式生成表识符,每次增量为1
Identity
由底层数据库生成表识符。
条件是数据库支持自动增长数据类型。
Sequence
Hibernate根据底层数据库序列生成标识符。
条件是数据库支持序列。
Native
根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo
Uuid.hex
Hibernate采用128位的UUID算法来生成标识符。
该算法
能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。
如果主键用字符类型,并且不代表任何含义。
assigned
适用于自然主键。
由java程序负责生成标识符。
不能把setID()方法声明为
Private的。
尽量避免使用自然主键。
increment标识符生成器
●increment标识符生成器由Hibernate以递增的方式为代理主键赋值
●Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为1.(带走+1)
●适用范围:
•由于increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统
•适用于只有单个Hibernate应用进程访问同一个数据库的场合
•OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常
identity标识符生成器
●identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型(加1带走)
●适用范围:
•由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型.支持自动增长字段类型的数据库包括:
DB2,Mysql,MSSQLServer,Sybase等
•OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常
sequence标识符生成器
●sequence标识符生成器利用底层数据库提供的序列来生成标识符.
●Hibernate在持久化一个News对象时,先从底层数据库的news_seq序列中获得一个唯一的标识号,再把它作为主键值
●适用范围:
•由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列.支持序列的数据库包括:
DB2Oracle等
•OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常
native标识符生成器
●native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用identity,sequence或hilo标识符生成器.
●适用范围:
•由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发
•OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常
assigned标识符生成器
●hibernate和底层数据库都不帮助你生成主键,也就是说得自己在程序中手动的设置主键的值。
●适用范围:
主键有一定的含义,需要根据业务产生的情况。
Uuid标识符生成器
●Hibernate采用128位的UUID算法来生成标识符。
该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间
●使用范围:
主键是字符串,而且必须是唯一
一个Student和Teacher的实例
TeacherDao
importjava.io.Serializable;
importorg.hibernate.Session;
importorg.hibernate.Transaction;
importcom.hzgg.hibernate.model.Teacher;
importcom.hzgg.hibernate.util.HibernateSessionFactory;
publicclassTeacherDao{
publicSerializablesave(Teachert){
Sessionsession=HibernateSessionFactory.getSession();
Transactiontx=session.beginTransaction();
Serializableid=session.save(t);
mit();
HibernateSessionFactory.closeSession();
returnid;
}
publicTeacherfindById(Serializableid){
Sessionsession=HibernateSessionFactory.getSession();
Teachert=(Teacher)session.get(Teacher.class,id);
HibernateSessionFactory.closeSession();
returnt;
}
publicstaticvoidmain(String[]args){
TeacherDaodao=newTeacherDao();
T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 文档