Hibernate是一个开源的对象-关系映射框架,它用一个非常轻量级的对象封装了JDBC,这样Java程序员就可以随心所欲地运用对象编程的思想操纵数据库。本文重点介绍持久层ORM框架Hibernate框架的使用和构造,有兴趣的朋友一起看看吧。
目录
前言1。Hibernate的优势?二。Hibernate III的缺点。构建Hibernate项目架构。Hibernate核心接口介绍v .封装Hibernate VI的工具。普通CRUD操作VII。主键生成机制。Hibernate的类型概述
前言
hibernate的概念
:Hibernate是一个ORM映射框架(ORM框架,全自动ORM框架)
Hibernate是一个数据库操作框架,也就是持久性框架。
Hibernate是一个开源的对象关系映射框架,它用一个非常轻量级的对象封装了JDBC,这样Java程序员就可以随心所欲地用对象编程的思维操纵数据库(SQL语句是Hibernate根据对象自动生成的)。Hibernate可以在任何使用JDBC的情况下使用,不仅是在Java客户端程序中,也可以在Servlet/JSP Web应用程序中使用。
提示:以下是本文的主要内容,以下案例可供参考。
一、Hibernate的优点?
1.Hibernate的代码相对简单。
2.Hibernate是面向对象的操作。
3.Hibernate的数据库是高度移动的。
4.Hibernate的缓存是世界一流的。
二、Hibernate的缺点
1.你不能干预sql语句的生成,所以如果你对一个项目中sql语句的优化要求很高,那就不适合hibernate。
2.如果一个表有几千万的数据,就不适合hibernate(因为缓存机制的原因,会把很多数据放到缓存里)。
3.hibernate适合中小型企业开发软件。
4.hibernate不适合处理复杂的SQL。
三、搭建Hibernate项目架构
项目目录
1.第一步是引导包裹。
2.第二步,写Hibernate的配置文件。
我用的是Mysql数据库,你要是用别的把数据源驱动信息改一下即可。
?xml版本=1.0 编码=utf-8 ?
!DOCTYPE hibernate-配置公共
-//休眠/休眠配置DTD//EN
http://www . hibernate . org/dtd/hibernate-configuration-3.0 . dtd
休眠-配置
!-创建数据源-
会话工厂
property name= connection . driver _ class com . MySQL . JDBC . driver/property
属性名= connection . URL JDBC:MySql://127 . 0 . 0 . 1:3306/MySql/property
属性名=connection.username 根/属性
属性名= connection . password root/property
!- SQL方言-
property name= dialect org . hibernate . dialect . Oracle dialect/property
!-是否显示SQL -
属性名=show_sqltrue/property
!-实现格式化的sql -
属性名=format_sqltrue/property
!-是否自动生成对象
创建意味着每次都要重新创建所需的对象。
更新的意思是有就直接用,修改了就更新,没有就创建。
属性名=hbm2ddl.autoupdate/property
-
!-配置hibernate映射文件-
!-配置映射文件-
映射资源= com/zrrd/mapper/dept . hbm . XML /mapping
/会话-工厂
/hibernate-配置
关于方言可以参考下面的图片,根据项目需求配置即可。
3.步骤3:编写持久性类(pojo类)
包com . zrrd . VO;
公共课部{
私有整数deptno
私有字符串dname
私有字符串loc
公共整数getDeptno() {
返回deptno
}
public void setDeptno(整数deptno) {
this.deptno=deptno
}
公共字符串getDname() {
返回dname
}
public void set dname(String dname){
this.dname=dname
}
公共字符串getLoc() {
返回loc
}
public void setLoc(String loc) {
this.loc=loc
}
//直接转换,方便看。
@覆盖
公共字符串toString() {
返回“Dept{”
deptno= deptno
,dname= dname
,loc= loc
};
}
公共部门(){
super();
}
公共部门(整数部门编号,字符串数据名称,字符串位置){
this.deptno=deptno
this.dname=dname
this.loc=loc
}
}
4.步骤4:编写Hibernate映射文件(*.hbm.xml)
该文件完成了持久性类和数据库中指定表之间的映射。说白了就是持久类对应数据库中的哪个表,类中的每个属性对应数据库中的那些字段。
?xml版本=1.0 ?
!DOCTYPE hibernate-映射公共
-//休眠/休眠映射DTD 3.0//EN
http://hibernate . SourceForge . net/hibernate-mapping-3.0 . dtd
!-package= com . javashidai . hibernate 001 . domain 表示持久类所在的包-
hibernate-映射包=com.zrrd.vo
!-name= dept 表示对应于类名table=dept 的表名-
类名=部门表=部门
!-指示与主键对应的属性和字段。
Name=deptno 表示持久类中deptno对应的主键字段。
Column=deptno 表示它是主键字段
-
id名称=部门编号列=部门编号
!-主键生成策略:序列-
生成器class=sequence
!-指明所需的序列名称-
param name= seq seq _ DEPT/param
/生成器
/id
!-属性指示非主键列。
Name=dname 表示持久类中属性的名称。
Length=14 表示数据库中相应字段接收的长度。
Column=dname 指示对应数据库中的哪个字段。
Type=数据类型对应的type=string
-
属性名称=dname 长度=14 列=dname 类型=string/
属性名称=loc 长度=13 列=loc 类型=string/
/类别
/hibernate-映射
5.第五步:编写一个测试类,完成对数据库的操作。
包com . zrrd . text;
导入com . zrrd . VO . dept;
导入org . hibernate . session;
导入org . hibernate . session factory;
导入org . hibernate . CFG . configuration;
公共类文本{
公共静态void main(String[] args){
//读取Hibernate.cfg.xml配置文件
配置Configuration=new Configuration();
configuration . configure( hibernate . CFG . XML );
//创建sessionfactory项目
session factory session factory=configuration . build session factory();
//创建会话对象
session session=session factory . open session();
//创建实体对象(数据库中表对应的vo对象是实体对象),然后操作数据库(Hibernate自动创建SQL语句)
dept dept=session . get(dept . class,1);
system . out . println(dept);
session . close();
session factory . close();
}
}
执行结果图
数据库存的数据
四、Hibernate核心接口的介绍
Hibernate有六个核心接口:Session,SessionFactory,
交易、查询、标准和配置。这六个核心接口将在任何开发中使用。通过这些接口,不仅可以访问持久对象,还可以控制事务。
1.会议
Session接口负责持久化对象的CRUD操作(CRUD的任务是完成与数据库的通信,包含很多常用的SQL语句。)。但是应该注意,会话对象是非线程安全的。同时,Hibernate的会话不同于JSP应用程序中的HttpSession。这里用的session这个词,其实指的是Hibernate中的session,以后Httpsession对象就叫用户会话了。
2.会议工厂
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,负责创建会话对象。这里使用的是工厂模式。需要注意的是,SessionFactory并不是轻量级的,因为一般情况下,一个项目只需要一个SessionFactory。当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
3.交易
事务接口是一个可选的API,所以你可以选择不使用这个接口,取而代之的是Hibernate设计者自己写的底层事务代码。事务接口是实际事务实现的抽象,包括JDBC事务,JTA的UserTransaction,甚至CORBA事务。这种设计使开发人员能够使用统一的事务接口,这样他们的项目就可以很容易地在不同的环境和容器之间移植。
4.询问
查询接口允许您方便地查询数据库和持久对象。可以用两种方式表达:HQL语言或本地数据库的SQL语句。Query常用来绑定查询参数,限制查询记录的数量,最终执行查询操作。
5.标准
标准接口与查询接口非常相似,允许创建和执行标准化的面向对象的查询。值得注意的是,Criteria接口也是轻量级的,它不能在会话之外使用。
6.配置
配置界面的功能是配置Hibernate并启动它。在Hibernate启动期间,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然配置接口在整个hibernate项目中只起很小的作用,但它是Hibernate启动时遇到的第一个对象。
五、封装Hibernate的工具类
当然,我们在CRUD实际开发项目的时候当然不会把代码写在测试类里,这样会导致项目代码量巨大,可移植性差,所以我们要打包写一个工具类,用的时候直接调用。
公共类HibernateUtil {
//Hibernate容器中只需要一个SessionFactory
私有静态会话工厂session factory;
//用静态代码框创建SessionFactory对象
静电
{
//创建一个配置对象
Configuration conf=新配置();
//加载Hibernate配置文件
conf.configure()。//默认加载src下的hibernate.cfg.xml
//创建SessionFactory对象
session factory=conf . buildsessionfactory();
}
//获取会话对象
公共静态会话getSession()
{
返回session factory . opensession();
}
}
六、常用的CRUD操作
相关的执行方法我都写了。你只需要改变返回的类型,就像Jpa框架一样,直接在你的项目中使用。不用太感谢我,为人民服务!
1.根据主键查询对象。
公共部门选择一个(内部部门编号)
{
Dept dept=null
//获取会话对象
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//根据主键获取相应的信息
Dept=(Dept)session . get(Dept . class,deptno);
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
退货部门;
}
2.查询所有信息。
公共静态ListDept queryDept()
{
ListDept deptList=null
//声明会话
Session session=null
尝试
{
//创建会话对象
session=hibernate util . getsession();
//声明HQL:其中Dept是实体类
String hql=来自部门;//类名写在//from之后。
//获取查询对象
query query=session . create query(hql);
//执行查询
dept list=query . list();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
返回deptList
}
3.条件查询
public ListDept queryDeptByLoc(字符串位置)
{
ListDept deptList=null
//声明会话
Session session=null
尝试
{
//创建会话对象
session=hibernate util . getsession();
//声明HQL:其中Dept是实体类
string hql= from com . zrrd . VO . dept where loc=:loc ;//:loc表示它是一个参数。
//获取查询对象
query query=session . create query(hql);
//为参数赋值
query.setString(loc ,loc);//为指定的参数赋值
//查询返回ListDept
dept list=query . list();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
返回deptList
}
4.根据主键删除
public void deleteDept(int deptno)
{
//声明会话对象
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//开启交易保护
事务ta=session . begin transaction();
//根据id获取相应的值
Dept delete obj=(Dept)session . get(Dept . class,deptno);
//删除此通信。
session . delete(delete obj);
//提交事务
ta . commit();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
}
5.根据指定条件删除
/**
*使用Hql删除
*根据部门编号删除
*/
public int deleteDeptByLoc(字符串位置)
{
int result=0;
//声明会话对象
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//开启交易保护
事务ta=session . begin transaction();
//写HQL删除。这里:loc表示参数名
string hql= delete com . zrrd . VO . dept where loc=:loc ;
//获取查询对象
query query=session . create query(hql);
//为参数赋值
query.setString(loc ,loc);
//执行DML语句
结果=query . execute update();
//提交事务
ta . commit();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
返回结果;
}
6.修改单个对象
公共静态无效更新部门(部门部门)
{
//声明会话对象
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//开启交易保护
事务ta=session . begin transaction();
//根据持久对象进行修改
session.update(部门);
//提交事务
ta . commit();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
}
7.根据条件修改(HQL)
public static int updateDeptLoc(String old loc,String newLoc)
{
int result=0;
//声明会话对象
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//开启交易保护
事务ta=session . begin transaction();
//写HQL删除。这里:loc表示参数名
string hql= update Dept set loc=:new loc where loc=:old loc ;
//获取查询对象
query query=session . create query(hql);
//为参数赋值
query.setString(newLoc ,new loc);
query.setString(oldLoc ,old loc);
//执行DML语句
结果=query . execute update();
//提交事务
ta . commit();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
返回结果;
}
8.将对象存储在数据库中。
公共静态无效保存部门(部门部门)
{
Session session=null
尝试
{
//获取会话对象
session=hibernate util . getsession();
//获取事务对象
事务ta=session . begin transaction();
//在数据库中存储持久对象
session.save(部门);
//提交事务
ta . commit();
}
捕捉(例外e)
{
e . printstacktrace();
}
最后
{
如果(会话!=空)
{
session . close();
}
}
}
七、主键生成机制
1,
increment
:表示hibernate调用连接数据库的plus one机制为该字段生成信息(即生成主键)。2.
identity
:表示连接的数据本身调用自加机制为该字段生成信息(即生成主键)。Increment和identity的区别在于,前者由hibernate调用,而后者由数据库本身调用(也就是说,您在构建表时声明字段自动递增)。但是,当连接到Oracle时,上述两种主键生成机制并不适用。因为Oracle没有自动添加机制。如果Oracle想要使用自动增量机制,就必须依赖它。
3.
sequence
:表示该字段由数据序列生成。如果不想指定特定的序列,Oracle中默认选择的序列名称必须是HIBERNATE_SEQUENCE。4.
uuid
:根据UUID算法生成32位字符型主键信息。5,
guid
:使用数据库提供的sys_guid函数生成主键。但是注意,并不是所有的数据库都有sys_guid函数。所以uuid是首选。6、
native
:根据具体连接的数据库,从identity、sequence或hilo中选择一个生成主键。根据选择的生成方法确定适用的数据库。(这个数据库是可以跨的,因为它可以自动选择生成方案),而且Oracle中必须有一个名为HIBERNATE_SEQUENCE的序列。assigned
:让应用程序为主键本身赋值。注意,赋值必须在调用save()方法之前完成。根据选择的生成方法确定适用的数据库。八、Hibernate的类型
在Hibernate中可以使用纯java类型和Hibernate指定类型。在Hibernate框架中,您可以自动对应Java类型或Hibernate类型。开发中建议使用java类型,效率更高。
总结
上面的文章只是其中的一部分,只是教大家如何实现框架实现CRUD操作,最重要的是我要写的以下几个知识点:逆向创建Hibernate项目、对象的三种状态(DO对象)、一对多关系(设计主对象中从对象的属性)、多对多关系、延迟加载(延迟加载)、抓取策略、Hibernate的一级缓存(会话缓存)、Hibernate的二级缓存、HQL、Query.list和query.iterator
关于持久化ORM框架Hibernate框架的使用和构造的文章到此结束。关于ORM框架Hibernate框架使用的更多信息,请搜索我们以前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!