文章目录
删除指定的记录
User user = new User();
user.setId(9);
// user.setAccountName("liudehua"); // 不会按accountName删除
Session session = HibernateUtils.openSession();
/*// 获取事务对象
Transaction tx = session.getTransaction();
// 开启事务
tx.begin();*/
// 方法beginTransaction会完成上面的两个操作
Transaction tx = session.beginTransaction();
// 方法delete会获取对象user的属性ID的值,然后自动拼接一条删除的SQL语句
// delete from user where id=?
// 但是delete() 方法不会立即发送SQL语句给数据库
session.delete(user);
// 执行commit()方法后才会调用JDBC的API将SQL语句发送给数据库执行
tx.commit();
session.close();
新增记录
User user = new User();
user.setAccountName("liaowenxiong");
user.setRealName("廖文雄");
user.setPassword("123");
// 调用Hibernate的API,用于装载Hibernate配置文件
Configuration cfg = new Configuration();
// 调用无参的方法configure会默认装载目录classes下的Hibernate配置文件(hibernate.cfg.xml及mapping文件)
cfg.configure();
SessionFactory factory = cfg.buildSessionFactory();
// 通过Session工厂类获取Session对象
Session session = factory.openSession();
// 通过Session对象获取事务对象
Transaction tx = session.getTransaction();
// 开启事务
tx.begin();
// 保存数据
session.save(user);
// 提交事务
tx.commit();
// 关闭Session
session.close();
更新记录
User user = new User();
user.setId(13);
user.setAccountName("liaowenxiong");
user.setRealName("雄霸天下");
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
session.update(user);
tx.commit();
session.close();
清空缓存
session.clear();
将实体对象从缓存中清除
session.evict(Object obj);
将缓存中更新的数据同步到数据库
session.flush();
具体流程如下:
1、检查持久化对象在数据库中是否存在与之对应的记录
1)如果存在则检查实体对象的快照数据与数据库中对应的记录是否相同
①如果相同,则什么都不做
②如果不相同,则发出 update 语句
2)如果持久化对象在数据库中不存在与之对应的记录,则发出 insert 语句
2、检查对象与对象之间的级联操作 cascade=“save-update”,“all”
3、检查关系操作 inverse=“false”(维护关系),“true”(不维护)
把数据库中的数据刷到缓存中
session.refresh();
查询多个对象(也就是查询多条记录)
Query query = session.createQuery(String hql);
使用示例1:
// 方法createQuery并没有调用JDBC访问数据库,只是拼接了一条查询SQL语句而已
// User是类名,"from User"是Hibernate提供的面向对象的查询语言:HQL(Hibernate Query Language)语言。
Query query = session.createQuery("from User");
// 方法list()不支持懒加载,会访问数据库获取所有的记录
// 方法list调用JDBC的API访问数据库,再将获取到的数据封装成List对象返回
List<User> users = query.list();
// 所以这里就可以关闭Session了
session.close();
使用示例2:
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Employee");
// 方法iterate()默认支持懒加载机制,所以对象iterate中的元素对象都是代理对象
// 当 query.iterate()语句执行结束后,因为延迟加载机制,
// 先执行 select id from emp;语句,从数据库中仅仅将 id 取出;
Iterator<Employee> iterate = query.iterate();
while (iterate.hasNext()) {
Employee employee = iterate.next();// 对象next其实是一个代理对象
// 获取对象employee中的数据时才会去访问数据库获取对应的记录
System.out.println(employee.getName());
}
查询指定ID的对象(查询指定ID值的记录)
// 对应的数据表中并不存在id=2的记录,get方法会返回null
Employee e1 = session.get(Employee.class, 2);
System.out.println(e1);// null
Employee e2 = session.load(Employee.class, 2);// 因为懒加载机制,得到一个代理对象
System.out.println(e2); // 访问对象,获取对象中的数据时,会查询数据库,因为找不到对应的记录所以会报错
可以参阅《Hibernate中的Session.load() 和 Session.get() 的区别》。
参考
1.https://blog.csdn.net/xlgen157387/article/details/39777827#