有关hibernate核心开发接口API的内容将在本篇博客中详细更新
有关PPT来自鲁东大学信息与电气工程学院软件工程系孙丽老师
项目结构:
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(); } } }
初始时:
在执行完代码后:
类对象保存成功!