补充学习hibernate
一、概念
Hibernate是一个开源的、轻量级的ORM(对象关系映射)工具。ORM工具简化了数据创建、处理和访问,是将对象映射到数据库中存储的数据(表)的编程技术。
PO(持久化对象,用于完成持久化操作)=POJO(持久化类,普通的传统的java对象)+持久化注解
二、优点
Hibernate框架有很多优点。它们分别如下:
开源和轻量级
快速性能: Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。
数据库独立查询: HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。
自动创建表: Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。
简化复杂连接: 在hibernate框架中可轻松获取多个表中的数据。
提供查询统计和数据库状态: Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。
三、hibernate架构:
hibernate架构中有4层Java应用层,hibernate框架层,反手api层和数据库层。
体系结构要素:
1.会话工厂(SessionFactory):提供工厂方法获取Session的对象。
2.会话(Session):提供应用程序和存储在数据库中的数据之间的接口。接口提供插入,更新和删除对象的方法。 它还提供了事务,查询和标准的工厂方法。
3.事务(Transaction):可选项
4.连接提供者(ConnectionProvider):JDBC连接工厂。 它从DriverManager或DataSource抽象出来的应用程序。可选项。
5.事务工厂(TransactionFactory):可选项。
四、应用程序配置框架
创建一个java项目
为hibernate添加jar文件
创建持久类(一整个数据模型,类名是表名,有setter和getter方法)
创建持久类的映射文件(直接对持久类右键生成对应映射文件,xxx.hbm.xml)
创建配置文件(hibernate.cfg.xml:包含数据库所有内容,详解在下面)
创建检索或存储持久对象的类
运行应用程序
前阵子自学了hibernate 有点忘记了 写个博客顺便记录一下免得我很快忘了。
记操作不怎么记知识点。
这里是用eclipse 然后数据库用的mysql 不过我用navicat premium来管理数据库。
(navicat premium是一个很轻量级数据库管理工具,可以连接多种数据库Mysql啊 oracle啊 sqlserver都可以 之所以用它是因为觉得它启动快,在我只是需要查看数据库数据的情况下,挺方便的,好过去打开mysql。它在网上可以找到免费的破解版)
其实都还不算项目 只是自己试着用hibernate连数据库进行简易的操作。
1.启动mysql服务 (我经常忘记这步导致最后数据库连接不上),
2.打开navicat premium连接mysql数据库
3.实体类是Address类和Students类
Address类:
Students类:
然后其实Students下面也都是写getter、setter方法了 ,记住要重写一个tostring方法,自动生成的那种,这主要是为了之后输出可以成功,否则数据库查找操作会报错。
为了比较有代表性,所以有一个Address属性,到时候关联hibernate要多一些操作,还有Blob类型的,尝试一下传图片类型的。
4.实体类创建完就直接对着那个包鼠标右键生成映射文件,注意后缀,选hbm.xml
下一步选择关联Students类
写映射文件(中间注释掉的是我一开始没写Address类,而写的String类的Address)
有点记不清了,但这里的代码记得是自动关联实体类的属性生成的,不用写。
也解释一下:
class name 类名,然后定义了生成的表名是student(一般与实体类名一致,也可以自己改)
然后下面就是映射类的各个属性。
此处的hibernate对象关系映射也可以不用,可以使用hibernate注解在实体类上标注。
5.接着对这个项目生成一个hibernate.cfg.xml,是hibernate的配置文件。
(是在src下而不是src的目录下)
注释有干货!!
6.写测试类。
同项目下建了另一个测试包和实体类包名一致,类名为StudentTest
使用JUnit测试
@Before:初始化方法
@Test:测试方法
@After:释放资源
一、插入数据:
在目录方法对应位置右键run as junit执行
看一下navicat中已经建了student表,并插入了数据
这里尝试再添加一个图片流,
junit执行,成功,再看一下navicat
二、修改操作
注意此时要把hibernate配置中的hibernate.auto改成update否则会失败
然后增加修改的test方法:
junit执行一下,再查看navicat:
三、查找操作
同样是要把hibernate配置中的hibernate.auto改成update否则会失败
1.查找并在控制台输出整项的所有数据:(注意在所有实体类中一定要先重写toString方法)
执行,成功后看一下控制台,已经成功输出了。
2.查找并输出图片:
注意此时要把hibernate配置中的hibernate.auto改成update否则会失败
junit执行,成功啦,然后就看到输出的图片就是我输入的图片(TT的照片hhh)
四、删除操作
同样是要把hibernate配置中的hibernate.auto改成update否则会失败
junit执行,然后查看navicat
总结一下,hibernate进行单表操作的时候,session的一些操作:
session.save():保存数据(这主要是用在插入数据的时候)
session.update(): 更新数据(用于修改数据的时候)
session.delete():删除数据(用于删除数据的时候)
session.get():查询单个记录(用于查询、修改、删除的第一步取数据,调用后会立即向数据库发出sql语句,返回持久化对象,不存在则返回null)
session.load():查询单个记录(用于查询、修改、删除的第一步取数据,调用后返回一个代理对象,只保存了实体对象的id,直到使用对象的非主键属性才会发出sql语句,查询不存在,则抛出异常)
以上 是用hibernate进行简单数据库操作。
自学了hibernate注解 但这里不贴了
以后更多还是贴代码吧 关于hibernate的学习 这一部分还会再补充的。
五、hibernate映射
1、使用持久化注解:(主流)
@Entity:声明该类是一个hibernate的持久化类
@Table:指定该类的映射的表
@Id:用于指定该类的标识属性
@GeneratedValue:指定主键生成策略(strategy=GenerationType.IDENTITY 自动增长的生成策略)
2、使用JPA提供的XML配置描述文件(很少用)
3、使用Hibernate传统的XML了映射文件(.hbm.xml):少数用
六、Hibernate配置文件:
1、hibernate.properties:会提供属性,但是要自己手动添加持久化类,因此开发中少使用
2、hibernate.cfg.xml:常用
Configuration cfg=new Configuration().configure();
3、不使用配置文件
七、配置属性:
1、数据库相关配置:dirver_class、url、username、password
2、方言:决定数据库
3、其他常用配置属性:
hibernate.show_sql:是否控制台输出sql语句
hibernate.format_sql:是否将SQL转成格式良好的sql
hibernate.connection.autocommit:是否自动提交
hibernate.hbm2ddl.auto:(1)create:每次都重新建表,会丢失前面插入的数据 (2)create-drop:每次显式关闭时,程序会自动drop刚刚创建的表 (3)update:会保留数据(常用)
八、对hibernate体系结构各对象解析:
SessionFactory:单个数据库映射关系经过编译后的内存镜像,是线程安全的,是生成session的工厂。依赖于ConnectionProvider。
Session:应用程序与持久存储层之间交互操作的一个单线程对象。所有持久化对象都必须在session管理下才可进行持久化操作。该对象生存期很短,它底层封装了JDBC连接,也是Transaction的工厂。,在显式执行flush之前,所有持久化操作的数据都在缓存中的session对象处。
持久化对象(POJO实例):可以是普通实例
事务(Transaction):代表一次原子操作,具有数据库事务的概念。一个session内可能包含多个transaction对象。
连接提供者(ConnectionProvider):是生成JDBC连接的工厂,通过抽象将应用程序与底层的DataSource或DriverManager隔离开,无须应用程序直接访问,仅在应用程序需要扩展时使用。
事务工厂(TransactionFactory):是生成Transaction对象实例的工厂,无需应用程序直接访问。负责对底层具体事务实现进行封装,将底层具体的事务抽象成hibernate事务。