hibernate Day1
1 Web内容回顾
(1) JavaEE三层架构
web层(struts2框架)
service层(spring框架)
dao层(hibernate框架):负责对数据库进行CRUD操作
(2) MVC模式(这是不Java独有的,是所有开发语言共有的)
Model--模块
View--视图
Controller--控制器
2 Hibernate概述
(1) 什么是框架
框架( Framework )是整个或部分系统的可重用设计,表现为一组抽象 构件 及构件实例间交互的方法 ;
另一种定义认为,框架是可被应用开发者定制的应用骨架。
前者是从应用方面而后者是从目的方面给出的定义。
通俗理解:写我们自己的程序,使用框架后,它会帮助我们实现一部分的功能,使用框架的好处,少写一部分代码实现
功能。
(2) 什么是Hibernate(重点)
> Hibernate:冬眠,我们可以理解为持久化
> Hibernate框架应用在JavaEE三层结构中的dao层
> 在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是
jdbc,hibernate对jdbc进行了封装
> 使用hibernate的最大好处是不需要写复杂jdbc代码,不需要写sql语句
> hibernate是开源的轻量级的框架(不依赖于其他的框架,jar也很小)
> hibernate版本:
hibernate 3.x
hibernate 4.x:这是一个过渡版本,没有人使用
hibernate 5.x:我们要使用的版本
(3) 什么是ORM
> Hibernate使用orm思想对数据库进行crud操作
> 学习过JavaBean,更加正确的叫法 实体类
> ORM( Object Relational Mapping ): 对象关系映射 , 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数
据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的 --“ 虚拟对象数据库 ” 。
ORM 说明:
> 让实体类和数据库表进行一一对应关系
让实体类首先和数据库的表对应
让实体类中的属性与表中的字段相对应
> 不需要直接操作数据库表,而操作表对应的实体类对象
3 Hibernate入门
(1) 开发环境搭建
创建项目,MyEclispse中引入Hibernate框架
注意,hibernate框架上并不包含jdbc连接jar包,这个要自己导入
第二步 创建实体类 Person .java
package com.huza.domain;
public class Person {
/*hibernate要求实体类有一个唯一标识对象的属性,这个类中使用uid*/
private int uid;
private String uname;
private String pword;
private String addr;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPword() {
return pword;
}
public void setPword(String pword) {
this.pword = pword;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
创建实体类后,我们要创建该实体类对应的表,所以我们先创建一个数据库,再创建表,
其实我们在使用hibernate时,不需要自己手动创建表,hibernate可以帮助我们到数据库中去创建表的
第三步 配置实体类和数据库表的一一对应关系(映射关系)
>> 创建一个xml格式的配置文件
-- 映射配置文件名称和位置淌有固定要求
--建议:在实体类所在包里面创建,实体类名称.hbm.xml
>>在xml文件中引用相应的dtd约束
映射配置文件
第四步 创建hibernate的核心配置文件
>> 核心配置文件格式是xml,但是核心配置文件的名称和位置是固定的
-- 位置 : 必须在src目录下
-- 名称:必须是hibernate.cfg.xml
>> 创建 hibernate.cfg.xml 核心配置文件,并引入dtd约束
>> hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载
--配置数据库信息(hibernate.properties文件中定义了配置的标准)
连接mysql数据库的配置详情
--配置hibernate信息
-- 把映射文件放到核心配置文件中
文件全部内容:hibernetate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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://127.0.0.1:3306/hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置数据库方言,就是针对不同的数据库有不同sql标准 -->
<property name="hibernate.dialect">hibernate.dialect</property>
<!-- 配置hibernate信息 可选 -->
<!-- 输出底层sql语句 -->
<property name="show_sql">true</property>
<!-- 输出底层sql语句 并格式化显示,方便开发人员查看 -->
<property name="format_sql">true</property>
<!-- hibernate帮助我们创建表,他不会自动创建,而是我们进行配置
create:如果没有该表则创建该表,注意每次都会重新创建(删除后再重新创建),因为每启动都会重新加载该文件
update:如果没有该表则创建该表,如果已经存在该表,则会看瞧一瞧表结构有没有变化,如果有变化则会创建新的表,如果没有保
留原来的表,且会保留其中的记录
create-drop:在显 式关闭sessionFactory时,则会删除对应的表,慎用。注意是显式关闭的是SessionFactory,不是Session噢
validate:每次加载时,都验证表与对象是否一致
使用注意:这几个配置只做一次,配置好后,生成数据库后,就取消这个配置
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 把映射文件加载过来 -->
<mapping resource="com/huza/domain/person.hbm.xml" />
</session-factory>
</hibernate-configuration>
(2) 添加功能实现(创建一个测试类)
第一步 加载hibernate核心配置文件
第二步 创建SessionFactory对象
第三步 使用SessionFactory创建session对象
第四步 开启事务
第五步 写具体逻辑crud操作
第六步 提交事务
第七步 关闭资源
效果:
> 是否在数据库中生成表
> 看表中是否有记录
package com.huza.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.huza.domain.Person;
public class HibernateDemoTest {
@Test
public void addPerson () {
// 第一步 加载hibernate核心配置文件
// 获取hibernate配置对象
Configuration cfg = new Configuration();
// 通过配置对象加载hibernate默认配置
cfg.configure();
// 第二步 创建SessionFactory对象
// 读取核心配置文件hibernate.cfg.xml,创建sessionFactory
// 在这个过程中,会根据映射关系,在数据库中把相应的表生成
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 第三步 使用SessionFactory创建session对象
// 类似于jdbc连接,只是这个地方hibernate做了封装
Session session=sessionFactory.openSession();
// 第四步 开启事务
Transaction tx=session.beginTransaction();
// 第五步 写具体逻辑crud操作
Person person=new Person();
person.setUname("王小小");
person.setPword("wangxiaoxiao");
person.setAddr("中国上海");
// 调用session对象的实现方法,完成添加
session.save(person);
// 第六步 提交事务
tx.commit();
// 第七步 关闭资源
session.close();
sessionFactory.close();
}
}
4 Hibernate配置文件详解
(1) 映射配置文件
>映射配置文件名称和位置没法有固定要求
>映射配置文件中的name属性值写实体类相关内容
-- class 标签name属性值实体类全路径
-- id标签和property标签name属性值 实体类的属性名称(注意要完全一样)
-- id标签和property标签中的column属性是可以省略的,如果不写则,生成的字段名与属性名一样,建议写
出,这样比较清析。
-- property标签中 还有一个属性type属性,用于设定字段的类型,我们可以不用使用,这时hibernate会自动
生成相应的类型
(2) 核心配置文件
> 配置写位置要求
> 配置的三部分要求
-- 数据库配置部分是必须的
-- hibernate部分可选的
-- 映射文件必须的
> 核心配置文件名称和位置是固定的
-- 位置src
-- 名称hibernate.cfg.xml
5 Hibernate的核心API
(1) Configuration
org.hibernate.cfg.Configuration;// 所在包
Configuration cfg = new Configuration();
cfg.configure();
作用:到src目录下找到名称为hibernate.cfg.xml 配置文件,创建对象,把配置文件放到对象里(加载核心配置
文件)
当然我们如果不把配置文件放到指定src目录下,我们可以通过cfg的configure(path);重载来完成也可以加
载(基本不用)。
(2) SessionFactory (重点对象)
> 使用Configuration对象创建SessionFactory对象
-- 创建SessionFactory对象过程中做的事情
根据核心配置文件中的数据库配置信息,同时还有类与表的映射,到数据库里创建相应的表,但要根据
<property name="hibernate.hbm2ddl.auto">update</property>
> 因为我们在创建SessionFactory过程中,这个过程特别耗资源(因为要创建表)
-- 在hibernate操作中,建议一个项目一般创建一个SessionFactory对象(单例模式)
HibernateUtils.java
package com.huza.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* HibernateUtils工具类
* @author Huza
*
*/
public class HibernateUtils {
private static SessionFactory sessionFactory = null;
private HibernateUtils() {
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
return sessionFactory;
}
}
(3) Session(重点对象)
> session可以理解为jdbc中的连接connection
> 调用session里面不同的方法实现crud操作
-- 添加 save 方法
-- 修改 update 方法
-- 删除 delete 方法
-- 根据id查询 get 方法
> 一个项目中我们一般只有一个SessionFactory,是单例的,Session对象是单线程对象
-- Session对象不能共用,只能自己使用
(4) Transaction
> 事务对象
> 事务概念
-- 事务四个特性
原子性、一致性、隔离性、持久性
hibernate Day1的更多相关文章
- hibernate Day1 案例代码
1.创建Person类 package com.icss.pojo; public class Person { private int uid; private String uname; priv ...
- Hibernate 配置详解(2)
6) hibernate.session_factory_name: 配置一个JNDI名称,通过Configuration对象创建的SessionFactory会绑定到JNDI下该名称中.一般名字格式 ...
- Exception 01 : org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [foo]
异常名称 org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [foo] 异常截屏 异常详细信息 org.hibernat ...
- Hibernate上传数据到数据库,从数据库读取数据到本地模板代码
1.Hibernate上传数据到数据库: //创建一个session对象 Session session1=HibernateTools.getSession(); //Fenciresult数据库表 ...
- 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作
spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- 解决 Springboot Unable to build Hibernate SessionFactory @Column命名不起作用
问题: Springboot启动报错: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
随机推荐
- 20170225-第一件事:SAP模块清单
第一件事:SAP模块清单 AM 资产会计 资产会计BC SAP Netweaver SAP NetweaverBW 业务信息仓库 业务信息仓库CA 常规跨应用程序 常规跨越应用程序CO 控制 控制 C ...
- (C)非局部跳转语句(setjmp和longjmp)
1. 特点 非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句. 头文件包含#include Void longjmp(jmp_buf env,int val ...
- sdut oj 1510 Contest02-4 Spiral
Contest02-4 Spiral Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Given an odd number n, ...
- 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)
走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方 ...
- PHP Framework MVC Benchmark 基准测试
身边有朋友在用yaf框架,讨论的也声音也比较多,今天没事看鸟哥的博客,看到一篇现在PHP主流的几个框架性能对比,比较有意思,给大家分享一下! Yaf是用PHP扩展的形式写的一个PHP框架,也就是以C语 ...
- myeclipse8.6注册码
loveyLR8ZC-855550-69545856608357821
- CodeForces-668D:Remainders Game (中国剩余定理||理解)
Today Pari and Arya are playing a game called Remainders. Pari chooses two positive integer x and k, ...
- [SoapUI] Jenkins 配置不同环境(TP, LIVE)
- WC2017游记
Day0 到杭州之后出了点锅换了辆车,等了好久才开= =到宿舍发现路由器就在房门口,稳啊,过了一会儿就连不上了= =而且只有门口那个连不上,可以连上楼下的= =之后干了啥也忘了…… Day1 上午直接 ...
- 小K的农场(差分约束)
题目大意 n个点 m条描述 农场 a 比农场 b 至少多种植了 c 个单位的作物. 农场 a 比农场 b 至多多种植了 c 个单位的作物. 农场 a 与农场 b 种植的作物数一样多. 题解 差分约束裸 ...