ssh进阶之路hibernate基本映射

     2022-03-17     685

关键词:

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

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

 

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

 

概念

 

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

 

     技术分享

 

         这张图特别简单:原来,没有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

 

 如图所看到的:

           技术分享

 

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基本原理(一),小编介绍了Hibernate的基本原理以及它的核心。採用对象化的思维操作关系型数据库。【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境。并做了一... 查看详情

ssh进阶之路hibernate基本原理

在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎么做的,你也可以很... 查看详情

ssh进阶之路hibernate基本原理

   在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎么做的... 查看详情

ssh进阶之路

 【SSH进阶之路】Hibernate基本原理(一)      在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装。一句不难,难道是真的不难还是眼高手低?   如果只是停留在使... 查看详情

ssh快速进阶——hibernate继承映射:每个具体类映射一张表

  上篇文章说的是每个类映射一张表,不管是父类还是子类。与上篇文章不同的是,这里是每个“具体类”映射一张表,什么意思呢?就是让每个子类(具体的、有意义的类)映射一张表。场景  与上篇文章场景一样,如下... 查看详情

小白的进阶之路6

大概的了解了一下关于三大框架,首先说一下是什么,也就是spring,springMVC,还有mybites,另外一个三大框架就是ssh,即spring,Struts2,还有hibernate。我们都知道在做项目的时候都要分为三个模块,web层(逻辑层),service层(服务... 查看详情

ssh进阶之路一步步重构容器实现spring框架——彻底封装,实现简单灵活的spring框架

目录   【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)   【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(... 查看详情

hibernate学习之路

简要聊一聊组合主键映射一:组合主键映射(数据库中某张表有多个主键)  比如有一个学生成绩类,有属性:stuId,subjectId,result.其中stuId和subjectId对应映射表中的组合主键(stuId,subjectId)  1、编写组合主键的类,该类... 查看详情

hibernate学习之路

简述多对多关系映射多对多关系映射需要一张中间表来维护关系                 一:Role类与Function类1publicclassFunction{2privateintid;3privateStringname;4privateStringcode; 查看详情

进阶之路(基础篇)-010arduino函数(基本串口spi)

一.基本函数     pinMode(引脚号,模式);     digitalWrite(引脚号,电平状态);             //默认低电平(或浮空)    digitalRead(数字输入端口号); 查看详情

大数据进阶之路——sparksql基本配置(代码片段)

文章目录Spark安装编译失败环境搭建Standalone本地IDEHiveContextAPPSparkSessinonSparkShellSparkSqlthriftserver/beeline的使用jdbcMapReduce的局限性:1)代码繁琐;2)只能够支持map和reduce方法;3)执行效率低下&#x 查看详情

hibernate学习之路

简诉 单向多对一、单向一对多、双向一对多关系映射一:单向多对一  1、学生表student和年级表Grade                2、类Student和类GradepublicclassStudent{privateintid;privat 查看详情

hibernate基本类型映射

Hibernate映射类型Java类型标准SQL类型大小和取值范围integer或者intint或者IntegerINTEGER4字节,-2^31~2^31-1longlong或者LongBIGINT8字节,-2^63~2^63-1shortshort或者ShortSMALLINT2字节,-2^15~2^15-1bytebyte或者ByteTINYINT1字节,-128~127floatfloat 查看详情

ssh整合学习

Hibernate框架1hibernate核心配置文件(0)orm思想-对象关系映射(1)数据库信息(2)hibernate信息(3)映射配置(4)hibernate核心配置文件-如果单纯使用hibernate框架,核心配置文件名称hibernate.cfg.xml和位置src下面固定的。-hibernate和spri... 查看详情

android你应该知道的学习资源进阶之路贵在坚持

...且N多的例子。除了支持在线学习外,还提供基本教程和进阶教程的pdf下载。(ps:虽然Pdf可以点击下载,但 查看详情

大数据进阶之路——scala入门(代码片段)

文章目录概述安装JavaVSScalaval和var基本数据类型lazy在Scala中的应用开发工具IDEAMaven概述https://www.scala-lang.org/Scalacombinesobject-orientedandfunctionalprogramminginoneconcise,high-levellanguage.Scala’sstatictypeshelpavoidb 查看详情

javaee学习笔记之ssh—hibernate

对象关系映射ORM解决的主要问题就是对象-关系的映射,域模型和关系模型都分别建立在概念模型的基础上,域模型是面向对象的,关系模型是面向关系的,一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一... 查看详情

大数据进阶之路——sparksql日志分析(代码片段)

文章目录基本方案数据处理流程数据清洗二次清洗视频访问按照省份按照流量优化数据可视化echarts基本方案用户行为日志:用户每次访问网站时所有的行为数据(访问、浏览、搜索、点击…)用户行为轨迹、流量日... 查看详情