【SSH系列】---Hibernate的基本映射
开篇前言
在前面的博文中,小编分别介绍了【SSH系列】-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及hibernate的核心,采用对象化的思维操作关系型数据库。
【SSH系列】-- Hibernate持久化对象的三种状态 ,通过这篇博文的讲解,小伙伴们了解到java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回。在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。今天这篇博文,小编来介绍一下hibernate中的映射,还请小伙伴们多多指教哦。
首先,什么是映射
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。
还记得在【SSH系列】-- hibernate基本原理&&入门demo这篇博文中,通过一个例子讲解了什么是hibernate,其中最重要的就是通过User.hbm.xml来实现映射,这里的映射就是对象关系映射,将对象数据保存到数据库中,同时可以将数据库中的数据读取到对象中,而作为开发人员,我们只需要对对象进行操作就可以完成对象数据库数据的操作。
ORM的实现原理
现在在Java领域大家对Hibernate的讨论很多,比如它的优缺点、如何应用、错误如何解决以及把它和Struts/spring等框架相结合作为整个系统的解决方案。Hibernate是如何实现ORM的功能?如果让我们自己开发一款实现ORM功能的框架需要怎么做?其实这些问题就是围绕着一个词,那就是“映射”,如果我们知道如何实现这种映射那么我们也能够开发出自己的一款ORM框架。会使用Hibernate的开发人员都知道,在使用它实现ORM功能的时候,主要的文件有:
映射类(*.java):它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。
映射文件(*.hbm.xml):它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
数据库配置文件(*.properties或*.cfg.xml):它的作用是指定与数据库连接时需要的连接信息,比如连接哪中数据库、登录用户名、登录密码以及连接字符串等。现在数据库配置文件大多数采用*.cfg.xml这种形式,因为更加的灵活。
Hibernate的映射分类
Hibernate的映射分类,小编简单的画了一张思维导图,如下所示:
接着,小编结合deom来具体的讲解一下基本映射。
小试牛刀
第一步、我们使用XML配置映射代码如下:
<?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 package="com.bjpowernode.hibernate"> <class name="User3" table="t_user3"> <id name="id" > <generator class="assigned"/> </id> <property name="name" length="30" unique="true" not-null="true"/> <property name="password"/> <property name="expireTime" column="expireTime" not-null="false" type="date"/> <property name="createTime" column="createTime" not-null="false" type="date"/> </class> </hibernate-mapping>
第二步、建立实体类User3,代码如下所示:
package com.bjpowernode.hibernate; import java.util.Date; public class User3 { private int id; private String name; private String password; private Date createTime; private Date expireTime; 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; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
第三步、编写hibernate.cfg.xml文件,将实体类User加入到hibernate.cfg.xml配置文件中,完成基本配置,代码如下所示:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <!-- MySql数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库名称 --> <property name="hibernate.connection.url"> jdbc:mysql:///hibernate_basemapping</property> <!-- 数据库的用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库的密码 --> <property name="hibernate.connection.password">123456</property> <!-- 方言:为每一种数据库提供适配器,方便转换 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 显示语句 --> <property name="hibernate.show_sql">true</property> <!-- 格式排版 --> <!-- <property name="hibernate.format_sql">true</property> --> <mapping resource="com/bjpowernode/hibernate/User3.hbm.xml"/> </session-factory> </hibernate-configuration>
第四步、编写工具类ExportDB.java,代码如下所示:
package com.bjpowernode.hibernate; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; /** * 将hbm生成ddl * @author 丁国华 * */ public class ExportDB { public static void main(String[] args) { //默认读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); export.create(true, true); } }
第五步、编写客户端Client.java,添加用户数据到数据库,代码如下所示:
package com.bjpowernode.hibernate; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Client { public static void main(String[] args){ //读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); //建立SessionFactory SessionFactory factory = cfg.buildSessionFactory(); //取得session Session session = null; try{ session = factory.openSession(); //开启事物 session.beginTransaction(); User3 user = new User3(); user.setId(1000); user.setName("张三"); user.setPassword("123"); 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(); } } } } }
最后,来运行一下,看看我们的数据库,效果如下所示:
小编寄语:该博文,小编主要介绍了hibernate中的基本映射,分别从什么是映射、ORM的实现原理、映射的分类、配上demo进行讲解,希望可以帮助有需要的小伙伴们,有不同意见的小伙伴欢迎在下方留言,在后续SSH系列博文中,小编将继续介绍hibernate的相关知识,敬请期待`(*∩_∩*)′。
【SSH系列】---Hibernate的基本映射的更多相关文章
- 【SSH系列】Hibernate映射 -- 继承映射
开篇前言 在前面的博文中,小编介绍了hibernate中的映射,一对一,一对多,多对多,单向,双向等,今天这篇博文,小编主要来介绍一下hibernate中的继承映射,小伙伴都知道在C#中,如果想要实现 ...
- 【SSH系列】Hibernate映射 -- 一对一单向关联映射
映射原理 一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射: a.主键关联:即让两个对象具有相 ...
- 【SSH系列】Hibernate映射-- 多对一单向关联映射
在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...
- 【SSH系列】-- Hibernate持久化对象的三种状态
在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...
- SSH:Hibernate框架(七种关联关系映射及配置详解)
概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...
- Hibernate的集合映射(Set、List、Array、Map、Bag)
POJOs如下: Customer类------>customer表 Order类对应---------->orders表 customer(1)<-------------- ...
- 工作笔记3.手把手教你搭建SSH(struts2+hibernate+spring)环境
上文中我们介绍<工作笔记2.软件开发经常使用工具> 从今天開始本文将教大家怎样进行开发?本文以搭建SSH(struts2+hibernate+spring)框架为例,共分为3步: 1)3个 ...
- ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存
ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate : Hibernate是一个持久层框架,经常访问物理数据库 ...
- 同一个数据库实例,不同用户下多表创建视图,Hibernate完毕ORM映射,Spring整合,后台实现
1.同一个数据库实例.同用户,多表创建视图 2.同一个数据库实例,不同用户下.多表创建视图 3.同一个数据库,不同数据库实例,多表创建视图 4.不同类型数据库,多表创建视图 1.同一个数据库实例.同用 ...
随机推荐
- Javasript设计模式之链式调用
写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...
- Docker入门之--基础知识
1.先是在Mac上安装. 按照这两个就可以很简单的完成 https://docs.docker.com/docker-for-mac/ https://docs.docker.com/docker-f ...
- [BZOJ 2169]连边
Description 有N个点(编号1到N)组成的无向图,已经为你连了M条边.请你再连K条边,使得所有的点的度数都是偶数.求有多少种连的方法.要求你连的K条边中不能有重边,但和已经连好的边可以重.不 ...
- hdu 5476 (计算几何)
题意:求三角形内∠MPB+∠APC=∠MPC+∠APB的轨迹长度- - 1.基于M的中垂线 2.三角形内的圆弧(比赛只有看自己能否猜中),ps.以下是别人家的证明 #include < ...
- 【Remmarguts' Date】
一道来自POJ2449的题,它融合了单源点最短路算法.启发式搜索,让我们对“启发式”有更深的理解和体会.Wow! ·英文题,述大意: 读入n,m(n<=1000,m<=1000 ...
- python+eclipse+pydev开发环境搭建
1.安装配置python2.7(右击我的电脑->属性->高级系统设置->环境变量->系统变量列表中找到Path并双击->变量值中添加";C:\Python27; ...
- jqGrid移动滑块时冻结首列和第二列例子
js代码如以下代码:在initAllGrid函数colModel1加入属性设置:frozen:true:然后在_initGrid('task_con_grid_div',colModel1)函数里面加 ...
- Python中def及lambda的功能介绍
函数def及lambda的功能介绍 1. def函数的功能介绍 1. 函数的参数 无参数函数 格式:def func_name(): '''__doc__'''#函数的说明文档(内容) express ...
- JSON概述
错误理解: 一直以为JSON就是对象,拥有跟js对象类似的特征:{key:value}形式, 以至于在自己的思维定式中就出现了一种很可怕的情景:居然不知道怎么去解释习以为常的json是 ...
- urllib,request 设置代理
通常防止爬虫被反主要有以下几个策略: 1.动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 2.使用IP地址池:VPN和代理IP,现在大部分网站都是根据IP来b ...