01hibernate4框架基础
文章目录
前言
记录学习hibernate4框架基础的笔记,使用hibernate框架生成相应文件
一、什么是ORM?
1、ORM - Object Relational Mapping 对象关系映射
映射内容:
- 数据库表 ------------------ JAVA实体类(数据的载体)
- 表的字段 ------------------ JAVA类中的属性
- 数据库的数据类型 ------ JAVA的数据类型
- 数据库表的记录 --------- JAVA类的对象
- 表与表的主外键关系 — JAVA的对象间的关联关系(一对一、一对多、多对一、多对多)
2、主流的ORM框架
Hibernate:完整的orm框架,主要映射应用程序的对象模型,更能体现ORM的思想。
Mybatis:非完整的orm框架,主要映射的是sql语句,Mybatis-plus
JPA :类似hibernate框架
3、Hibernate的基础概念
持久化 ---------------- 程序的对象在瞬时状态(内存)与持久状态(磁盘)之间转换的机制。
持久化操作 ---------- 主要对数据库的增删改查的操作
持久层 ---------------- 指的是数据访问层(DAO层)
4、Hibernate与JDBC的关系
JDBC是底层的数据库的交互技术,Hibernate封装了JDBC,提高了DAO的开发效率。
4、Hibernate的框架的学习流程
Myeclipse的反向工程工具自动生成ORM
反向工程 :数据库表 —> 应用的实体类(模型)
正向工程 :应用实体模型 —> 数据库设计
通过Myeclipse反向工程工具生成: entity、entity.hbm.xml
二、实践部分
1、创建java Project项目
2、数据库视图窗口
2.1打开数据库视图窗口
2.2新建连接
2.3连接数据库
2.4添加数据库,可以连接多个数据库
2.5完成,双击刚刚创建的数据库名称,点开TABLE即可看到表信息
2.6右上角,回到编码视图
3、生成hibernate.cfg.xml文件
注意修改url
4、生成实体文件
主键生成策略(器)
- identity 主键自增(建议) mysql或sqlserver 由底层数据库实现主键自增
- increment 主键自增 由hibernate程序实现主键自增,原则 :select max(id)+1
- assigned 一般用于主键是字符串,由程序提供主键的生成算法
- sequence 序列生成主键,oracle常用
- uuid 全球唯一标识码,32位长度的字符串,jdk提供相应在工具生成uuid,在分布式系统中较常用。
说明:
dialect 必选 指定数据库的方言(类型)
show_sql 指定为true时,会在控制台输出执行的sql语句
format_sql 格式化输出sql
5、单元测试
5.1 添加操作
package com.gec.hiber.junit;
import static org.junit.Assert.*;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.gec.hiber.entity.Users;
import com.gec.hiber.utils.HibernateSessionUtils;
public class TestUser {
//添加操作
@Test
public void testAdd() {
Session session=null;
try {
session=HibernateSessionUtils.getSession();//获取连接
Transaction tx=session.beginTransaction();//启动事务
Users user=new Users();
user.setName("huad");
user.setPassword("123456");
user.setIsadmin("1");
session.save(user);
tx.commit();//提交事务
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();//关闭资源
}
}
}
添加成功
5.2 查询操作
hibernate的get和load方法: 都是根据对象的唯一标识查询单条记录
区别:
- get方法是即时加载数据,load方法是延时加载数据,在获取对象属性时发送sql语句。
- 如果找不到数据时,load方法会抛出ObjectNotFoundException,get方法返回null值。
//查询无需事务环境
@Test
public void testGetAndLoad(){
Session session=HibernateSessionUtils.getSession();
//数值类型和String类型都实现了Serialiable
int id = 1034;
Users user=(Users)session.get(Users.class, id);
// Users user=(Users)session.load(Users.class, id);
System.out.println(user.getName());
session.close();
}
5.3 修改操作
//修改操作
@Test
public void testUpdate() {
Session session=null;
try {
session=HibernateSessionUtils.getSession();//获取连接
Transaction tx=session.beginTransaction();//启动事务
//查询已知用户
int id=1005;
Users user=(Users)session.get(Users.class, id);
user.setPassword("123123");
session.update(user);
tx.commit();//提交事务
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();//关闭资源
}
}
5.4 删除操作
//删除操作
@Test
public void testDelete() {
Session session=null;
try {
session=HibernateSessionUtils.getSession();//获取连接
Transaction tx=session.beginTransaction();//启动事务
//查询已知用户
int id=1005;
Users user=(Users)session.get(Users.class, id);
session.delete(user);
tx.commit();//提交事务
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
session.close();//关闭资源
}
}
6、Hibernate的对象的状态转换
- 临时状态 当使用new实例化出来的对象,该对象还没在hibernater的容器中管理。
- 持久状态 该对象是由hibernate容器管理的,对象与数据库的数据是一一对应关系。也称为“托管状态”。
- 游离状态 持久状态的对象脱离容器的管理,也称为“脱管状态”