Hibernate注意项
Hibernate实体规则
1.持久化类提供无参数构造
2.成员变量私有,提供getset访问,提供实行
3.持久化类属性,尽量使用包装类型
4.持久化类需要提供oid与数据库中的主键列对应
5.不要使用final修饰class
实体类创建的注意事项
主键类型:
自然主键(少见):表的业务列中,有某项业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用
代理主键(常见):创建一个无意义的列作为主键
主键生成策略:
<!-- generator 主键生成策略 identity:主键自增,由数据库来维护主键值,录入时不需要指定主键 increment(不用):主键自增,由hibernate来维护,每次插入会先查询表中最大值,+1做为主键值(多人同时插入时会导致数据丢失) sequence:Oracle中的主键生成策略 hilo:高低位算法,数据库属性自增的算法,由hibernate来维护,与increment不一样,这个hilo算法能够保证数据库主键永远不一样
native:hilo+sequence+identity三选一策略,检测到非oracle支持主键自增,那选择identity,检测到是oracle,选择sequence
自增的方法,hilo遇到不支持自增不支持sequence,市面目前没有这种数据库uuid:产生一个随机字符串作为主键
-->
<generator class="native">
</generator>
对象状态:
对象分为三种状态:
瞬时状态:没有id,没有与session关联
持久化状态:有id,与session有关联
托管状态:有id,没有与session关联
package com.littlepage.state; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.littlepage.entity.Customer; public class Demo { public static void main(String[] args) { Configuration conf=new Configuration().configure(); SessionFactory sf=conf.buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); Customer cus=new Customer();//没有id,没有与session关联=瞬时状态 cus.setName("Poly");//瞬时 cus.setAge(15); session.save(cus);//持久化状态 tx.commit(); session.close();//游离状态 sf.close(); } }
瞬时-->持久化-->托管
状态流程
进阶-一级缓存:
一级缓存提高数据库操作的效率。
缓存:暂时存储在内存上。第一次接触是在IO流里面,缓存的目的是为了提高效率。(预加载)
HQL查询语句:
Configuration conf=new Configuration().configure(); SessionFactory sf=conf.buildSessionFactory(); Session session=sf.openSession(); Transaction tx=session.beginTransaction(); //1.书写HQL语句 String hql="from Customer where age=15";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //3.返回list结果 List<Customer> list=query.list(); for (Customer customer : list) { System.out.println(customer); } tx.commit(); session.close();//游离状态 sf.close();
?占位符查询
//1.书写HQL语句 String hql="from Customer where age=?";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置参数 query.setInteger(0, 15);
命名占位符查询
//1.书写HQL语句 String hql="from Customer where age=:age";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置参数 query.setParameter("age", 15);
分页查询
//1.书写HQL语句 String hql="from Customer";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置分页信息 query.setFirstResult(3);//起始值索引 query.setMaxResults(2);//每页的多少
Criteria查询 Criteria criteria=session.createCriteria(Customer.class); List<Customer> list=criteria.list(); for (Customer customer : list) { System.out.println(customer); }
约束条件 Criteria criteria=session.createCriteria(Customer.class); criteria.add(Restrictions.eq("age", 12)); List<Customer> list=criteria.list(); for (Customer customer : list) { System.out.println(customer); }
聚合函数查询
Criteria criteria=session.createCriteria(Customer.class); criteria.setProjection(Projections.rowCount()); Long count=(Long)criteria.uniqueResult(); System.out.println(count);
//原生SQL查询 String sql="select * from t_customer"; SQLQuery query=session.createSQLQuery(sql); List<Object[]> list = query.list(); for (Object[] objects : list) { for (Object objects2 : objects) { System.out.print(objects2+"\t"); } System.out.println(); }
//原生SQL查询2 String sql="select * from t_customer"; SQLQuery query=session.createSQLQuery(sql); query.addEntity(Customer.class); List<Customer> list=query.list(); for (Customer customer : list) { System.out.println(customer); }
分别在什么情况下进行使用
HQL查询:查询多表查询,不是复杂多表使用
Creteria查询:单表查询
SQL原生查询:复杂的业务查询