2021-5-14hibernate核心开发接口(API)
Posted PushyTao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-5-14hibernate核心开发接口(API)相关的知识,希望对你有一定的参考价值。
有关hibernate核心开发接口API的内容将在本篇博客中详细更新
项目结构:
0. hibernate应用程序体系结构视图
1. Hibernate 核心接口API
hibernate核心接口有:
- Configuration
- SessionFactory
- Session
- Transaction
- Query
- Criteria
再导入包之后:
大致的用法如下:
① Configuration接口
■ Configuration 接口负责管理Hibernate 的配置信息。它包括如下内容:
※ Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
※ Hibernate映射文件(*.hbm.xml)。
■ Hibernate配置的两种方法:
※ 方法1:属性文件(Hibernate.properties)。
调用代码:Configuration config = new Configuration();
※ 方法2:Xml文件(Hibernate.cfg.xml)。
调用代码:Configuration config = new Configuration().configure();
总结:
② SessionFactory接口
※ 创建SessionFactory
Configuration config=new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
※ SessionFactory接口
• 重量级对象,系统开销大。
• 用来产生和管理Session:应用程序从SessionFactory
(会话工厂)里获得
Session
(会话)实例。
• 通常情况下每个应用只需要一个SessionFactory
(单例)
• 除非要访问多个数据库的情况
• 关注两个方法即:openSession
、getCurrentsession
openSession
每次都是新的,需要close
getCurrentsession
从上下文找,如果有,用旧的,如果没有,建新的
③ Session接口
概述
• Session
是Hibernate
持久化操作的基础,与Web层的HttpSession
没什么关系。
• Hibernate Session
相当于JDBC Connection
。
• Session
接口是应用程序与hibernate连接的核心API
• Session
对象是轻量级的,每次实例化都需要与数据库交互。
• 管理一个数据库的任务单元(增 删 改 查
session对象的获取
a. 获取方式(两种):
方法1:
Session session = sessionFactory.openSession();//创建一个新的session对象
方法2:
Session session = sessionFactory.getCurrentSession();//获取当前线程中的session对象
对于getCurrentSession()
:
b. 两种方法的比较
SessionFactory()
是单例模式,即每次只有一个实例
session中的常用方法
CURD(增删查改)
CURD即:
C = create, U = update,R = retrieve检索数据,D = delete
使用到的方法如下:
• save()
/persist()
:添加对象
• delete()
:删除对象
• update()
:修改对象
• saveOrUpdate()
:添加或修改对象
•load()
/get()
:根据主键查询
• clear()
• flush()
CURD-定义工具类
提取共享代码
代码:
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class CoreAPITest {
public void testTeacherSave(){
Teacher t = new Teacher();
t.setName("wuyt");
t.setTitle("student");
//1 读取hibernate配置文件hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//2 创建session工厂,session不是会话,而是一个数据库连接对象conn
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3 获取一个链接session
Session currentSession = sessionFactory.getCurrentSession();
//4 事务处理
Transaction transaction = currentSession.beginTransaction();
//5 插入数据
currentSession.save(t);
//6 提交
transaction.commit();
}
}
创建HbnUtils工具类
package cn.edu.ldu.Utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HbnUtils {
static SessionFactory sessionFactory = null;
/*public static void main(String[] args) {
Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
///事务处理
Transaction trans = session.beginTransaction();
}*/
//单例模式SessionFactory,每次只有一个实例
//静态方法,一加载就执行
public static SessionFactory getSessionFactory(){
if(sessionFactory == null || sessionFactory.isClosed())
{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
return sessionFactory;
}
public static Session getSession(){
Session currentSession = getSessionFactory().getCurrentSession();
return currentSession;
}
/*
静态方法,静态变量
*/
}
类、表结构
数据库中 teacher表:
teacher类:
package cn.edu.ldu.entity;
import javax.persistence.*;
@Entity // 实体类,类和表有映射关系的类
@Table // 说明类和表的名称是相同的(name="my_teacher")
public class Teacher {
private int id;
///private String id;
private String name;
private String title;
public Teacher(){}
public Teacher(String n,String t){
this.name = n;
this.title = t;
}
/* 主键的生成方式*/
@Id /*定义主键*/
@GeneratedValue(strategy=GenerationType.IDENTITY)// AUTO
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//@Column(name = "name",length = 255)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\\'' +
", title='" + title + '\\'' +
'}';
}
}
CURD增删改的实现
save()
- 原始写法
代码大致为:
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class CoreAPITest {
public void testTeacherSave(){
Teacher t = new Teacher();
t.setName("wuyt");
t.setTitle("student");
//1. 读取hibernate配置文件hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//2. 创建session工厂,session不是会话,而是一个数据库连接对象conn
SessionFactory sessionFactory = cfg.buildSessionFactory();
//3. 获取一个链接session
Session currentSession = sessionFactory.getCurrentSession();
//4. 事务处理
Transaction transaction = currentSession.beginTransaction();
//5. 插入数据
currentSession.save(t);
//6. 提交
transaction.commit();
}
}
- 提取工具类写法
代码:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;
public class CRUDTest {
@Test
public void testSave(){
// 1. 获取session对象
Session session = HbnUtils.getSession();
try{
// 2. 开启事务
session.beginTransaction();
// 3. 执行CRUD操作
Teacher t = new Teacher("wuyt","学生");
session.save(t);
// 4. 提交事务
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
// 5. 回滚
session.getTransaction().rollback();
}
}
}
初始时:
在执行完代码后:
类对象保存成功!
persist()
persist()
是JPA
的接口,不是 hibernate
提供的方法
该方法可以用来插入
插入之后的结果:
delete()
答案是不能删除一条记录
在根据主键的值来进行删除的情况下,从内存中申请了一个Teacher
对象并指定name
和title
,该写法并没有指定id
所以说是不能够进行删除的
session.delete()
根据主键id
删除。
t.setId(9)
确定删除id=9的记录,且此记录存在。
id
若不存在,程序无法删除!(删除的前提基础就是该对象要存在)
下面来进行正确的删除操作
(以删除id为8的为例)
删除之后的结果:
代码:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;
public class CRUDTest {
@Test
public void testDelete(){
// 1. 获取session对象
Session session = HbnUtils.getSession();
try{
// 2. 开启事务
session.beginTransaction();
// 3. 执行CRUD操作
Teacher t = new Teacher();
t.setId(8);
session.delete(t);
// 4. 提交事务
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
// 5. 回滚
session.getTransaction().rollback();
}
}
}
update()
为了更新指定的一条记录,记录要保证唯一,那么就根据主键来进行确定
所以和删除操作类似,一定要指定记录的 id
假如以更新id
为1的记录为例:
代码:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;
public class CRUDTest {
@Test
public void testUpdate(){
Session session = HbnUtils.getSession();
try{
session.beginTransaction();
Teacher t = new Teacher("徐攀","啥也不是");
t.setId(1);
session.update(t);//之前那开启事务处理
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}
}
}
就这样,一号记录徐攀
从 普林斯顿大学博士
变成了啥也不是
根据id
查询get()
重写 toString()
的代码已经在前面贴过了,这里再cv一发
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\\'' +
", title='" + title + '\\'' +
'}';
}
要注意,get()返回的是一个 Teacher
对象,在使用的过程中,第二个参数是id
执行结果:
代码:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;
public class CRUDTest {
@Test
public void testGet(){
Session session = HbnUtils.getSession();
session.beginTransaction();
// 通过id查询一条记录
try{
Teacher teacher = session.get(Teacher.class, 2);//反射机制
System.out.println(teacher);
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}
}
}
根据id
查询 load()
我们按照同样的方式将get
改成load
之后可以发现:
结果是一样的
get()
和load()
区别
load
是一种延迟加载
注释掉输出语句之后可以发现
get()
:
load()
:
get()
有hibernate
输出,但是load
没有
这说明:
get()
直接从数据库加载,立即执行,不会延迟;
load()
等到真正用到对象的内容时才发出sql语句,称之延迟加载。
截至目前,CURDTest类的全部内容如下:
import cn.edu.ldu.Utils.HbnUtils;
import cn.edu.ldu.entity.Teacher;
import org.hibernate.Session;
import org.junit.Test;
public class CRUDTest {
@Test
public void testUpdate(){
Session session = HbnUtils.getSession();
try{
session.beginTransaction();
Teacher t = new Teacher("徐攀","啥也不是");
t.setId(1);
session.update(t);//之前那开启事务处理
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}
}
@Test
public void testGet(){
Session session = HbnUtils.getSession();
session.beginTransaction();
// 通过id查询一条记录
try{
Teacher teacher = session.get(Teacher.class, 2);//反射机制
System.out.println(teacher);
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}
}
@Test
public void testLoad(){
Session session = HbnUtils.getSession();
session.beginTransaction();
// 通过id查询一条记录
try{以上是关于2021-5-14hibernate核心开发接口(API)的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration