zoukankan      html  css  js  c++  java
  • Hibernate学习(一)

    一、什么是Hibernate?

      Hibernate是一个轻量级的ORMapping框架
      ORMapping原理(Object Relational Mapping
    ORMapping基本对应规则:
    1:类跟表相对应
    2:类的属性跟表的字段相对应
    3:类的实例与表中具体的一条记录相对应
    4:一个类可以对应多个表,一个表也可以对应对个类
    5:DB中的表可以没有主键,但是Object中必须设置主键字段
    6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系
    7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样

    二、Hibernate能干什么:

        Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。
    Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。
        Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。

    (三)Hibernate中的对象

    SessionFactory (org.hibernate.SessionFactory)
    针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成的工厂,本身要用到。
    Session (org.hibernate.Session)
    表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了连接,也是的工厂。
    Transaction (org.hibernate.Transaction)
    应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的、以及事务隔离开。
    ConnectionProvider (org.hibernate.connection.ConnectionProvider)
    生成连接的工厂(有连接池的作用)。它通过抽象将应用从底层的或隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
    TransactionFactory (org.hibernate.TransactionFactory)
    生成对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。
    示例如下:
    数据库表:Student.sql
    create table student (
     studo  varchar2(20),
     stuname varchar2(20),
     STUPASS varchar2(20),
     STUSEX  VARCHAR2(2),
     MOBILE  VARCHAR2(2),
     EMAIL   VARCHAR2(20), 
     ADDRESS VARCHAR2(50), 
     STUAGE  NUMBER
    );

    配置文件:hibernate.cfg.xml   注意配置文件要写在src下  否则会加载不到

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
         <session-factory>
                <!-- 数据库URL -->
                <property name = "connection.url">jdbc:oracle:thin:@10.103.1.204:1521:orcl</property>
                <!-- jdbc驱动 -->
                <property name ="conneciton.driver_class">oracle.jdbc.driver.OracleDriver</property>
                <!-- 账号 -->
                <property name = "connection.username">ybt</property>
                <!-- 密码 -->
                <property name = "connection.password">ybt!123</property>
                <!-- 每个数据库都有对应的Dialect以匹配其平台特性 -->
                <property name  = "dialect">org.hibernate.dialect.Oracle10gDialect</property>
                <!-- 指定当前session范围和上下文 -->
                <property name = "current_session_context_class">thread</property>
                <!-- 指定运行期生成的SQL输出到日志以供调试 -->
                <property name = "show_sql">true</property>
                <!-- 是否格式化SQL -->
                <property name = "format_sql">true</property>
                <!-- 映射文件 -->
                <mapping resource="student.hbm.xml" />
         </session-factory>
    </hibernate-configuration>

    映射文件:Student.hbm.xml

    ?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
            <class name ="entity.student"  table ="STUDENT">
             <id name = "studo" type = "java.lang.String" column = "studo">
              <!--generator的class类型
                    assigned:主键的状态 assigned表示程序生成
                    sequence:Oracle中的序列
                    identity:Sql中的自动编号
                    increment:先查询最大的编号再增1
                    uuid:生成32位长的字符串
                    native:根据数据库自动生成
                 -->
               <generator class="assigned"/>
             </id>
               <!-- 直接使用property属性设置 -->
             <property name = "stuname"  type = "java.lang.String" column="stuname" length="50" not-null="true"/>
             <property name="stupass" type ="java.lang.String" column ="STUPASS">
             <!-- 使用column设置 -->
             <!--测试发现colum在上层元素使用之后再使用会报错
             <column name="STUPASS" length="50" not-null="true"/> -->
             </property>
             <property name="stusex" type ="java.lang.String" column ="STUSEX"/>
             <property name="stuage" type ="java.lang.Integer" column ="STUAGE"/>
             <property name="mobile" type ="java.lang.String" column ="MOBILE"/>
             <property name="email"  type ="java.lang.String" column ="EMAIL"/>
             <property name="address" type ="java.lang.String" column ="ADDRESS"/>  
            </class>    
    </hibernate-mapping>

    java代码:StudentService.java

    /**
     * @author Administrator
     *
     */
    package entity.dao;
    
    import java.util.List;
    
    import javax.transaction.HeuristicMixedException;
    import javax.transaction.HeuristicRollbackException;
    import javax.transaction.RollbackException;
    import javax.transaction.SystemException;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    
    import entity.student;
    
    public class  studentService{
        
        private static Configuration conf; 
        private static SessionFactory sf; 
        private static Transaction tx;  
        
     static{
         try{
             /**
              * Configuration()的configure()方法会默认在classpath下寻找hibernate.cnf.xml
              * 如果没有找到该文件,系统会打印如下信息并抛出HibernateException异常
              * 其实不使用configure()方法也可以Configuration cfg =new Configuration();
              * 这时hibernate会在classpath下面寻找hibernate.properties文件
              * 如果没有找到该文件,系统会打印如下信息并抛出HibernateException异常。
              * 使用hibernate.properties配置连接数据库时,
              * 还需要使用cfg.addClass()方法,把pojo类加载进来。
              */
             conf = new Configuration().configure();         //实例化hibernate.cnf.xml的配置
             sf = conf.buildSessionFactory();             ////实例化一个session工程对象
             
         } catch(HibernateException e){
           e.printStackTrace();
     }
    }
     public static Session getSession(){
         return sf.openSession(); //过去老的方法,不需要使用事务
       //return sf.getCurrentSession();// 新的方法,需要和事务一起使用,可以保证每个用户创建的session独立,需要在配置文件中配置 
         //<property name="current_session_context_class">thread</property>
     }
     
     /**
      * 获取所有学生列表
      * @return
      */
     public List GetAllStudent(){
         List list = null;
         Session session = getSession();
         if(session != null){
             try{
                String hql = "from student";
                Query query = session.createQuery(hql);
                list = query.list();
             }catch(HibernateException e){
                 e.printStackTrace();
             }finally{
                 session.close();
             }
         }
        return list; 
     }
     
     /**
      * 获取单个学生信息
      * @param studo
      * @return
      */
       public student GetStudentBystudo(String studo){
        student stu = null;
        Session session = getSession();
        if(session != null){
            try{
            // get如果没有查询到数据,则返回null
            // stu = (Student) session.get(Student.class, stuNo);
            stu = (student) session.load(student.class, studo);// load如果没有查询到数据,则抛出异常
            
            }catch(HibernateException e){
                e.printStackTrace();
            }finally{
                session.close();
            }
        }
        return stu;   
       }
     
     /**
      * 添加一个学生
      * @param stu
     * @throws SystemException 
     * @throws HeuristicRollbackException 
     * @throws HeuristicMixedException 
     * @throws RollbackException 
     * @throws IllegalStateException 
     * @throws SecurityException 
      */
     
       public boolean AddStudent(student stu) throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException{
           boolean result  = false;
           Session session = getSession();
           if(session != null){
               try{
                   tx = (Transaction) session.beginTransaction(); //开启一个事务
                   session.save(stu);   //保存
                   tx.commit();  //提交事务
                   result = true;
               }catch(HibernateException e){
                   e.printStackTrace();
                   tx.rollback();  //如果报错 则回滚
               }finally{
                   session.close();
               }
           }
        return result;       
       }
     /**
      * 更新一个学生   这里只举一个更新手机号的例子
      * @param stu
     * @throws SystemException 
     * @throws HeuristicRollbackException 
     * @throws HeuristicMixedException 
     * @throws RollbackException 
     * @throws IllegalStateException 
     * @throws SecurityException 
      */
     public boolean UpdateStudent(String studo,String newMobile) throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException{
         boolean result = false;
         Session session = getSession();
         if(session != null){
             try{
                // 开启一个事务
                 tx = (Transaction) session.beginTransaction();
                 // 获取一个学生对象
                 student stu = (student) session.load(student.class, studo);
              // 更新某个属性
               stu.setMobile(newMobile);
               // 提交事务
               tx.commit();
               result = true;
             }catch(HibernateException e){
                 e.printStackTrace();
                 tx.rollback();   //更新失败需要回滚
             }finally{
                 session.close();
             }
         }
        return result;     
     }
    }

    test.java

    /**
     * @author Administrator
     *
     */
    package text;
    import java.util.List;
    
    import javax.transaction.HeuristicMixedException;
    import javax.transaction.HeuristicRollbackException;
    import javax.transaction.RollbackException;
    import javax.transaction.SystemException;
    
    import entity.student;
    import entity.dao.studentService;
    
    public class textHibernateSQL{
        public static void main(String []args) throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException{
            //添加两个学生   
            //AddStudent();  成功
            //查出全部的学生
            //getAllStudent();  成功
            //查询一个学生
            getStudentById();  
            //更新一个学生
            //UpdateStudent();  成功
        }
    
        private static void UpdateStudent() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
            studentService ss = new studentService();
            String studo = "201205457";
            String newMobile = "00";
            ss.UpdateStudent(studo, newMobile);
        }
    
        private static void getStudentById() {
            studentService ss = new studentService();
            String no = "201205457";
            student st = ss.GetStudentBystudo(no);
            System.out.println(st.getAddress());
        }
    
        private static void getAllStudent() {
            studentService ss = new studentService();
            List<student> list =  ss.GetAllStudent();    
            for(student st: list){
                System.out.println(st.getStuname()+"  "+st.getStuage());
            }
        }
    
        private static void AddStudent() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
            studentService ss = new studentService();
            student st = new student();
            st.setStuname("大伟哥");
            st.setAddress("天津南开");
            st.setEmail("xxx@qq.com");
            st.setMobile("12");
            st.setStuage(24);
            st.setStudo("201205457");
            st.setStupass("WHAT");
            st.setStusex("1");
            ss.AddStudent(st);
            
        }
    }
    说明:
    1:SessionFactory sf = new Configuration().configure().buildSessionFactory();这句话的意思是读取hibernate.cfg.xml,创建Session工厂,是线程安全的。
    默认是”hibernate.cfg.xml”,不用写出来,如果文件名不是”hibernate.cfg.xml”,那么需要显示指定,如下:
    SessionFactory sf = new Configuration(). configure( “javass.cfg.xml” ).buildSessionFactory();
    2:Session是应用程序主要使用的Hibernate接口,约相当于JDBC的Connection+Statement/PreparedStatement的功能,是线程不安全的
    3:这里使用的事务Transaction是Hibernate的Transaction,需要有,不能去掉。
     
  • 相关阅读:
    win7 64bit下使用PL/SQL Developer连接Oracle
    C#高级开发之 特性(Attribute)三
    K3单据表结构描述和相关关联SQL语句以及金蝶插件相关说明
    K3老单插件控制字段显示
    金蝶K3插件开发-控制单据焦点(BOS单据、工业单据)
    K3 单据,单据体自定义字段显示及时库存
    C#高级开发之反射(Reflection)二
    C#高级开发之泛型一
    python学习——协程
    python学习——线程
  • 原文地址:https://www.cnblogs.com/daweige/p/8028605.html
Copyright © 2011-2022 走看看