【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心。採用对象化的思维操作关系型数据库。

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)。小编搭建了基本Hibernate的开发环境,并做了一个简单实例。对它的基本原理有了一个理性的认识。

这篇博客小编介绍Hibernate的经典内容:对象关系映射。主要介绍映射的基本概念。映射的分类,映射文件。

概念

ORM(Object Relational Mapping),即对象关系映射。它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation)。再从关系映射到对象。相信非常多人跟小编一个毛病,看到概念就头疼,以下小编画了一张图加深理解。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

这张图特别简单:原来,没有Hibernate时,我们须要通过JDBC+手动写SQL语句来操作数据库,如今,有了Hibernate。它将JDBC+SQL进行了高度封装,我们不须要再去和复杂SQL打交道,仅仅要像操作对象一样操作数据库就能够了。

ORM的实现思想就是将数据库中表的数据映射成对象,Hibernate能够使我们採用对象化的思维操作关系型数据库。

映射文件

Hibernate在实现ORM功能的时候主要用到的文件有:

    1、 映射类(*.java):它是描写叙述数据库表的结构。表中的字段在类中被描写叙述成属性,将来就能够实现把表中的记录映射成为该类的对象了。

 

    2、映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系。包含映射类和数据库表的相应关系、表字段和类属性类型的相应关系以及表字段和类属性名称的相应关系等。

 

    3、 hibernate核心配置文件(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包括与数据库连接时须要的连接信息,比方连接哪种数据库、登录数据库的username、登录password以及连接字符串等。映射文件的地址信息也放在这里。

分类

上面的内容看上去挺多,事实上特别少,基本映射非常easy,我们主要学习关联关系映射。其它几种映射一般不会用,仅仅须要了解就可以,用的时候看一下相关资料会做就好。

基本映射

上篇博文我们已经实现了一个基本映射。是使用XML方式配置映射,例如以下所看到的:

<span style="font-size:12px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.liang.hibernate.User" >
<id name="id">
<!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime" type="date"></property>
<property name="expireTime" type="date"></property>
</class>
</hibernate-mapping></span>

除了XML方式配置映射外,还能够通过给类文件加入注解的方式配置映射。在上篇博文的基础之上。我们稍加改动。

1、增加hibernate annotion支持包

*hibernate-annotations.jar

      *hibernate-commons-annotations.jar

      *ejb3-persistence.jar

如图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaml1cWl5dWxpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

2、建立实体类User,採用注解完毕映射

package com.liang.hibernate;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType; @Entity //不写Table默觉得user,@Table(name="t_user")
public class User { @Id //主键
@GeneratedValue(strategy=GenerationType.AUTO)//採用数据库自增方式生成主键
//JPA提供的四种标准使用方法为TABLE,SEQUENCE,IDENTITY,AUTO.
//TABLE:使用一个特定的数据库表格来保存主键。
//SEQUENCE:依据底层数据库的序列来生成主键。条件是数据库支持序列。
//IDENTITY:主键由数据库自己主动生成(主要是自己主动增长型)
//AUTO:主键由程序控制。
private int id; private String name;
private String password; @Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
private Date createTime;
@Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
private Date expireTime; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name="name",unique=true,nullable=false) //字段为name,不同意为空,username唯一
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
} }

注:因为主键改成了自增长,所以数据类型改动成了int类型

3、提供hibernate.cfg.xml文件,将实体类User增加到hibernate.cfg.xml配置文件里。完毕基本配置

<span style="font-size:12px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<!-- 驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- mysql的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 映射文件 -->
<!-- <mapping resource="com/liang/hibernate/User.hbm.xml"/> --> <!-- 由原来的映射文件,改成实体类 -->
<mapping class="com.liang.hibernate.User"/> </session-factory>
</hibernate-configuration></span>

4、编写工具类ExportDB.java,注解生成ddl,必须採用AnnotationConfiguration类

<span style="font-size:12px;">package com.liang.hibernate;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; /**
* 将hbm生成ddl
* @author liang
*
*/
public class ExportDB{
public static void main(String[]args){
//默认读取hibernate.cfg.xml文件
Configuration cfg = new AnnotationConfiguration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);
}
}</span>

数据库生成表如图所看到的:

5、建立client类Client,加入用户数据到mysql

package com.liang.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration; public class Client {
public static void main(String[]args){
//读取hibernate.cfg.xml文件
Configuration cfg = new AnnotationConfiguration().configure();
//建立SessionFactory
SessionFactory factory =cfg.buildSessionFactory(); //取得session
Session session = null; try{
//开启session
session = factory.openSession();
//开启事务
session.beginTransaction(); User user = new User();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
//保存User对象
session.save(user); //提交事务
session.getTransaction().commit(); }catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session != null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
}
}

执行之后,数据库表生成的数据,例如以下图所看到的:

注解和xml文件的优缺点,网上有非常多,有兴趣能够查一下。小编就不再累述了。可是小编觉得。学习初期最好不要使用注解,不易于理解Hibernate的原理,而且注解对于程序的可扩展性而言,太差了。

下篇博文,我们介绍Hibernate的七种关联关系映射。异常简单。谢谢关注。

【SSH进阶之路】Hibernate基本映射(三)的更多相关文章

  1. 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  2. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  3. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  4. 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

    上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...

  5. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  6. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  7. 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)

    Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...

  8. 【SSH进阶之路】Hibernate系列——总结篇(九)

    这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

  9. SSH进阶之路

    [SSH进阶之路]Hibernate基本原理(一)       在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低 ...

随机推荐

  1. iOS 耳机线控

    当你使用iphone的时候听音乐的时候,播放器在后台运行的时候,你仍然可以通过耳机来进行操作,完成曲目切换,快进,快退等功能!当然你的程序不一定是播放器应用,但是我们仍然可以让它具有这个功能,让用户通 ...

  2. 当ASP.NET Forms验证方式遭遇苹果IOS

    一.问题出现 我在用ASP.NET MVC4做微信开发的时候,用Forms验证方式做为authentication. 一般都是在web.config加: <authentication mode ...

  3. Understanding Memory Technology Devices in Embedded Linux

    转: NAND Chip Drivers NAND technology users such as USB pen drives, DOMs, Compact Flash memory, and S ...

  4. Android控件之GridView探究

    GridView是一项显示二维的viewgroup,可滚动的网格.一般用来显示多张图片. 以下模拟九宫图的实现,当鼠标点击图片时会进行相应的跳转链接. 目录结构 main.xml布局文件,存放Grid ...

  5. python装饰器的作用

    常见装饰器:内置装饰器:类装饰器.函数装饰器.带参数的函数装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常 ...

  6. Delphi之过程与函数

    过程以保留字procedure开始,没有返回值:函数以保留字function开始,有返回值. 参数位于括号里面,多个参数之间以分号分隔,例如: procedure SetDate(Year: Inte ...

  7. MIT算法导论笔记

    详细MIT算法导论笔记 (网络链接) 第一讲:课程简介及算法分析 (Sheridan) 第二讲:渐近符号.递归及解法  (Sheridan) 第三讲:分治法(1)(Sheridan) 第四讲:快排及随 ...

  8. ES怎么进行字段添加索引,并保留原有数据

    1.先将原索引进行备份 curl -XPOST '192.168.46.163:9200/_reindex?pretty' -H 'Content-Type: application/json' -d ...

  9. CentOS 7.2通过yum安装zabbix

    环境说明 系统版本    CentOS 7.2 x86_64 软件版本    yum安装zabbix 3.0.18 首先准备一台纯净的CentOS 7.2系统 1.配置zabbix源 [root@za ...

  10. 修改PHP上传文件的大小限制(post)

    在PHP的默认配置情况下,当上传的文件大小超出一定的限制时,我们将得到如下的错误提示信息: Warning: POST Content-Length of 625523488 bytes exceed ...