【SSH进阶之路】Hibernate基本映射(三)
【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基本映射(三)的更多相关文章
- 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...
- 【SSH进阶之路】Hibernate映射——一对多关联映射(七)
上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- 【SSH进阶之路】Hibernate搭建开发环境+简单实例(二)
Hibernate是很典型的持久层框架,持久化的思想是很值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理 ...
- 【SSH进阶之路】Hibernate系列——总结篇(九)
这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- SSH进阶之路
[SSH进阶之路]Hibernate基本原理(一) 在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低 ...
随机推荐
- 10.getter & setter
自定义 Person 类 class Person: NSObject { var name: String? var age: Int? } getter & setter var _nam ...
- sqlserver 下载地址(SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载)
转自:http://blog.sina.com.cn/s/blog_624b1f950100pioh.html 注:企业版无法安装在xp和win7,开发版才可以! 一. 简体中文 1. SQL S ...
- 使用canvas制作的移动端color picker
使用canvas制作的移动端color picker 项目演示地址(用手机或者手机模式打开) 我在另一个中demo,需要用到color picker,但是找不到我需要的移动端color picker, ...
- 纯CSS实现网站常用的五角星评分和分数展示交互效果
最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方 ...
- Linux Programmer's Manual --- reboot
REBOOT(2) Linux Programmer's Manual REBOOT(2) NAME reboot - reboot or enable/disable Ctrl-Alt-Del SY ...
- linux selenium运行chrome
chrome版本要和chromedriver版本匹配才能正常运行.
- thinkphp中JS文件不能写__ROOT__变量
如题 ,如果写了,就不能正确读取JS中的URL,
- gcc 4.8更新gcc 4.9 5.4版本等
转载:http://www.linuxidc.com/Linux/2017-01/139976.htm 如果还在使用较旧版本的Ubuntu,或者是Ubuntu LTS,那么我们是很难体验新版gcc的. ...
- 配置Linux系统实现dhcp功能
配置Linux系统实现dhcp功能 1.背景及原理 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用 ...
- 一步一步学习Unity3d学习笔记系1.3 英雄联盟服务器集群架构猜想
说到了网游那就涉及到服务器了,时下最火的属英雄联盟了,我也是它的粉丝,每周必撸一把,都说小撸怡情,大撸伤身,强撸灰飞烟灭,也告诫一下同仁们,注意身体,那么他的服务器架构是什么呢,给大家分享一下, 具体 ...