首先定义工具类:HbnUtils
包:com.etc.utils
SessionFactory由于是重量级,线程安全的,所有我们的使用原则:是用单例的,且不要手动关闭该对象
public class HbnUtils{
private static SessionFactory sessionFactory;
public static Session getSession(){
return getSessionFactory.getCurrentSession();
}
public static SessionFactory getSessionFactory(){
if(sessionFactory == null || sessionFactory.isClosed()){
sessionFactory=new Configuration().configure().buildSessionFactory();
}
return sessionFactory;
}
}
快捷键: alt+shift+m : 是把一段代码变成一个方法
光标定位到该变量,ctrl+1:选第三项:可把一个变量变成一个全局静态变量
测试类
public class MyTest{
@Test
public void testSave(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行操作
Student student=new Student("张三",20,93.5);
session.save(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
@Test
public void testDelete(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行删除操作
Student student=new Student();
student.setId(1);
//删除的条件是对象要具有id
session.delete(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
@Test
public void testUpdate(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行修改操作
Student student=new Student("李四",24,94.5);
student.setId(2);
//更改的条件是对象要具有id
session.update(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
//persist的效果和save的效果一样可以添加数据
@Test
public void testPersist(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行操作
Student student=new Student("张三",20,93.5);
session.persist(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
//查询
@Test
public void testGet(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行修改操作
Student student=session.get(Student.class,2);
System.out.println(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
面试点:底层涉及的比较多,自己查询资料????
下面的只是表象:
//get()与load()的共同点:根据id加载对象
区别:当所要查询的数据id=20(假设)在数据库中不存在的时候
使用get()返回的是null
使用load()返回的是抛出异常
//查询
@Test
public void testGet(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行修改操作
Student student=session.load(Student.class,2);
System.out.println(student);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
@Test
public void testSaveorUpdate(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行修改操作
Student student=new Student("李小四",24,94.5);
student.setId(2);
session.saveOrUpdate(student); //执行的是update
当注释掉student.setId(2);该行后,执行的是insert即save
如果你操作的这个对象存在id,执行的就是update,否则就是执行insert即save
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}
//查询操作对事务的要求:
@Test
public void testGetLoad(){
==============hibernate操作数据库的七步============
//报错:
//1.获取Session对象
Session session = HbnUtils.getSession();
//2.执行查询操作
//通过getCurrentSession()获取到的session所执行的查询必须在事务的环境下运行,否则报错
Student student=session.get(Student.class,2);
System.out.println(student);
}
@Test
public void testGetLoad2(){
==============hibernate操作数据库的七步============
//正确:
//1.获取Session对象
Session session = HbnUtils.getSessionFactory().openSession();
//2.执行查询操作
//通过getCurrentSession()获取到的session所执行的查询必须在事务的环境下运行,否则报错
//通过openSession()获取到的session所执行的查询无须一定在事务的环境下运行
Student student=session.get(Student.class,2);
System.out.println(student);
}
//增删改查的默认执行顺序:
@Test
//一个方法做增删改查
public void testCURD(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行操作
//增删改查的默认执行顺序:
//增删改操作若放在同一事务下运行,则系统默认的执行顺序为:增--》改--》删
//删除
Student student=session.get(Student.class,2);//这一步是查询
session.delete(student)
//插入
Student student2=new Student("王五",25,95.2);
session.save(student2);
//修改
Student student3=session.get(Student.class,3);
student3.setName("赵六");
session.update(student3);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
//自定义增删改查的执行顺序:
@Test
//一个方法做增删改查
public void testCURD(){
==============hibernate操作数据库的七步============
//1.获取Session对象
Session session = HbnUtils.getSession();
try{
//2.开启事务
session.beginTransaction();
//3.执行操作
//增删改查的默认执行顺序:
//增删改操作若放在同一事务下运行,则系统默认的执行顺序为:增--》改--》删
//删除
Student student=session.get(Student.class,4);//这一步是查询
session.delete(student);
//刷新Session缓存 顺序:变成了先删除在插入在修改
session.flush();
//修改
Student student3=session.get(Student.class,3);
student3.setName("赵小六");
session.update(student3);
//插入
Student student2=new Student("王五",25,95.2);
session.save(student2);
//4.事务提交
session.getTransaction().commit();
}catch (Exception e){
e.printStackTrace();
//5.事务回滚
session.getTransaction().rollback();
}
}