zoukankan      html  css  js  c++  java
  • Hibernate配置以及Hibernate初始化类

    初识Hibernate

    ORM原理简介:

    ORM(Object Relationnal Mapping)是对象到关系的映射,它的作用是在关系数据库和对象这件做一个自动的映射,将数据库中的表映射成为对象,也就是持久化类,对关系型数据库以对象的形式进行操作,减少开发中数据重复的编程任务。

    Hibernate配置文件

    Hibernate通过读取默认的XML文件himbernate.cfg.xml加载数据库的配置信息,该配置文件被默认放在classpath根目录下。(文件名可以自定义,不过后面写工具类时就要写自定义的文件名,如果按照默认的就不需要写文件名了,后面还会在详细说明)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <!-- 上面三行代码是要写上的,如果不会的话,你可以查帮助文档,问度娘,或者在你的Hibernate安装文件夹中的pfoject文件夹中招cfg.xml结尾的案例 -->
    
    <!-- 以/jndi/name绑定到JNDI的SessionFactory实例 -->
    <hibernate-configuration>
        <session-factory>
            <property name="dialect">org.hibernate.dialect.HSQLDialect</property><!-- 数据库方言 -->(这里是mysql)
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- jdbc数据库驱动 -->
            <property name="connection.url">jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK</property><!-- 链接数据库 -->
            <property name="connection.username">root</property><!-- 用户名 -->
            <property name="connection.password"></property><!-- 密码 -->
            <property name="show_sql">true</property>    <!-- 在控制台输出生成的每一条sql语句,开发者一般为了调试写为true,后期项目结束改为false -->
            <!-- 映射定义文件,(文件的路径) -->
            <mapping resource="com/itnba/maya/hibernate/Fruit.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    Hibernate映射

    1.首先了解一下持久化类(也就是基本的Bean类)

    在持久化类中每一个属性都有相应的set()和get()方法。它不依赖与任何接口和继承任何类。

    Hibernate中持久化类的4条编程原则:

    a.实现一个默认的构造函数(所有的持久化类都必须含有一个默认的无参数构造方法),以便Hibernate通过Constructor.newInstance()实例化持久化类。

    b.提供一个标识属性(也就是对应数据库中主键的字段名)

    c.使用非final类

    d.为属性声明访问器:持久化类的属性不能声明为public,最好是private

    2.对象关系映射:对象和关系型数据库之间的映射通常使用XML文档来实现的。映射文件的命名规则为*.hbm.xml  例如(User.hbm.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 上面复制粘贴 -->
        
    <hibernate-mapping default-lazy="false" package="com.itnba.maya.hibernate">  <!-- package选填,与下面对应好即可 -->
        <class name="Fruit" table="Fruit">  <!-- 如果上面写了包名这里的name直接写类名即可 -->
        <!-- name是类属性名,表中的字段名 column="ID" 类型type="long"--> 
        <!-- 库表中的字段名和类型最好和类中的属性名一一对应,那么这样就只写name就可以了 -->
            <id name="ids"> 
                <generator class="assigned"/>  <!-- 表示主键 -->
            </id>
             <property name="name"/> <!-- 以下是其他字段 -->
             <property name="source" />
             <property name="price" />
             <property name="numbers" />
             <property name="image" />
        </class>
    </hibernate-mapping>

    Hibernate的3种实例状态

    1.瞬时状态

    实体对象new出来时,但是还没有纳入Hibernate Session的管理中,如果没有变量对其引用,他将被JVM回收,瞬时状态的对象在内存中是孤立存在的,它与数据库中的数据无任何关联,仅仅是一个信息的载体。

    2.对象处于Session的缓存中和其关联的状态,处于该状态的对象也称为持久化对象。持久化对象特点:和Session关联(受其管理)数据库中有对应的记录

    3.(detached)(脱管状态)数据库中有对应的记录但是没有处于Session缓存中(和Session没有关联)的状态。处于该状态的对象也称为游离对象。

    脱管对象特点:  数据库中有对应记录、没有和Session关联(不受其管理)

    Hibernate初始化类

    Session对象是Hibernate中数据库持久化操作的核心,他负责Hibernate所有的持久化操作。那么如何获取Session对象呢?

    Session对象是通过SessionFactory对象获取的,而SessionFactory又是通过Configuration对象来创建的。(代码如下)

    创建HibernateUtil类,实现对Hibernate的初始化

    package com.itnba.maya.hibernate;
    
    import org.hibernate.*;
    import org.hibernate.cfg.*;
    
    public class HibernateUtil {
        private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();//为保证线程安全,将Seeeion放到ThreadLocal中管理。这样就避免了Session的多线程共享数据的问题
        private static final SessionFactory sessionFactory=BuilderFactory();//构建SessionFanctory对象
        
        private static SessionFactory BuilderFactory() {        
            Configuration cfg=new Configuration().configure();//加载Hibernate配置文件
            return cfg.buildSessionFactory();
        }
        
        //获取session
        public Session getSession(){
            Session session=threadLocal.get();//从线程中获取session,
            if(session==null){//如果session为空
                session=sessionFactory.openSession();//那么就用SessionFactory来创建一个session
                threadLocal.set(session);//并且为了线程安全,将它放进线程锁中
            }
            return session;//返回session
        }
        
        //关闭session
        public void closeSession(){
            Session session=threadLocal.get();//首先也要从线程中获取session,看是否存在这一次会话中的session
            if(session != null){//如果存在            
                session.close();//先将session关闭掉
                threadLocal.set(null);//再将线程中的session移除设为空
            }
        }
    }

     基本添加修改删除查询操作

    package com.itnba.maya.hibernatetest;
    
    import java.util.List;
    import org.hibernate.*;
    import org.hibernate.cfg.*;
    
    public class TestNigeht {
        public static void main(String[] args){
            Session session=null;
            
            //添加
            /*try{
                session=HibernateUtil.getSession();
                Fruit f=new Fruit();
                f.setIds("z002");
                f.setName("西红柿");
                session.beginTransaction();
                session.save(f);
                session.getTransaction().commit();
            }catch(Exception ex){
                System.out.println("数据添加失败");
                ex.printStackTrace();
                session.getTransaction().rollback();
            }finally{
                HibernateUtil.closeSession();
            }*/
            
            //查询
            /*try{
                session=HibernateUtil.getSession();
                Fruit f=session.get(Fruit.class,"z001");
                List<Fruit> list=session.createQuery("from Fruit").getResultList();
                System.out.println(f.getIds()+f.getName());
                for(Fruit fr:list){
                    System.out.println(fr.getName());
                }
            }catch(Exception ex){
                ex.printStackTrace();
                System.out.println("数据查询失败");
            }finally{
                HibernateUtil.closeSession();
            }*/
            
            //修改
            /*session=HibernateUtil.getSession();
            Fruit f=session.get(Fruit.class,"z001");
            if(f != null){
                try{
                    session.beginTransaction();
                    f.setName("冬瓜");
                    session.update(f);
                    session.getTransaction().commit();;
                }catch(Exception ex){
                    session.getTransaction().rollback();
                    System.out.println("数据修改失败");
                    ex.printStackTrace();
                }finally{
                    HibernateUtil.closeSession();
                }
            }*/
            
            
            //删除
            session=HibernateUtil.getSession();
            Fruit f=session.get(Fruit.class,"z002");
            if(f != null){
                try{
                    session.beginTransaction();
                    session.delete(f);
                    session.getTransaction().commit();
                }catch(Exception ex){
                    session.getTransaction().rollback();
                    System.out.println("数据删除失败");
                    ex.printStackTrace();
                }finally{
                    HibernateUtil.closeSession();
                }
            }
            
            
        }
    }
  • 相关阅读:
    浅析Python模块的引入和调用
    一篇文章带你了解CSS定位知识
    盘点4大下载神器,教你分分钟搞定文件下载
    Mysql查询语句进阶知识集锦
    (原创)高DPI适配经验系列:(四)高DPI适配示例
    (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点
    (原创)IconFont(矢量图标字体)在Winform中的应用
    (原创)高DPI适配经验系列:(二)按DPI范围适配
    (原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系
    [C#] (原创)一步一步教你自定义控件——06,MaskLayer(遮罩层)
  • 原文地址:https://www.cnblogs.com/AnswerTheQuestion/p/6498703.html
Copyright © 2011-2022 走看看