Hibernate入门教程01

来源:互联网 发布:如何评价胡的政绩 知乎 编辑:程序博客网 时间:2024/05/21 08:45

        1、什么是Hibernate

          Hibernate是一个基于java的开放源代码的持久化中间件,它对JDBC做了轻量级的封装,不仅提供ORM映射服务,还提供数据查询和数据缓存功能,java开发人员可以方便地通过Hibernate API来操纵数据库。

       JavaEE EJB-->EJB容器-->JBOSS,Weblogic,WebSphere
      EJB有三种类型
            SessionBean(会话Bean),用于封装业务逻辑
            EntityBean(实体Bean),用于封装对数据库的操作
            MessageDrivenBean(消息驱动Bean),封装基于消息的处理机制

        2.什么是ORM技术,有何作用和优势

           Object-Relation-Mapping对象关系映射,用于实现对象和关系数据库之间的映射,当应用程序需要对数据库操作时,只需要对这些对象操作即可.
          常用的ORM技术有很多,例如
              1.Hibernate
              2.iBATIS
              3.JPA

              4.其他....... 

          3.第一个实例

                   步骤:

                    1、myeclipse新建java工程,在新建的工程上右击-->myeclipse-->Add Hibernate Capabilites...导入开发需的架包

                    2、导入mysql驱动包

                    3、将主配置文件hibernate.cfg.xml添加到src下

                         hibernate.cfg.xml文件配置如下:         

                                       

                             4、配置映射文件

                                     一般命名规则:类名.hbm.xml

                        <class name="tarena.hibernate.Dept" table="dept">
                        配置数据库表对应的实体类
                        1) 必须配置主键映射
                                     <id name="id" column="id" type="int">
                                            <generator class="identity" />
                                      </id>
                       2)普通字段映射配置
                                     <property name="name" column="dept_name"  type="java.lang.String" />

                               配置如下:


  

                              hibernate 数据访问 API
                ---------------------------------------------
          1. 加载这主配置文件,创建 SessionFactory
                SessionFactory f =
                      new Configuration().configure().buildSessionFactory();
          
          2. 打开连接(Session)
                Session session = f.openSession();
          
          3. 增删改查
                
                session.save(实体对象);                   插入数据
                session.get(实体类类对象, 主键值)       根据主键查询
                session.update(实体对象)                 修改数据
                session.delete(实体对象)                  根据对象内的主键值删除
                
          4. 事务 api
              增删改操作,必须启动事务
                
                Transaction t = session.beginTrancation();
                
                t.commit();
                t.rollback();
                
                
                // 获得之前启动过的 Transaction
                Transaction t = session.getTrancation();
          
      Session
      ------------------------------------------------------------
          * 一级缓存
          * 第一次查询一条数据时,会将查询到的对象,在内存中缓存
          * 再次查询同一条数据时,直接内存缓存获取数据
          
          * commit 事务时:
                1. 检查缓存内对象的数据,是否更改过
                      * 数据在一级缓存内,存在一个副本
                      * 数据与副本数据进行比对
                      
                2. 如果更改过,执行 update 语句,更新数据库中的数据
                3. commit
                4. 数据增删改的方法:
                        session.save(实体对象);
                        session.update(实体对象);
                        session.delete(实体对象);
                        
                        * 不会立即执行 sql 语句
                        * commit 时,才会执行
                        * commit 对之前执行的数据操作,会进行优化
                                * 会决定是否要执行一个 sql 语句
                                * 会决定sql语句执行的顺序
                
                5. commit 之前,先执行一些数据操作
                
                        session.flush()                        
           
          * 相同主键的数据,只能缓存一个对象
          
          * 清除一级缓存内的对象
                session.evict(实体对象);
                session.clear();  // 清空一级缓存

   

hibernate的一个工具包:HibernateUtil  

                 package tarena.hibernate;
                import org.hibernate.SessionFactory;
                import org.hibernate.cfg.Configuration;
                import org.hibernate.classic.Session;
                public class HibernateUtil {
                       private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
                       private static SessionFactory sessionFactory;    
               static{
                       sessionFactory  = new Configuration().configure().buildSessionFactory();
                }
                    public static SessionFactory getSessionFactory(){
                              return sessionFactory;
                }
                    public static Session getSession(){
                       Session session = threadLocal.get();
                        if(session == null){
                            session = sessionFactory.openSession();
                           threadLocal.set(session);
                   }
                     return session;
                  }
                public static void closeSession(){
                    Session session = threadLocal.get();
                        if(session == null) return;
                       session.close();
                     threadLocal.remove();
                      }
                   public static void begin(){
                     Session session = threadLocal.get();
                          if(session == null) return;
                       session.beginTransaction();
                      }
                    public static void commit(){
                        Session session = threadLocal.get();
                         if(session == null) return;
                         session.getTransaction().commit();
                     }
                   public static void rollback(){
                      Session session = threadLocal.get();
                         if(session == null) return;
                     session.getTransaction().rollback();
                           }
                      }