框架之Hibernate(一)

一.Hibernate
    1.Hibernate是一个轻量级的JavaEE应用的持久层框架,它用于实现DAO,是一个关系型数据库ORM框架
    2.ORM(Object Relational Mapping):对象关系映射,ORM就是通过java对象映射到数据库表(二维关系表),通过操作java对象,就可以完成对数据库表的操作.
    3.Hibernate就是让程序员通过操作对象的方式来操作数据库中的表.
    4.POJO(Plain Ordinary Java Object)简单的java对象,定义了属性及其getter和setter方法,没有业务逻辑.
    5.编写hbm映射文件,通常一个表对应一个hbm映射文件,hbm文件中定义了POJO类和表的映射关系.
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.zjl.domain">
  6. <class name="CstCustomer" table="cst_customer">
  7. <id name="custId" column="cust_id">
  8. <generator class="native"></generator>
  9. </id>
  10. <property name="custName" column="cust_name"></property>
  11. <property name="custSource" column="cust_source"></property>
  12. <property name="custIndustry" column="cust_industry"></property>
  13. <property name="custLevel" column="cust_level"></property>
  14. <property name="custAddress" column="cust_address"></property>
  15. <property name="custZip" column="cust_zip"></property>
  16. <property name="custPhone" column="cust_phone"></property>
  17. <property name="custFax" column="cust_fax"></property>
  18. <property name="custWebsite" column="cust_website"></property>
  19. <property name="custCorporation" column="cust_corporation"></property>
  20. <property name="custMemo" column="cust_memo"></property>
  21. </class>
  22. </hibernate-mapping>
    6.编写主配置文件:hibernate.cfg.xml
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!-- 第一部分:数据库基本配置 -->
  8. <property name="hibernate.connection.driver_class">
  9. com.mysql.jdbc.Driver
  10. </property>
  11. <property name="hibernate.connection.url">
  12. jdbc:mysql://localhost:3306/crm_hibernate_test
  13. </property>
  14. <property name="hibernate.connection.username">root</property>
  15. <property name="hibernate.connection.password">1234</property>
  16. <!-- 配置数据库方言 -->
  17. <property name="hibernate.dialect">
  18. org.hibernate.dialect.MySQLDialect
  19. </property>
  20. <!--第二部分: hibernate基本配置 -->
  21. <property name="hibernate.show_sql">true</property>
  22. <property name="hibernate.format_sql">true</property>
  23. <!-- 自动生成DDL
  24. 根据映射产生表结构的类型:
  25. create-drop:没有表结构创建,下次启动时删除重新创建。适合学习阶段
  26. create:只做创建
  27. update:探测表结构够的变化,对于数据库没有的,进行更新操作。适合学习阶段
  28. validate:对比与数据库的结构
  29. none:什么都不会做
  30. 数据库必须自己手动创建,hibernate不会创建 -->
  31. <property name="hibernate.hbm2ddl.auto">none</property>
  32. <!--第三部分:映射配置 -->
  33. <mapping resource="com/zjl/domain/CstCustomer.hbm.xml"/>
  34. </session-factory>
  35. </hibernate-configuration>
二.XML文件的配置方式
    1.连接数据库的基本信息与方言
         *hibernate.dialect   ---配置数据库的方言
         *hibernate.connection.driver_class  --连接数据库的驱动程序
         *hibernate connection.url   --连接数据库的URL
         *hibernate.connection.username   ---连接数据库的用户名
         *hibernate connection password    ---连接数据库的密码
    2.可选属性
         *hibernate.show_sql   --控制台上输出sql语句
         *hibernate.format_sql   --格式化控制台上输出的sql 语句
         *hibernate hbm2ddl.auto  --生成DDL的策略
              *create   --每次都会创建一个新的表(测试的时候)
              *create-drop   --每次都会创建一个新的表,每次执行结束的时候,就会把这个表删除(测试的时候);
              *update    --如果没有表,就会创建一个新表,如果有了表,就会更新表结构,
              *validate         --校验映射和表中的字段是否一致,如果不一致就会报错
         (实际开发中用update 和 validate )
    3.映射文件的加载:
         *<mapping resource="映射文价的路径"/>
三.加载配置文件/获取工厂类和session类
    1.加载配置文件
         Configuration cfg = new Configuration();   cfg.configure();
    2.生成工厂类:SessionFactory factory = cfg.buildSessionFactory();
    3.生成session:Session session = factory.getSession();
    4.开启事务:  Transaction tran = session.beginTransaction();
四.Hibernate的执行流程:
    

五.Hibernate相关API
    1.Configuration:配置对象,用来加载配置文件
         *作用:用来加载配置文件,默然只会加载类的根路径下的配置文件
         *常用方法:
              *默认构造方法:默认只会加载类的根路径下的hibernate.properties文件,不会加载xml文件.
              *configure:该方法会加载类的根路径下的hibernate.cfg.xml配置文件
              *addClass:手动指定类的字节码文件,目的也是指定映射文件
              *手动指定映射文件的位置
         要求:映射文件命名必须符合规范:实体类名称.hbm.xml
    2.SessionFactory类
         *作用;就是用来生产session对象的,SessionFactory的是由configuration来生成的
         *常用方法:
              *openSession():每次打开一个新的session对象
              *openCurrentSession():从当前线程上获取一个session对象
         *说明:
              *该对象维护着应用中所有的映射文件信息;
              *它还维护了一些预定义的SQL语句,(全字段插入,全字段更新,根据id查询,查询所有)
              *维护着连接数据库的信息,hibernate的基本配置
              *维护着hibernate中的二级缓存
              *所有由该工厂生产的session,共享工厂中的数据
         * .SessionFactory是线程安全的,
          *.使用原则:
               hibernate是一个重量级的对象,里面维护了很多信息,不应该随意的创建和销毁,一个应用最好只有一个SessionFactory
    3.Session连接对象
         *作用:对数据库进行增删改查和开启事务的操作,是我们使用频率最高的一个对象
         *常用方法:
              *save()   --保存一个对象
              *persist()  --保存一个对象,是由JPA提供,
              *update()   --更新一个对象
              *saveOrUpdate()  --保存或者更新一个对象
              *delete()   --删除一个对象
              *merge()   --合并两个对象
              *get()/load()  --根据主键查询
              *createQuery()   --  HQL查询
              *createSQLQuery()   --数据库操作对象
              *createCriteria()   --条件查询
              *close()  --关闭连接
              *clear()  --清除以及缓存
              *evict(Object entity)   --清除以及缓存中的指定对象
              *refresh(Object entity)  --使用数据库中的数据更新以及缓存中指定的实体
              *flush()  --清除一级缓存,并用缓存中的数据去更新数据库中的数据
         *session使用原则:保证一个线程只有一个session
         *说明:
              *session对象是一个轻量级的,绝大多数信息是由SessionFactory来维护的,
              *它的创建和销毁不会消耗太多的资源
              *session对象不是线程安全的
              *session维护者hibernate中的一级缓存
    4.Transaction:事务
         *作用:针对事务的控制
         *常用方法:
              *commit()  --提交事务
              *rollback()  --回滚事务
         *hibernate的事务是默认不自动提交的
    5.Query:查询
    
  
  
  1. Query执行HQL语句:
  2. // 1.查询所有记录
  3. /*Query query = session.createQuery("from CstCustomer");
  4. List<Customer> list = query.list();
  5. System.out.println(list);*/
  6. // 2.条件查询:
  7. /*Query query = session.createQuery("from Customer where custName = ?");
  8. query.setString(0, "小郑");
  9. List<Customer> list = query.list();
  10. System.out.println(list);*/
  11. // 3.条件查询:
  12. /*Query query = session.createQuery("from Customer where custName = : custName and age = :custAge");
  13. query.setString("custName", "小郑");
  14. query.setInteger("custAge", 25);
  15. List<Customer> list = query.list();
  16. System.out.println(list);*/
  17. // 4.分页查询:
  18. Query query = session.createQuery("from Customer");
  19. query.setFirstResult(3);
  20. query.setMaxResults(3);
  21. List<Customer> list = query.list();
  22. System.out.println(list);
六.知识点
    1.实体类 不要用 final 修饰 , 如果将实体类   final 修饰将无法生成代理对象
  2.hibernate中的OID:
       在hibernate中区分两个对象是不是同一个:靠的是对象唯一标示符(OID)
  3.主键生成策略:
    *自然主键:具有业务含义的字段作为主键
    *代理主键:不具有业务含义的字段作为主键
七.一级缓存
    1.hibernate框架中共有两级缓存:Session级别的缓存属于一级缓存,SessionFactory级别的缓存是二级缓存
    2.缓存:就是将数据库或者硬盘中的数据存入到内存中,当下次使用的时候可以从内存中获取,减少对数据库的访问次数.(在优化方面)
    3.快照机制:在事务提交的时候,执行快照机制,用缓存和快照进行比较,如果不一致,使用缓存更新数据库中的数据,同时刷新缓存和快照, 保证数据库中的数据和一级缓存中的数据一致
八.持久化对象的四中状态:
    1.瞬时状态(Transient)   持久状态(Persistent)   脱管状态(Detached)  删除状态(Delete)
    

    2.常说的hibernate的三种状态
         *临时状态:用new语句创建     ,标识:OID为null,没有和session建立关系
         *持久化状态:标识:OID不为null,建立了和session的关系
         *脱管状态:OID不为null,没有和session建立关系
    3.Session对象的生命周期与本地线程的绑定
         在hibernate.hbm.xml中配置:
         <property name="hibernate.current_session_context_class">thread</property>
         *hibernate中提供sessionFactory.getCurrentSession()创建一个session和threadLocal绑定方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿人小郑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值