Hibernate核心技术简介
Hibernate核心技术简介
1、Hibernate映射文件开发
Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素、类元素、定义主键、设置主键生成方法、定义属性以及关联映射。下面一一单独说明:
(1)根元素<hibernate-mapping>
映射文件的根元素是<hibernate-mapping>,每一个*.hbm.xml文件都有唯一的一个根元素。该元素包含以下属性:package、schema、catalog、default-cascade、default-access、default-lazy、auto-import等。
<hibernate-mapping>元素允许嵌套多个<class>映射。但是最好的做法是一个持久化类对应一个映射文件。例如,一个持久化类名称是User,则命名为User.hbm.xml。
(2)类元素<class>
<class>是<hibernate>的子元素,用以定义一个持久化类与数据表的映射关系。该元素包以下属 性:name、table、discriminator-value、mutable、schema、catalog、proxy、dynamic-update、dynamic-insert、select-before-update、polymorphism、where、persister、batch-size、optimistic-lock、lazy、entity-name、check、rowid、subselect、abstract。
(3)定义主键
在关系数据库表中,主键用来识别记录,并保证每条记录的唯一性。在Java语言中,通过比较两个变量所引用对象的内存地址是相同,或者比较两个对象引用的对象值是否相同来判断两个对象是否相等。Hibernate为了解决两者之间的不同,使用对象标识符(OID)来标识对象的唯一性。OID是关系数据库中主键在Java对象模型中的等价物。在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系。
一般使用数据库表中主键属性id来定义Java类中的主键,两者是一一对应关系。
(4)设置主键生成方法
一般使用<generator>元素来指定相应的主键,例如如下示例代码中id便是主键:
<hibernate-mapping package="com.demo.hibernate.beans">
<class name="User" table="user">
<id name="id" column="ID" type="integer">
<generator class="native"/>
</id>
<property name="username" column="username" type="string" />
<property name="password" column="password" type="string" />
<property name="email" column="email" type="string" />
</class>
</hibernate-mapping>
(5)定义属性
在数据库表中,每一个属性都会对应一个相应的数据类型,那么进行ORM关联映射生成的Java类,每一个成员变量也会有一个相应的数据类型。例如,int、long、String
、char、date、text等,其中date和text等在Java代码中不是数据类型,但在此处是作为hibernate映射的内置映射类型属性。
一般可以使用<property>元素来定义非主键属性。
(6)关联映射
关联映射类似关系数据库中实体之间的对应关系,不过此处表示的映射后生成的持久化类之间的关系,包含以下几种类型:<many-to-one>、<one-to-one>、<one-to-many>、<many-to-many>。
2、Hibernate核心编程
用Hibernate开发基于持久层的应用时,第一件事情应当是熟悉它的编程接口。主要包含以下四个核心类的使用:
Configuration装载配置类
SessionFactory创建Session类
Session数据库操作类
Transcation事务操作类
常用的核心接口包含以下六个:Session、SessionFactory、Configuration、Transaction、Query和Criteria。其具体关系如下图一所示:

图一:接口类的产生关系
下面简要说明一下四个核心类的作用:
(1)Configuration装载配置类
Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。
(2)SessionFactory创建Session类
SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句以及其他的映射数据,还缓冲了一些将来有可能重复利用的数据。
(3)Session数据库操作类
Session的主要功能是提供对映射的实体类实例的创建、读取和删除操作。
(4)Transcation事务操作类
Transaction接口是对实际事物实现的一个抽象,这些实现包括JDBC的事务、JTA中的UserTransaction、甚至可以是CORBA事务。这样设计的目的是为了让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
3、使用Query进行HQL语句查询
Query接口实现对数据库及持久化对象的查询操作,它可以有两种表达方式:HQL语言或者本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
要取得Query对象,需要使用Session的createQuery()函数来执行查询,查询的参数是基于HQL语法的,其查询的对象是Hibernate的持久化对象名,Hibernate会根据该对象名找到要查找的表名。具体运用如下:
(1)不带参数的查询
代码示例如下:
Query query = session.createQuery(“from User”);
(2)带参数的查询
代码示例如下:
Query query = session.createQuery(“from User where username =: username”);
Query.setString(“username”,”admin”);
(3)取得List结果集
代码示例如下:
List list = query.list();
(4)取得迭代列表结果集
代码示例如下:
Iterator it1 = query.iterate();
Iterator it2 = query.list().iterator();
while(it2.hasNext()){
User user = (User)it2.next();
}
(5)取得一个对象
示例代码如下:
Query query = session.createQuery(“from User where username=?”);
Query.setString(0,”admin”);
User user = (User)query.uniqueResult();
(6)标量查询
示例代码如下:
Iterator results = session.createQuery(“select user.username,count(user.email) from User user group by user.username”).list().iterator();
(7)分页查询
示例代码如下:
Query query = session.createQuery(“from User”);
query.setFirstResult(10);
query.setMaxResult(20);
List list = query.list();
(8)创建SQL查询
示例代码如下:
List users = session.createSQLQuery(“select {user.*} from User{user}”).list();
4、使用Criteria进行条件查询
Criteria接口和Query接口非常类似,它允许你创建并执行面向对象的标准化查询。
与之相对的是,如果你希望能够动态的使用API进行面向对象查询,而非在Java代码中嵌入字符串,那么选择Criteria可以达到这样的目的。以下是其具体应用:
(1)创建Criteria实例
实例代码如下:
Criteria criteria = session.createCriteria(User.class);
criteria.setMaxResult(50);
List users = criteria.list();
(2)添加查询条件
实例代码如下:
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.like(“username”,”admin%”));
criteria.add(Restrictions.like(“ID”,1,10));
List users = criteria.list();
(3)添加排序条件
实例代码如下:
List users = session.createCriteria(User.class).add(Restrictions.like(“username”,”admin”)).addOrder(Order.asc(“username”)).addOrder(Order.desc(“password”)).setMaxResults(50).list();
(4)使用示例查询
示例代码如下:
User user = new User();
User.setUsername(“admin”);
List results = session.createCriteria(User.class).add(Example.create(user)).list();
Hibernate核心技术简介的更多相关文章
- Struts2核心技术简介
Struts2核心技术简介 使用Struts2框架,只要注重以下三大元素:配置文件.映射文件和Action: 全局属性文件struts.properties:保存系统运行的一些参数变量,整个系统只有一 ...
- Struts核心技术简介
Struts核心技术简介 1.Struts内部机制 Struts是一种基于MVC经典设计模式的开发源代码的应用框架,它通过把Servlet.JSP.JavaBean.自定义标签和信息资源整合到一个 ...
- Hibernate框架简介(二)基本使用增、删、改、查
一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬 ...
- Hibernate缓存简介和对比、一级缓存、二级缓存详解
一.hibernate缓存简介 缓存的范围分为3类: 1.事务范围(单Session即一级缓存) 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象 ...
- java框架之Hibernate(1)-简介及初使用
简介 hibernate 是一个开源 ORM ( Object / Relationship Mipping ) 框架,它是对象关联关系映射的持久层框架,它对 JDBC 做了轻量级的封装,而我们 ja ...
- Hibernate框架—简介
ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- hibernate.Session简介
★→→SessionFactory (org.hibernate.SessionFactory) 包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(tra ...
- 【docker】docker基础原理,核心技术简介
关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...
随机推荐
- Nancy之静态文件处理
今天我们来谈谈Nancy中的静态文件(JavaScript,CSS等)该如何处理. 在前面的Demo中,我们也已经用到了这一块的内容, 但并没有深入理解,只是停留在使用的层面上. 在进入今天的正题之前 ...
- C# decimal保留指定的小数位数,不四舍五入
decimal保留指定位数小数的时候,.NET自带的方法都是四舍五入的. 项目中遇到分摊金额的情况,最后一条的金额=总金额-已经分摊金额的和. 这样可能导致最后一条分摊的时候是负数,所以自己写了一个保 ...
- angularjs SyntaxError: Unexpected token in JSON at position 0
使用NodeJs读取json格式的文件,转换成对象时报错 :SyntaxError: Unexpected token in JSON at position 0,这个问题查了两三个小时,记录一下解决 ...
- hammer用法 jquery.hammer.js
jquery.hammer.js使用时要先引入hammer.min.js 下面代码是滑动效果: $("#nav").hammer().bind('swiperight', fu ...
- 背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox
[源码下载] 背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox 作者:webabcd ...
- Redis和Memcached整体
Redis和Memcached整体对比 Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较,总体来看还是比较客观的,现总结如下: 1)性能对比:由于R ...
- Java的HTTP通信
在Android中,HTTP通信可以用Volley,在Java中不能使用Volley,只能使用DefaultHttpClient,HttpPost和HttpResponse. /* * 向服务器发送数 ...
- nginx 添加nginx-http-concat模块
github地址:https://github.com/alibaba/nginx-http-concat/tree/master 简单的描述一下吧,网上说的安装新的模块需要重新编译nginx,具体的 ...
- 使用AngularJS实现简单:全选和取消全选功能
这里用到AngularJS四大特性之二----双向数据绑定 注意:没写一行DOM代码!这就是ng的优点,bootstrap.css为了布局,JS代码也只是简单创建ng模块和ng控制器 效果: < ...
- c#使用json接口
前些日子将项目由使用数据库改版为使用接口,由于接口返回的xml中多了一些附加信息,导致xml转化后的DataTable无法储存在MemCache中.这时可以将xml序列化为其对应的类,当然由于当时对x ...