Hibernate-02

一、hibernate实体创建规则

1、hibernate---->持久层ORM 映射框架,专注于数据的持久化工作。

2、持久化类创建规则

  --->1、提供无参数的构造方法

     2、私有化、对石油的属性提供get、set方法

     3、尽力提供包装类的类型 

     4、持久化类需要提供oid.与数据库中的主键列对应

     5、hibernate使用cglib代理生成代理对象.代理对象是继承被代理对象.如果被final修饰.将无法生成代理. 

3、主键类型

1、自然主键:把含有业务含义的字段作为主键(非空,不能重复、不可修改)

     2、代理主键:不具备业务含义的字段作为主键

4 主键策略

     1、identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.

        --->native:hilo+sequence+identity 自动三选一策略.

        --->sequence: Oracle中的主键生成策略.

     2、assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.

 

  

二、hibernate对象状态


 

三、hibernate 事务

1、特性
    a :原子性
    c :一致性
    i :
隔离性
    d: 持久性
2、事务并发问题
    脏读、不可重复读、幻读|虚读
3、事务隔离级别
注意:数据库使用时,隔离级别越高,安全性越高,性能就越低。
    建议:READ_COMMITTED ----->oracle(默认)
       REPEATABLE_EAD ----->mysql(默认)


 

四、hibernate 一级缓存

1、目的:
    缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
2、方案一
3、方案二

 

五、查询

HQL查询:
  1、Hibernate独家查询语言,属于面向对象的查询语言
  2、简单查询
    String hql = "from cn.xxx.xxx.User";
    //String hql = "from User";
    Query query = session.createQuery(hql);//传入hql
    List<Customer> Lists = query.list(); //接收list返回结果
    接收唯一查询结果-----》 query.uniquerResult();
  3、条件查询
     占位符 ? or :属性名 :
    1--> String hql1 = "from User where id = ?";
       Query query = session.createQuery(hql1);
        query.setParameter(0,2);//设置参数
        User c = (User)query.uniqueResult();//获取结果
    2--> String hql2 = "from User where id=:id";
        Qusery query = session.createQuery(hql2);
        query.setParameter(0,1);
        User c = (User)query.uniqueResult();
  4、分页查询
      1 -->SetFirstResult(1); 起始位
       -->setMaxResults(2);  可以理解为最大步长
      2---->基本和上面步骤一致为query 设置这两个属性就行啦  
Criteria:
  1、Hibernate独家的无语句面向对象查询(建议不要使用sql的查询相关的信息 )
  2、
    1--->简单
      Critera critera = session.createCriteria(User.class);创建查询语句
      List<User> list = critera.list();//获取对象
    2
--->条件
      在条件查询中可以使用的Restriction的方法
        
            

      Criteria critera = session.createCriteria(User.class);
      critera.add(Restriction.eq("id",1l));//查询id为1
      User c = (User)criteria.uniqueResult();
      
  3--->分页 :分页同样也是调用hql中的那两个方法名
    4--->查询总数:采用这个方法setProjection

criteria.setProjection(Projections.rowCuount());

原生查询:就是使用原生的sql查询,建议在复杂查询的时候使用他不建议使用hql 和 Criteria
简单查询1:
public void fun(){
  //获取session对象
  Session session = HibernateUtis.openSession();
  //事务控制
  Transction tx = session.beginTransction();
  //编写执行sql
  String sql = "select * from user";
  //创建查询对象
  SQLQuery query = session.createSQLQuery(sql);
  //run ----》query 方法
  List<Object[]> list = query.list(); // 返回的是数组list
  for(Object[] obj: list){        //遍历数组list
    Syso(Arrays.toString(obj));//此处简写
  }
}

 简单查询2:

String sql = "select * from user";
SQLQuery  query = createSQLQuery(sql);
query.andEntity(User.class);
List<User> list = query.list();//返回对象list
System.out.println(list);

分页查询:

//此处省略部分代码

String sql = "select * from user limit ?,?";

SQLQuery query = session.createSQLQuery(sql);

query.setParameter(0,0);
query.setParameter(1,1);

query.addEntity(User.class);

List<User> list = query.list();

System.out.println(list);

条件查询:

String sql = "select * from User where id = ?";
//创建查询对象
SQLQuery query = session.createSQLQuery(sql);
//设置参数
query.setParameter(0,11);
//指定结果集封装对象
query.addEntity(User.class);
//调用方法
List<user> list = query.list();

Sysout.out.println(list);

 

posted @ 2018-10-28 10:53  Lve_s  阅读(232)  评论(0编辑  收藏  举报