实体类编写规则
- 实体类的属性是私有的
- 私有属性使用公开的get和set方法进行操作
- 要求实体类里的有一个属性作为唯一值(一般使用id值)
- 实体类的属性的数据类型,在hibernate中建议使用基本数据类型的包装类。是为了避免空对象。
Hibernate主键生成策略
<generator class="native"></generator>
- increment:
- identity:
- sequence:
- native:根据使用的数据库,自动选择适合的值
- uuid:会自动生成一个32位的16进制的唯一字符串
- assigned:
实体类的crud操作
- session.save(object):添加记录
- session.get(Class,value):根据id查询
- session.update(object):修改
- saveOrUpdate(object):实现添加和修改
Hibernate的缓存
- 数据存到数据库中,数据库本身是文件系统。
- 把数据存到内存中,可以提高读取效率
- hibernate一级缓存
- 一级缓存默认打开的
- 一级缓存的使用范围,是session的范围(session创建到session关闭)
- 存储数据必须是持久态数据
- 持久态数据在提交事务时,自动更新数据库
- hibernate二级缓存
- 二级缓存不是默认打开,需要配置
- 二级缓存现在基本不用了,使用redis替代
- 二级缓存的范围,是SessionFactory的范围(SessionFactory创建到SessionFactory关闭)
Hibernate事务操作
- 什么是事务
- 事务的特性
- 不考虑隔离性产生的问题
- 脏读
- 不可重复
- 虚读
- 设置事务隔离级别
- MySQL默认隔离级别repeatable read
Hibernate事务代码规范写法
SessionFactory sessionFactory = null;
Transaction tx = null;
Session session = null;
try{
// 开启事务
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
// 添加
User user = new User();
user.setUsername("Eric");
user.setPassword("password");
user.setAddress("Chendu China");
// 提交事务
tx.commit();
} catch(Exception e) {
// 回滚事务
e.printStackTrace();
tx.rollback();
} finally {
// 关闭
session.close();
sessionFactory.close();
}
Hibernate绑定session
- session类似于jdbc中的connection
- hibernate帮我们实现了本地线程绑定session
- 获取与本地线程绑定的session
- 在hibernate核心配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
- 使用SessionFactory中的方法可以得到
// 提供返回与本地线程绑定的session的方法 public static Session getSessionObject(){ return sessionFactory.getCurrentSession(); } // 在代码中调用(操作结束后不需要手动关闭) Session session = HibernateUtils.getSessionObject();
Hibernate中的api使用
-
Query对象
- 使用Query对象,不需要使用sql语句,但是需要写hql(hibernate query language)语句
- hql与sql的区别:
- 使用sql操作表和字段
- 使用hql操作实体类和属性
- 使用演示:
// 1.创建Query对象 Query query = session.createQuery("from User"); // 2。调用Query对象中的方法 List<User> list = query.list(); for (User u:list){ System.out.println(u); }
-
Criteria对象
- 使用这个对象,不需要写语句,直接调用方法实现
- 使用演示程:
// 1.创建Criteria对象 Criteria criteria = session.createCriteria(User.class); // 2.调用Criteria对象中的方法 List<User> list = criteria.list(); for (User u:list){ System.out.println(u); }
-
SQLQuery对象
- 使用hibernate的时候,调用底层sql实现
- 使用演示:
// 1.创建SQLQuery对象 // 参数填写普通sql语句 String sql = "select * from t_user"; SQLQuery sqlQuery = session.createSQLQuery(sql); // 2.调用SQLQuery对象中的方法 sqlQuery.addEntity(User.class); List<User> list = sqlQuery.list(); for (User u:list){ System.out.println(u); }
网友评论