【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 设置系统音量和监听系统音量变化

    很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MP ...

  2. Visual Studio 行末回车时运算符两侧自动加空格是怎么设置的

    在工具—>选项->文本编辑器->c#->格式设置->间距后有三个选项 如果已经选中"二元运算符前后插入空格" 而VS又抽风没有这个功能时,可以选中其余 ...

  3. 基于pydash临控linux服务器

    pydash项目地址:https://github.com/k3oni/pydash 一.安装过程 1.安装pip dnf install git python-pip -ypip install v ...

  4. mysql行转列,单列转多行

    行转列 使用CASE语句: SELECT SUM(CASE USER_NAME='A' THEN KILLS END) AS 'A', SUM(CASE USERNAME='B' THEN KILL ...

  5. jstl <fmt:formatDate>标签

    <fmt:formatDate>标记用于在各种不同的方式来格式化日期 属性: <fmt:formatDate>标签具有以下属性: 属性 描述 必需 默认值 value 要显示的 ...

  6. Java中hashcode的理解

    Java中hashcode的理解 原文链接http://blog.csdn.net/chinayuan/article/details/3345559 怎样理解hashCode的作用: 以 java. ...

  7. wp8开发时模拟器无法联网解决方法

    关于模拟器无法联网的正常解决方案在网上有很多 这里讲的是我在做测试的时候模拟器无法上网的特殊情况 由于使用的是无线网络 可能有一些差别 过程如图: 启动模拟器 如果之前没有设置过模拟器的交换器则会出现 ...

  8. ecshop_商品描述远程图片自动本地化插件

    解压缩文件,覆盖 ecshop 的 \includes\fckeditor文件夹. 这样在后台添加商品的商品详细描述,编辑器最后一个按钮就是自动下载 远程图片到你的网站空间,这样可防止对方网站图片失效 ...

  9. java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...

  10. Laravel服务/服务提供者/容器/契约和门面

    1.服务是什么? 服务是提供了一些功能的类,比如发送邮件,写日志. 2.Laravel服务提供者是什么? 服务提供者中指明了这个提供者可以提供哪些服务(注册服务),以及服务注册后默认调用一些方法(bo ...