一、实现CRUD操作
1、实现思路:
第一步 加载hibernate核心配置文件
第二步 创建SessionFactory对象
第三步 使用SessionFactory创建session对象
第四步 开启事务
第五步 写具体逻辑 crud操作
第六步 提交事务
第七步 关闭资源
/**
* Session(重点)
* 1 session类似于jdbc中的connection
* 2 调用session里面不同的方法实现crud操作
* (1)添加save方法 (2)修改update方法
* (3)删除delete方法(4)根据id查询get方法
* 3 session对象单线程对象
* (1)session对象不能共用,只能自己使用
*/
2、添加操作
//添加功能
@Test
public void testAdd() {
//第一步 加载hibernate核心配置文件
//到src下面找到名称是hibernate.cfg.xml
//在hibernate里面封装对象
Configuration cfg = new Configuration();
cfg.configure();
//第二步 创建sessionFactory对象
//读取hibernate核心配置文件内容,创建sessionFactory
//在过程中,根据映射关系,在配置数据库里面把表创建
SessionFactory sessionFactory = cfg.buildSessionFactory();
//第三步 使用sessionFactory创建session对象
//类似于连接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction tx = session.beginTransaction();
//第五步 写具体逻辑crud操作
//添加操作
User user = new User();
user.setUsername("白白");
user.setPassword("1314");
user.setAddress("中国");
//调用session的方法实现添加
session.save(user);
//第六步 提交事务
tx.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
为了方便,我们可以编写一个工具类
/**
* 工具类,将获取核心配置文件的代码进行整合
* @author 葛云霞
* 获取核心配置文件标签,写静态代码块实现
*/
public class DUtils {
//写静态代码块实现 静态代码快在类加载时候执行 执行一次
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
//获取本地线程Session
public static Session getSessionObject() {
return sessionFactory.getCurrentSession();
}
}
3、删除操作
//删除功能(调用工具类)
@Test
public void testDelete() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = DUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
//4 删除操作 调用session里面delete方法实现
User user = session.get(User.class, 1);//可以通过User user = new User(); user.setUid(1);
session.delete(user);
//第六步 提交事务
tx.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
4、修改操作
//修改操作(调用工具类)
@Test
public void testUpdate() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = DUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
//4 修改操作 调用session里面update方法实现
User user = session.get(User.class, 2);
user.setUsername("笑笑");
session.update(user);
//第六步 提交事务
tx.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
5、查询操作
//查询操作(调用操作类)
@Test
public void testGet() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = DUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
//4 根据id查询 调用session里面的get方法
User user = session.get(User.class, 3);
System.out.println(user);
//第六步 提交事务
tx.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
另外我们有一些细节问题需要了解
/**
* 实体类对象有三种 (1)瞬时态 (2)持久态 (3)托管态
* (1)瞬时态:对象里面没有id值,对象与session没有关联
* User user = new User();
* user.setName("丽丽");
* user.setPassword("1234");
* (2)持久态:对象里面有id值,对象与session没有关联
* User user = session.get(User.class,1);
* (3)托管态:对象里面有id值,对象与session有关联
* User user = new User();
* user.setUid(3);
*/
//三种状态的相互转换
![](https://i-blog.csdnimg.cn/blog_migrate/2b8f2087e19256e07102588408c39677.png)
//saveOrUpdate方法:实现添加 实现修改
/**
* 实体类对象状态是瞬时态,做添加
* 持久态 托管态都是做修改
*/
//通过getCurrentSession() :该方法是获取本地的session 来编写上面的代码
@Test
public void testSession() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
sessionFactory = DUtils.getSessionFactory();
session = sessionFactory.getCurrentSession();//使用该方法,不需要再关闭session和sessionFactory,要不然会报错
//开启事务
tx = session.beginTransaction();
//增删改查方法编写的位置
//添加
User user = new User();
user.setUsername("王五");
user.setPassword("1234");
user.setAddress("中国");
session.save(user);
//提交事务
tx.commit();
}catch(Exception e) {
e.printStackTrace();
//回滚事务
tx.rollback();
}
}