Hibernate知识总结(一)
一、ORM
ORM的全称是Object/Relation Mapping,即对象/关系映射,可以将其理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。可以把ORM看作应用程序和数据库的桥梁。
ORM基本映射方式
1、数据表映射实体类(持久化类);
2、数据表中的行映射对象;
3、数据表中的字段映射对象的属性。
基本上所有的ORM工具大致都遵循相同的映射思路。
二、Hibernate
Hibernate是一款轻量级的持久层框架,它完成了对象模型和基于SQL的关系模型的映射关系,使得开发者能够以面向对象的方式开发应用程序,它还提供数据处理的方法,可以大幅度减少开发人员使用SQL和JDBC处理数据的时间。
Hibernate初步使用
下载Hibernate(此步骤略过),解压该文件;
使用IDE新建普通java项目(本人使用idea),在项目中引入使用Hibernate所必须的jar包,即引入required文件夹中的jar包;另外此处使用JDBC连接,需要额外引入mysql-connector的jar包
现在使用一个简单的小例子,实现Hibernate的初步使用。
注:此处使用的是Hibernate的注解来创建数据表,不提及xml配置文件建表方式。
创建持久化类User,该类和一般的JavaBean并没有什么区别;
User类包含id、userName、age属性,User类的代码如下:
package com.yjry.note;
public class User {
private Integer id;
private String userName;
private Integer age;
//重写toString方法,便于显示数据
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", age=" + age +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
为该类添加Hibernate注解,添加注解后代码如下:
package com.yjry.note; import javax.persistence.*; @Entity
@Table(name = "t_user")
public class User {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "user_name", length = 30)
private String userName;
private Integer age;
//重写toString方法,便于显示数据
@Override
public String toString() {
return "User{" +
"id=" + id +
", userName='" + userName + '\'' +
", age=" + age +
'}';
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
下面解释下各个注解的意义:
@Entity注解声明该类是一个Hibernate的持久化类;
@Table注解指定该类映射的数据表,此处指定该类映射的数据表为t_user表;
@Id用于指定该类的标识属性(可以唯一表示该对象的属性),标识属性通常映射到数据表的主键列;
@GeneratedValue用于指定主键生成策略,其中strategy属性指定了主键生成策略为IDENTITY,对于MySQL数据库来说,主键自增长。
接下来编写Hibernate的核心配置文件hibernate.cfg.xml(该文件名为Hibernate加载的默认文件名),配置文件代码如下:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--配置数据库的连接四要素-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property> <!--是否打印sql语句-->
<property name="hibernate.show_sql">true</property>
<!--打印出来的sql语句是否格式化-->
<property name="hibernate.format_sql">true</property> <!--建表策略,建议使用update-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--指定数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--告诉hibernate映射文件所在位置-->
<mapping class="com.yjry.note.User"/>
</session-factory>
</hibernate-configuration>
建表策略
hibernate.hbm2ddl.auto属性可以为validate、update、create、create-drop。
validate:每次创建SessionFactory时,若数据库中没有与持久化类对应的数据表,或者数据表与持久化类不一致,则抛出异常;
注:判断不一致的条件为:数据表中缺少持久化类的属性对应的字段,也就是说,若持久化类对应的数据表含有多余的字段,不会影响validate检查,即程序不会抛出异常。
update:每次创建SessionFactory时,若数据库中没有与持久化类对应的数据表,则自动建表;若数据库中存在对应的表,则保留已有的数据表和数据,仅更新或插入数据;
create:每次创建SessionFactory时,都会自动建表,若之前存在数据表,则原表保留的数据会全部丢失;
create-drop:每次创建SessionFactory时,自动建表,SessionFactory关闭时,自动删表。
数据库方言
Hibernate底层依然使用SQL语句来执行数据库操作,然而各个数据库在SQL语法上存在一些差异,因此Hibernate需要根据数据库来识别这些差异,此时就要指定hibernate.dialect,这里使用MySQL数据库方言,告诉Hibernate使用MySQL的方式执行SQL语句。
创建测试类,完成数据表的创建以及数据的插入操作。代码如下:
package com.yjry.test; import com.yjry.note.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; public class UserTest {
public static void main(String[] args) {
/**
* 加载Hibernate配置文件
* 不带参数的Configuration方法,默认加载hibernate.cfg.xml文件
* 若传入test.xml作为参数,则加载test.xml文件
*/
Configuration configuration = new Configuration().configure();
//创建SessionFactory实例,创建该实例后,数据表已经创建完毕
SessionFactory sessionFactory = configuration.buildSessionFactory();
//创建Session实例
Session session = sessionFactory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
//创建User对象,并设置属性
User user = new User();
user.setUserName("张三");
user.setAge(20);
//执行session的save方法,保存数据,数据表待插入该数据
session.save(user);
//提交事务,数据插入到数据表
transaction.commit();
//关闭资源
session.close();
sessionFactory.close();
}
}
执行该代码,会发现MySQL数据库中多了一张t_user表,该表包含id、age、user_name三个字段,并且刚才创建的User对象数据已经插入到数据表中。

Hibernate知识总结(一)的更多相关文章
- hibernate 知识梳理
一.hibernate背景介绍: 作者: Gavin King 分hibernate ORM(for relation db),OGM(for nosql db),hearch,validator,t ...
- HIBERNATE知识复习记录1-连接及常用方法
要去面试了,复习一下HIBERNATE的相关知识吧,原来边看视频边写的代码如下,已经分不清先后次序了,大致看一看吧. 先看下总的配置文件hibernate.cfg.xml: <?xml vers ...
- 【Hibernate那点事儿】—— Hibernate知识总结
前言: 上一篇简单的讲解了下Hibernate的基础知识.这里对Hibernate比较重要的一些知识点,进行总结和归纳. 手码不易,转载请注明!——xingoo 总结的知识点: 1 关于hiberna ...
- Hibernate知识总结(一)——Hibernate原理概述
一.Hibernate是什么: 它是一个持久化框架,它对JDBC进行了轻量级的封装,简化对数据库的操作,提高开发效率.和另一个持久化框架MyBatis一样,他们操作数据库都是通过一个session对象 ...
- Hibernate 知识提高
主键生成策略有: UUID,increment.Hilo.assigned:对数据库无依赖 identity:依赖Mysql或sql server,主键值不由hibernate维护 sequence: ...
- HIBERNATE知识复习记录4-HQL和QBC
Hibernate中共提供了三种检索方式:HQL(Hibernate Query Language).QBC.QBE(Query By Example). HQL 是Hibernate Query L ...
- HIBERNATE知识复习记录3-关联关系
先上一张图,关于几种关系映射: 抄一段解释: 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用.关联关系分为上述七 ...
- HIBERNATE知识复习记录2-继承关系
发现了一篇和我类似的学习尚硅谷视频写的文章,内容如下,比我说的详细全面,可以看一下: [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , jo ...
- Hibernate知识梳理
一.SessionFactory接口 是单个数据库映射关系(ORM)经过编译后的内存镜像.SessionFactory(的实例)作为应用中的一个全局对象(工厂),可以随处打开/创建一个session, ...
随机推荐
- leetcode 1004最大连续1的个数
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 . 返回仅包含 1 的最长(连续)子数组的长度. 输入:A = [1,1,1,0,0,0,1,1,1,1,0], ...
- 13. Roman to Integer (JAVA)
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...
- Java8-函数式接口理解及测试
1. 函数式接口的理解 根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行设计的. 2. 函数式接口定义 2.1 自定义如下 需要 ...
- ABAP开发相关事务代码
事务代码 事务描述 事务代码 事务描述 SE37 ABAP/4函数编辑器 BAPI BAPI 浏览器 SE38 ABAP编辑器 LSMW 数据导入工具 SE39 ABAP分屏编辑器 PFCG 权限管理 ...
- Linux-Centon7常用命令
查看本机IP # ip addr 进入目录 # cd /xxx/xxx 编辑文件,打开文件后,按“Insert”键,进入输入模式(最下面会显示INSERT),将ONBOOT选项改为yes,然后按“Es ...
- Linux vim常见使用详解
教你用Vim编辑器 1.Vim编辑器基本使用方法 光标移动 查找/替换 插入模式 复制/粘贴 复制/粘贴 2.vim打开时的警告信息 当使用vim打开一个文件时,会同时在该目录下创建个.filenam ...
- linux(centos) tomcat设置开机启动
亲测有效 环境: centos7 apache-tomcat-8.5.37 设置步骤: 1.修改/etc/rc.d/rc.local vi /etc/rc.d/rc.local 2.添加下面两行脚本, ...
- g++ 学习笔记
gcc and g++分别是GNU的c & c++编译器.gcc/g++在执行编译的时候一般有下面4步: 1 预处理,生成.i的文件. 命令如下:g++ -E test.cpp 此命令只进行 ...
- @无痕客 https://www.cnblogs.com/wuhenke/archive/2012/12/24/2830530.html 通篇引用
无痕客 https://www.cnblogs.com/wuhenke/archive/2012/12/24/2830530.html 关于Async与Await的FAQ 关于Async与Await的 ...
- ESP8266擦除工具完整安装
ESP8266擦除工具完整安装 一. ESP8266擦除工具路径:http://down.liangchan.net/ESP8266%B2%C1%B3%FD%B9%A4%BE%DF%CD%EA%D5 ...