,,持久层ORM框架Hibernate框架的使用及搭建方式

,,持久层ORM框架Hibernate框架的使用及搭建方式

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_sql'true/property

!-实现格式化的sql -

属性名='format_sql'true/property

!-是否自动生成对象

创建意味着每次都要重新创建所需的对象。

更新的意思是有就直接用,修改了就更新,没有就创建。

属性名='hbm2ddl.auto'update/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框架使用的更多信息,请搜索我们以前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: