1. hibernate的作用及优缺点

    1. hibernate是一个对象关系映射框架,他是对JDBC进行了轻量级的对象封装,使得程序员可以使用面相对象的思维来操作数据库,把以往的操作数据库记录换成操作对象,还实现了对象的持久化

    2. 优点

      1. hibernate使用反射机制而不是字节码增强程序来实现透明性

      2. hibernate的性能非常好,因为他是一个轻量级框架,映射灵活

      3. 他支持各种关系的数据库,从一对一到多对多的各种复杂关系

    3. 缺点:

      1. 大量的多表,复杂的查询级联关系难以驾驭,对于复杂的查询需要配置的比较多,效率还不高(不过他提供了HQL语句也可)

      2. 而且对数据库的要求高

  2. ORM - Hibernate设计原理

    1. hibernate框架是以款ORM工具,依据ORM设计思想开发出来的

    2. Object--Relation--Mapping 对象是java的entity,关系是关系数据库,思想就是将程序中的对象和数据库表实现自动映射,利用ORM工具在查询的时候返回的就是对象,在更新、插入的时候也会将对象自动写入到数据库表,hibernate就是封装了SQL+JDBC操作细节

    3. 类似的框架还有JPA,ibatiS

  3. hibernate 核心API

    1. org.hibernate.cfg.Configuration类

    2. 作用:配置并启动Hibernate,读取配置文件、读取映射文件,创建单实例的SessionFactory(一个数据库一个SessionFactory)

      1. configure():加载hibernate.cfg.xml配置文件并且解析处理【Configuration cfg = new Configuration().configure(); 先调用无参数的构造:

        public Configuration() {

               this(new SettingsFactory());//创建SessionFactory

        }

        然后调用:

        protected Configuration(SettingsFactory settingsFactory) {

               System.out.println("Configuration(SettingsFactory settingsFactory)");

               this.settingsFactory = settingsFactory;

               reset();//初始化很多变量

           }

        然后调用configure()

        public Configuration configure() throws HibernateException {

               configure("/hibernate.cfg.xml");//加载hibernate主配置文件

               return this;

        }

        默认是调用的hibernate.cfg.xml文件,如果想调用自定义的文件可以调用如下方法:

        public Configuration configure(String resource) throws HibernateException {

               log.debug("configuring from resource: " + resource);

               InputStream stream = getConfigurationInputStream(resource);

               return doConfigure(stream, resource);

        }

        根据getConfigurationInputStream(resource)得到文件流,getConfigurationInputStream(resource)调用ConfigHelper.getResourceAsStream(resource)

        public static InputStream getResourceAsStream(String resource) {

                     String stripped = resource.startsWith("/") ?

                                   resource.substring(1) : resource;

                     InputStream stream = null;

                     ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

                     if (classLoader!=null) {

                            stream = classLoader.getResourceAsStream( stripped );

                     }//加载文件dom4j解析文件


      2. buildSessionFactory():创建SessionFactory

      3. setProperty(String key,Object value):通过代码给hibernate设置属性

        这里的设置参数和一般的在hibernate配置文件里配置效果是一样的
        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        configuration.setProperty("hibernate.connection.url", myConnectionUrl);
        configuration.setProperty("key", value);
        sessionFactory = configuration.buildSessionFactory();
        Session s = sessionFactory.openSession();
        Transaction tx =session.beginTransaction();
    3. org.hibernate.SessionFactory接口

      作用:初始化Hibernate,负责创建Session,使用了工厂模式

      Configuration config = new Configuration();
      config.configure();
      SessionFactory sessionFactory = config.builSessionFactory();
      1. SessionFactory是线程安全的,一个数据对应一个Sessionfactory,生命周期长,一般在整个生命周期中有效;

      2. Sessionfactory缓存了生成的SQL和数据库连接的相关信息(url,user,password)和映射信息,以及hibernate运行时要用到的一些信息

      3. openSession():创建数据库连接,并且返回一个Session
      4. getCurrentSession():获得当前线程的Session
      注意:以上3和4的区别:
             1.getCurrentSession创建的session会和当前线程绑定在一起,而openSession不会
             2.getCurrentSession创建的事物会在事物回滚或者事物提交的时候自动关闭session而openSession需要手动关闭
    4. org.hibernate.Session接口

      作用:执行对象持久化对象的CRUD操作

           Session 也称为持久化器,Session是非线程安全的,生命周期短,代表程序和数据库的一次连接,如果session长时间打开,会长时间占用内存和数据库连接;

           获取Session对象后,Hibernate内部并不会获取操作数据库的Connection对象,而是等Session对象真正需要对数据库进行CRUD等操作时,才会从数据库连接池中获取Connection对象;

           关闭Session对象时,则是将Connection对象返回到连接池中,而不是关闭Connection对象

           每个session对象内部都有一个缓存,他存放当前工作单元中加载的对象,session缓存被称为hibernate的一级缓存,sessionFactory缓存被称为hibernate的二级缓存,这两个缓存都位于持久层,他们存放的都是数据库数据的拷贝,sessionFactory的内置缓存存放元数据和预定义SQL,sessionFactory内置缓存是只读缓存

           Hibernate缓存的三大优点:

           1.减少数据库的访问频率,提高访问性能

           2.保证缓存中的对象与数据库同步,位于缓存中的对象在事物提交的时候会自动同步到数据库

           3.当持久化对象之间在关联时Session保证不出现对象图的死锁

           4.Session如何判断持久化对象的状态的改变呢?

               Session加载对象后为对象值类型的属性复制一份快照,当Session清理缓存时,比较当前对象和他的快照就可以知道哪些属性发生了变化;

           5.session什么时候清理缓存?

               (1)commit()方法被调用时

               (2)查询时会清理缓存,保证查询结果能反映对象的最新状态

               (3)显示的调用session的flsh()方法

               当对象使用native生成器时会立刻清理缓存想数据库中插入记录

      1. beginTransaction():开始一个事物,并且返回一个事物实例

      2. save(Object):用于保存持对象,并保存数据的方法;执行save方法之后并不会立即操作数据库来进行保存数据,而是在事物提交的时候才会保存数据;

      3. persist(Object):

      4. saveOrUpdate(Object):创建或更新一条记

      5. merge(Object):

      6. get(Class,Serializable):根据id(主键)查询某个类型的对象

      7. load(Object,Serializable):根据id查询,查询返回的是一个代理对象,不会立刻访问数据库,而是延迟加载的,当真的调用到这个对象的属性或方法的时候才会查询数据库

      8. 以上两者的区别:load()和get()在未找到符合条件的持久化对象的时候,load()会抛出一个异常,而get()方法会返回null;另外两者对缓存对象的读取也不同,load()方法会先从hibernate的一级缓存中查找符合条件的对象,找不到的话就去hibernate的二级缓存中去查找对象,仍未找到的话才会去数据库中去查找,但是get方法不会去查找hibernate的二级缓存;

      9. delete(Object):删除记录

      10. flush():把以及缓存和数据库同步

      11. clear():清空Sessiono,清除所有保存在当前session缓存中的实体对象,终止所有正在执行的方法(eg:save,updae,delete)

      12. createSQLQuery(“select * from tablename”):执行纯sql语句的查询,Hibernate中不建议使用SQL查询

      13. getNameQuery(“名字”):命名查询,查询语句配置在hbm.xml配置文件中

    1. org.hibernate.Transaction接口

    2. 作用:负责事物的操作

      commit():事物提交

      rollback():事物回滚

    3. org.hibernate.Query接口

    4. 作用:Query可以使用HQL语言查询数据库

      1. list():返回查询结果集

      2. uniqueResult():查询唯一的结果,返回结果是Object

      3. executeUpdate():批量更新

      4. setFirst(int):设置分页时开始的位置,从0开始

      5. setMaxResult(int):设置一次抓取多少条

    5. org.hibernate.Criteria接口

      作用:条件擦汗下,比Query更加面向对象

    6. org.hibernate.criterion.Restrictions类

    7. org.hibernate.StatelessSession接口

    8. 无状态session,不和一级缓存、二级缓存打交道,通过使用该接口会把数据立刻写到数据库

      StatelessSession s = sessionFactory.openStatelessSession();

  4. hibernate框架的基本特性


  5. hibernate关系映射

  6. hibernate关联操作

  7. hibernate查询

  8. hibernate高级特性

  9. 主键生成策略