SessionFactory
1.创建SessionFactory做的事情:
根据核心配置文件中的配置,映射到数据库的表中进行建表或者更新表的操作。
2.创建SessionFactory,非常的消耗资源,在没有多数据源的情况下,一般一个项目只有一个SessionFactory。
Session
1.session类似于jdbc中的connection
2.session的常用方法
1).添加 save方法
2).修改 update方法
3).删除 delete方法
4).根据id查找 get方法
public class Test {
@org.junit.Test
public void add() {
// //1.加载hibernate核心配置文件
// Configuration cfg = new Configuration();
// cfg.configure();
// //2.创建SessionFactory对象
// SessionFactory sessionFactory = cfg.buildSessionFactory();
//3.使用SessionFactory对象创建session
SessionFactory sessionFactory = SessionUtil.getSessionFactory();
Session session = sessionFactory.openSession();
//4.开启事务
Transaction transaction = session.beginTransaction();
//5.写具体crud操作
//添加
// User user = new User();
// user.setName("zcl");
// user.setPassword("123456");
// user.setAddress("HZ");
// session.save(user);
//根据id查找
// User o = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
// System.out.println(o.toString());
//修改
// User o = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
// o.setName("李四");
// session.update(o);
//删除
// User user = (User) session.get(User.class, "4028489976dd1e320176dd1e36140000");
// session.delete(user);
// User user = new User();
// user.setName("张飞");
// user.setPassword("123");
// user.setAddress("葫芦岛");
User user = (User) session.get(User.class, "4028489976e7366a0176e7366e040000");
user.setName("2礼拜");
// session.saveOrUpdate(user);
//6.提交事务
transaction.commit();
//7.关闭资源
session.close();
sessionFactory.close();
}
}
3.session是单线程对象(session对象不能共用,只能自己使用)
Transaction
1.事务对象
2.提交和回滚:
commit()、rollback();
3.事务的概念:
原子性、一致性、隔离性、持久性。
Hibernate中实体类的三种状态
1.瞬时态
没有session关联.没有id
2.持久态
有id,与session关联
3.托管态
有id,没有session关联
saveOrUpdate方法
为瞬时态时为新增操作,其他为修改操作
Hibernate一级缓存和二级缓存
一级缓存:
hibernate默认开启一级缓存
是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库中取数据
二级缓存:
需要从配置文件中配置,现在一般不开启二级缓存,用redis代替它
是SessionFactory级别的缓存,也就是整个项目中,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库
一级缓存特性:持久态会自动更新数据库
当一个持久态的返回实体类时,如果实体类在一级缓存中不存在,回去执行select语句查找这条数据,返回结果后,该结果会写入一级缓存中以及对应的快照区。执行修改动作时,只改变一级缓存中的相应内容,快照区不改变,事务提交时,会将一级缓存中的内容与快照区比较,如果不同就自动更新,相同的话不会执行update。
优点:快速,节约资源。
在实际项目中,session对象要保持单线程,需要与本地绑定,在配置文件中进行配置。
获取与本地绑定的session,不需手动要关闭,否则会报错
hibernate api的使用
Query对象
Critia对象
SQLQuery对象
public class Test03 {
@Test
public void test4() {
Session session = null;
Transaction transaction = null;
try {
session = SessionUtil.getSessionObject();
transaction = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user a join t_dept b on a.dept=b.did ");
List list = sqlQuery.list();
System.out.println(list);
}catch (Exception e){
}
}
@Test
public void test3 () {
// Session session = null;
// Transaction transaction = null;
// try {
// session = SessionUtil.getSessionObject();
// transaction = session.beginTransaction();
// Criteria criteria = session.createCriteria(User.class);
// //查询所有
// //List<User> list = criteria.list();
// //条件查询,需要使用add方法,使用类对象实现条件设置
// criteria.add(Restrictions.eq("name","李清照"));
// criteria.add(Restrictions.like("address","%s%"));
// List<User> list = criteria.list();
// //排序查询
// criteria.addOrder(Order.asc("id"));
// criteria.addOrder(Order.desc("id"));
// List list = criteria.list();
// //分页查询
// criteria.setFirstResult(0);
// criteria.setMaxResults(2);
// List list = criteria.list();
// for (User u :
// list) {
// System.out.println(u.toString());
// }
// transaction.commit();
// } catch (Exception e) {
// e.printStackTrace();
// transaction.rollback();
// }
}
@Test
public void test2 () {
// Session session = null;
// Transaction transaction = null;
// try {
// session = SessionUtil.getSessionObject();
// transaction = session.beginTransaction();
// //排序
// Query query = session.createQuery("from User order by id desc ");
// List<User> list = query.list();
// //分页
// Query query = session.createQuery("from User order by id desc");
// //设置开始位置
// query.setFirstResult(0);
// //设置最大记录数
// query.setMaxResults(2);
// List list = query.list();
// //聚合
// Query query = session.createQuery("select count(*) from User ");
// Object o = query.uniqueResult();
// Long obj=(Long) o;
// int count=obj.intValue();
// System.out.println(count);
//
// // query.setParameter(0,"4028489976ea83fe0176ea8402540000");
query.setParameter(1,"李清照");
List<User> list = query.list();
//模糊
Query query = session.createQuery("from User where name like ?");
query.setParameter(0, "%飞%");
List<User> list = query.list();
// for (User u :
// list) {
// System.out.println(u.toString());
// }
// transaction.commit();
// } catch (Exception e) {
// transaction.rollback();
// e.printStackTrace();
// }
}
@Test
public void test () {
Session session = null;
Transaction transaction = null;
try {
session = SessionUtil.getSessionObject();
transaction = session.beginTransaction();
//使用Query对象
// Query query = session.createQuery("from User");
// List<User> list = query.list();
// for (User u :
// list) {
// System.out.println(u.toString());
// }
//使用Critia对象
// Criteria criteria = session.createCriteria(User.class,"from User");
// List<User> list1 = criteria.list();
// for (User u:
// list1 ) {
// System.out.println(u.toString());
// }
//使用SQLQuery对象
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();
for (User u :
list) {
System.out.println(u.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}