zoukankan      html  css  js  c++  java
  • 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+"	");
                }
                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原生查询:复杂的业务查询

  • 相关阅读:
    5月7号 跨页面传值
    实体类、数据访问类、属性扩展
    完整修改删除,防止数据库字符串攻击
    ADO.NET 增、删、改、查
    类库、委托、is as运算符、泛型集合
    抽象类、接口
    多态、虚方法、重写
    访问修饰符、封装、继承
    面向对象基础知识
    Java Script 练习题
  • 原文地址:https://www.cnblogs.com/littlepage/p/10701243.html
Copyright © 2011-2022 走看看