1.hibernate中的实体规则
实体类创建注意事项:
1>持久化类提供无参数构造
2>成员变量私有,提供那get/set方法访问,需要提供属性(有get/set方法才叫属性)‘
3>持久化类中的属性应应该尽量使用包装类型(Byte、Short、Integer、Long、Float、Double、Character、Boolean)
4>持久化类需要提供一个id,与数据库中的主键对应
5>不能使用final修饰class
主键类型:
1>自然主键:刚好表中有一个唯一值,就不需要我们创建主键了例:身份证号码
2>代理主键(常见):表的业务中,没有某业务符合主键要求,我们自己创建一个id主键
主键生成策略:xxx.hbm.xml中的id标签下配置,常用配置native
1>自然主键(一种):assigned自然主键生成策略,hibernate不会管理,由开发人员自己录入
2>代理主键(七种):identity、sequence、increment、hilo、native、uuid、assigned
2.hibernate中对象的状态(划重点)
对象分为三种状态:向数据库中插入数据和修改数据都是由其他状态向持久化状态的改变
1>瞬时状态:没有id,与session没有连接,不在session缓存中
2>持久化状态:有id,与session有连接,在session缓存中,当实体类对象处于持久化状态在事务提交时会自动更新数据库中的数据可以不需要书写保存或更新语句
3>游离|托管状态:有id,与session没有连接,不在session缓存中
3.hibernate的一级缓存和快照(概念性了解)
缓存:提高效率,hibernate的一级缓存也是提高了数据库的效率,缓存是操作数据库就会产生的,而快照则是从数据库中查询数据才会产生
缓存好处:提高查询效率
快照好处:减少不必要的修改语句发送
4.hibernate中的事务(概念性了解)
事务:
1>事务的特性:a 原则性、c一致性 、i 隔离性、d 持久性
2>事务并发问题:1.脏读、2.不可重复读、3.幻|虚读
3>事务的隔离级别:读未提交-123、读已提交-23、可重复读(mysql默认级别)-3、串行化-没有问题
在hibernate中指定事务隔离级别:hibernate.cfg.xml中
在hibernate中使用事务(划重点)
业务开始前打开事务,业务执行完提交事务,执行出现异常回滚事务,web开发中都是在service中管理事务我们要确保service和dao使用的是同一个session(即当前线程绑定),使用getCurrentSession()方法
注意:
1>主配置文件hibernate.cfg.xml中需要配置thread
2>通过getCurrentSession方法获得的session对象,当前事务提交时session会自动关闭,不要手动关闭close()
5.hibernate中的批量查询(划重点)
HQL查询:不复杂的多表查询、Criteria查询:单表条件查询、原生SQL查询:复杂业务查询
HQL查询(不复杂的多表查询)
hql语句查询,没有用到数据库的任何表名、列名,使用的都是domain下的javabean类中的属性,属于面向对象的查询语言
1>基本查询
//1.书写hql语句
String hql = "from Customer";//查询所有对象,/String hql = " from cn.itheima.domain.Customer "
//2.根据hql语句创建查询对象
Query query = session.createQuery(hql);
//3.根据查询对象获得查询结果
List<Customer> list = query.list();//list:得到list集合结果,uniqueResult:得到唯一结果
2>条件查询
//问号占位符
//1.书写hql语句
String hql = "from Customer where cust_id=?";//查询所有对象,
//2.根据hql语句创建查询对象
Query query = session.createQuery(hql);
query.setParameter(0, 1);
//3.根据查询对象获得查询结果;
List<Customer> list = query.list();//list:得到list集合结果,uniqueResult:得到唯一结果
命名占位符 :命名
String hql = "from Customer where cust_id = :cust_id";
query.setParameter("cust_id", 1);
3>分页查询(query.setFirstResult(0);//设置起始索引----query.setMaxResults(2);//设置终点索引)
//1.书写hql语句
String hql = "from Customer";//查询所有对象,
//2.根据hql语句创建查询对象
Query query = session.createQuery(hql);
query.setFirstResult(0);//设置起始索引
query.setMaxResults(2);//设置终点索引
//3.根据查询对象获得查询结果;
List<Customer> list = query.list();//list:得到list集合结果,uniqueResult:得到唯一结果
Criteria查询(单表条件查询)
Criteria查询,hibernate的无语句面向对象查询
1>基本查询
//1.得到Criteria对象
Criteria criteria = session.createCriteria(Customer.class);//查询所有
//2.得到结果集
List<Customer> list = criteria.list();
2>条件查询
// > gt
// >= ge
// < lt
// <= le
// == eq
// != ne
// in in
// between and between
// like like
// is not null isNotNull
// is null isNull
// or or
// and and
//1.得到Criteria对象
Criteria criteria = session.createCriteria(Customer.class);//查询所有
//2.填充条件
Criteria add = criteria.add(Restrictions.eq("cust_name","张三"));
//3.得到结果集
Customer customer = (Customer) add.uniqueResult();
3>分页查询
//1.得到Criteria对象
Criteria criteria = session.createCriteria(Customer.class);//查询所有
//2.设置起始索引和查询条数
criteria.setFirstResult(0);
criteria.setMaxResults(2);
//3.得到结果集
List<Customer> list = criteria.list();
4>查询总条数
//1.得到Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//2.设置rowCount
criteria.setProjection(Projections.rowCount());
//3.得到结果count
Long cont = (Long) criteria.uniqueResult();
原生SQL查询(复杂业务查询)
1>基本查询
//1.书写sql语句
String sql = "select * from cst_customer";
//2.创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
//3.将结果封装到指定那个对象中
query.addEntity(Customer.class);
//4.得到结果集
List<Customer> list = query.list();
2>条件查询
//1.书写sql语句
String sql = "select * from cst_customer where cust_id=?";
//2.创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 1);
//3.将结果封装到指定那个对象中
query.addEntity(Customer.class);
//4.得到结果集
List<Customer> list = query.list();
3>分页查询
//1.书写sql语句
String sql = "select * from cst_customer limit ?,?";
//2.创建sql查询对象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 0);
query.setParameter(1, 2);
//3.将结果封装到指定那个对象中
query.addEntity(Customer.class);
//4.得到结果集
List<Customer> list = query.list();
总结:
一.hibernate中的实体创建规则
1>对象必须有oid.
2>对象中的属性,尽量使用包装类型
3>不使用final修饰类
4>提供get/set方法....
二.hibernate主键生成策略(7种)
increment: 查询最大值.再加1
identity: 主键自增.
sequence:Oracle使用的
hilo: hibernate自己实现自增算法
native: 根据所选数据库三选一
uuid: 随机字符串
assigned: 自然主键.
三.对象的三种状态
瞬时状态
没有id,没有在session缓存中.
持久化状态
有id,再session缓存中。
托管|游离状态
有id,不在session缓存中.
持久化: 持久化状态的对象,会在事务提交时,自动同步到数据库中.
我们使用hibernate的原则.就是将对象转换为持久化状态.
四.一级缓存
缓存: 为了提高效率.
一级缓存:为了提高效率.session对象中有一个可以存放对象的集合.
查询时: 第一次查询时.会将对象放入缓存.再次查询时,会返回缓存中的.不再查询数据库.
修改时: 会使用快照对比修改前和后对象的属性区别.只执行一次修改.
五.事务管理
1>如何配置数据库隔离级别
1 读未提交
2 读已提交
4 可重复读
8 串行化
2>指定session与当前线程绑定
hibernate.current_session_context_class thread
六.批量查询
HQL 面向对象的语句查询
Criteria 面向对象的无语句查询
SQL 原生SQL