zoukankan      html  css  js  c++  java
  • Hibernate--Day01

    Hibernate是一个面向对象的持久化框架

    持久化:

    1,把内存中的Java对象保存到存储设备上面;

    2,最好的解诀方案:把对象持久化到数据库里面;

    3, 在Java里面,把对象持久化到数据库只能使用JDBC;

    框架:

    1,框架是一个半成品,是一个脚手架,它可以方便的,快速的辅助开发人员针对某一领域进行快速开发;

    2,使用框架,提高开发效率,减少重复代码,提高应用安全性,减少应用的bug;

    3,框架一定是按照开发人员告诉他的方式去运行,交流的工具就是框架的配置文件或者约定;

    框架怎么使用?

    1,框架一般有配置文件(如果没有配置文件,也有注解或者规定的一套约定),所以这些内容规定了开发人员和框架的交互;

    2,框架一定要通过某种方式启动;

    学习框架的误区:

    1,过于依赖记忆;

    2, 过于纠结于框架的细节使用方式;

    面向对象:

    一个面向对象的持久化框架,在代码当中一定不可能出现关系的概念;

    Hibernate的使用

     

    hibernate项目结构:

    1, documentation:hibernate的文档;

      1), quickstart:快速开发指南;

      2), manual :使用者手册(user gui de)

      3), devgui de:开发者指南

    2, lib: jar包

      1), required:hibernate使用必须的包

      2), optional :可选择的包:

      3), jpa:hibernate完成JPA规范的包

      4), envers:hibernate的一一个子项目; 

    3, project :hibernate项目相关的内容;

      1),包括了代码,测试代码

      2),包括了实例代码:

    Hibernate环境搭建:

    1,把所有required里面的jar包放到classpath中;

    2,把mysql驱动放到classpath中;

    hibermate的配置文件:

    <session-factory> :session-factory:暂时理解为一一个DataSource;

    <property>:配置sessi on-factory相关信息:

    1,连接信息

    connection driver_ class :驱动

    connection url :url

    connection userame:用户名

    connection password:密码

    2,其他信息

    dialect:数据库方言:方言在告诉hibermate我现在使用的是什么数据库,你需要生成什么样的SQL

    show_ sql :显示hibernate执行的SQL;

    <mapping>:引入对象的映射文件;

    hibernate的对象映射文件:
    1,映射文件一般起名:类名.hbm.xml;一般放在对应的类型同一个包中;
    2,hibernate-mapping.package:包名,
    3,class:配置一个类型的映射
      1),name:类型的名称;
      2),table:该类型对应的表名;
    4,id:配置主键
      1),name:在类型中哪个属性作为主键;
      2),column:在表中,哪个列作为主键;
      3),generator:配置主键的生成策略;告诉hibernate怎么去处理我们的主键,不同的主键生成策略对应着不同的SQL和不同的主键处理方式;
    5,property:配置属性映射
      1),name:属性的名称;
      2),column:属性对应列的名称;

    问题:
    1,去掉sessionfactory上的name属性,可以去掉启动时候的错误;
    2,可以通过配置show_sql来打印hibernate执行的SQL;
    3,配置数据库方言信息,方言在告诉hibernate我现在使用的是什么数据库,你需要生成什么样的SQL
    (方言信息屏蔽了数据库SQL的实现细节)
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    1,save方法的执行流程;


    2,get方法的执行流程;


    3,抽象HibernateUtil;

    //hibernate工具类
    public class HibernateUtil {
    
    	private static final HibernateUtil instance = new HibernateUtil();
    	
    	private SessionFactory sessionFactory;
    	
    	public HibernateUtil(){
    		//启动框架,读取配置文件
    		//Configuration:hibernate的配置对象;
    		//先创建一个配置对象,再调用configure方法执行配置;
    		//configure()方法实际上是调用了configure("/hibernate.hbm.xml");
    		Configuration cfg = new Configuration().configure();
    		//创建sessionFactory对象
    		//sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());
    		sessionFactory = cfg.buildSessionFactory();
    	}
    	
    	public static HibernateUtil getInstance(){
    		return instance;
    	}
    	
    	public Session openSession(){
    		return sessionFactory.openSession();
    	}
    }
    

      

    hibernate是一个ORM(对象-关系映射)框架;

    面向对象概念  ------- 关系模型


    类型                           表
    对象实例       表中的行
    属性         列
    hibernate的ORM主要体现在hbm.xml文件中;

    hibernate在我们应用当中的位置:

     

    Hibernate的主要对象

    Configuration:主要用来加载配置,解析配置;
    通过Configuration对象获取SessionFactory对象;
    1,Configuration对象提供了很多额外的通过API配置hibernate的方式;
    2,buildSessionFactory虽然已经过期了,但是仍然是使用最广泛的得到sessionfactory的方法(大家平时就用这个)
    3,新的sessionFactory方法:
    sessionFactory =cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());(不要求)

    sessionFactory:
    sessionFactory是一个线程安全的对象,所以,一般一个应用针对一个数据源只需要一个sessionfactory对象就可以了;
    sessionFactory是用来创建session对象的;
    openSession:开启一个全新的Session;
    1,全新的Connection对象;
    2,全新的事务;

    Session对象:

    session对象提供了对象持久化的各种方法:
    1,beginTransaction:开启一个事务;
    2,save(object):保存一个对象;
    3,get(Class,Serializable):根据主键加载一个指定类型的对象实例;
    4,update(object):修改一个对象,要求对象需要有id等值;
    5,delete(object):删除一个对象,要求对象必须有id;
    6,createQuery(String hql):创建一个查询对象;
    7,close():关闭一个session;
    8,session的生命周期有多长?session是线程不安全的,所以session的生命周期最长为一个线程;


    在web应用里面,一个session的生命周期有多长?一次请求;
    在Session对象上面有一个缓存;这个缓存在hibernate里面叫做一级缓存;
    一级缓存能够保证:
    1,在一个session中拿到的多个相同类型,相同id的对象实例是同一个实例;
    2,一级缓存的生命周期?和session相同;在web应用中,一级缓存的生命周期一次请求;
    3,一级缓存能够提高一定的性能,但是非常有限;
    4,一级缓存提供了对该session加载出来的对象的一个管理的区域;(session加载出来的对象都放在一级缓存里面进行管理)
    5,sessionFactory.openSession还代表开启一个全新的一级缓存空间;
    6,session.clear方法:清空一级缓存所有对象;
    7,session.evict(object)方法:从一级缓存中去掉一个指定的对象;

    Hibernate中session的作用如下图:

    Transaction对象:对事务的一个封装,事务的提交或者回滚由这个对象管理;

    session.getTransaction:得到当前会话上绑定的事务对象;
    session.beginTransaction:在标记当前session的事务正常开始了;
    transaction.isActive:判断当前事务是否是活动的;
    session.isOpen:判断当前session处于打开状态;

        @Test
        public void testTranscation() throws Exception {
            Employee e = new Employee();
            e.setName("Alice");
            e.setAge(11);
            
            Session session = null;
            
            try {
                session = HibernateUtil.getInstance().openSession();
                session.beginTransaction();//开启事务
                session.save(e);
                session.getTransaction().commit();
            } catch (HibernateException he) {
                //在Hibernate中所有JDBC相关异常都被封装成HibernateException
                he.printStackTrace();
                if(session != null && session.getTransaction().isActive()){
                    session.getTransaction().rollback();
                }
            } finally {
                if(session != null && session.isOpen()){
                    session.close();
                }
            }
        }

     

    Hibernate单对象的映射细节

    1,在一个映射文件中可以写多个实体的映射;但是必须在同一个包内;一般在开发中,还是一个实例对应一个映射文件;
    2,table和column属性都是可以省略的,
      1),如果省略table,就会使用类名作为表名;(注意大小写敏感问题)
      2),如果省略column,就会使用属性名称作为列名;
    3,id和property的name属性代表的是对象中的属性:
      1),hibernate什么时候用getter;getter方法返回的值就是要存到数据库中的值;
      2),hibernate什么时候用setter;setter方法传入的参数值,就是数据库中的值;
    4,hibernate不关心getter和setter方法的可见性;
    5,property和id上可以通过access属性来设置访问的方式,默认是property,可以设置为field,代表直接使用字段访问;
    6,type属性用于配置java类型到列类型的映射;
    7,在属性上面添加Insert=false,那么这个属性永远不会出现在insert语句中;
    8,在属性上面添加update=false,那么这个属性永远不会出现在update语句中;
    9,在class上面添加dynamic-insert=true,那么在insert的时候,只会insert这个类上不为空的属性;

    hibernate表的自动生成:

    #hibernate.hbm2ddl.auto create-drop

    在hibernate启动的时候,创建表,在hibernate正常关闭的时候删除表;

    1,删除那些表?创建那些表:hibernate只会去删除/创建这次让他管理的对象对应的表;

    2,如果新加一个domain会怎么处理:重新创建;

    3,如果删除一个domain会怎么处理:不管

    4,一定要正常关闭SessionFactory(正常的关闭hibernate),

    使用:一般不会使用create-drop;

    #hibernate.hbm2ddl.auto create

    在hibernate启动的时候,创建表;

    1,删除那些表?hibernate只会去删除/创建这次让他管理的对象对应的表;

    2,如果新加一个domain会怎么处理:重新创建

    3,如果删除一个domain会怎么处理:不管

    使用:

    1,一般我们程序员在做白盒测试的时候,会使用create;(每次测试的主键都是从1 开始)

    2,在测试的时候,注意使用@Before标签;

    #hibernate.hbm2ddl.auto update

    在hibernate启动的时候,去检查并修改表结构;

    1,检查并修改那些表?这次让hibernate管理的对象对应的表;

    2,如果表已经存在,怎么处理?检查这个表,如果有变化,尝试做适当的修改;

    3,如果表不存在,怎么处理:创建表;

    4,如果对象的结构有变化,怎么更新

       1,添加一个属性:在表里面增加一列;

       2,删除一个属性:不管;

          3,修改一个属性:尝试去修改这个列的类型;如果修改不成功,hibernate会在启动的时候给一个警告;

    使用:

    1,一般在黑盒测试的时候使用update;

    2,注意,一定不要在生产环境中使用update;

    #hibernate.hbm2ddl.auto validate

    在hibernate启动的时候,去检查表结构;

    如果检查发现表结构不对,怎么处理;hibernate不能正常启动;

    在生产环境一般使用validate去检查数据库版本和代码版本是否一致;

    #hibernate.hbm2ddl.auto none:就是什么都不管;

  • 相关阅读:
    andorid jar/库源码解析之Butterknife
    JavaScript DOM 鼠标拖拽
    JavaScript JSON 与 AJAX
    JavaScript DOM 事件模型
    JavaScript DOM 样式操作
    JavaScript DOM 常用尺寸
    JavaScript 日期与计时器
    JavaScript DOM 基础
    JavaScript 数组
    JavaScript 对象拷贝
  • 原文地址:https://www.cnblogs.com/Java0120/p/9784330.html
Copyright © 2011-2022 走看看