Hibernate

作者: 冬季洛阳 | 来源:发表于2017-06-20 18:46 被阅读0次

    Hibernate的概述

    是一个标准ORM框架
    操作对象就相当于操作表结构
    通过映射文件吧对象与表关联到一起

    对jdbc的一个封装

    优点:简化了jdbc的繁琐代码
    对面向对象特性的良好支持

    缺点:不支持动态sql,灵活性较低
    不适合大规模的数据处理

    Hibernate 开发环境搭建

    1.导入jar包 lib下required包下的所有jar包,还有log4j.jar及数据库连接

    project-etc下找约束

    配置映射文件User.hbm.xml
    a.列名子标签形式存在
    b.列名可以不写,默认和实体类名字段一样
    c.type可以不写,默认和实体字段属性一致

    主键生成策略:native(根据本地数据支持主键生成方式)
    uuid(根据uuid算法生成一个32位16进制的字符串,推荐使用,使用此算法,主键必须为字符串)

    <?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>
        <class name="com.hemi.bean.User" table="tb_user">
        <id name="id" column="id">
        <generator class="native"></generator></id>
        <property name="name" column="name"></property>
        <property name="age" column="age"></property>
        </class>    
        </hibernate-mapping>
    

    主配置文件hibernate.cfg.xml

    <?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-configuration>
        <session-factory>
    
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql:///bank</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password"></property>
    
            <!-- 配置方言 -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            
            
            <!-- 选配 -->
            <!-- 自动生成表 -->
            <property name="hbm2ddl.auto">update</property>
            <!--显示hibernate执行的sql语句  -->
            <property name="show_sql">true</property>
            <!-- 格式化sql输出 -->
            <property name="format_sql">true</property>
            
            <!-- 引入映射文件 -->
            <mapping resource="com/hemi/bean/User.hbm.xml" />
        
        </session-factory>
    
    
    </hibernate-configuration>
    

    测试类

    Configuration con=new Configuration();
         con.configure();//加载配置文件
         SessionFactory factory = con.buildSessionFactory();//得到 SessionFactory对象
         System.out.println(factory);
    

    crud操作

    a.得到工厂对象
    b.打开session
    c.开启事物
    d.crud操作
    e.提交事务
    f.关闭资源

    2.png

    快照机制
    从数据库查询出的额数据会在缓存和快照区各一个 当调用flush或者close方法刷新缓存,来和快照区数据比对,有更新就推入数据库

    对象的三种状态

    a.瞬时态 (1)new出来的,不和 Session 实例关联(2) 在数据库中没有和瞬时对象关联的记录

    b.持久态 瞬时对象转为持久对象:
    (1) 通过 Session 的 save() 和 saveOrUpdate() 方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
    (2) 使用get(),load() 待方法查询到的数据对象,将成为持久化对象。
    持久化对象的特点:
    (1) 和 Session 实例关联
    (2) 在数据库中有和持久对象关联的记录

    c.游离态:数据库有记录,但是脱离了session,缓存中没有

    1. 本质上和瞬时对象相同
      (2) 只是比瞬时对象多了一个数据库记录标识值 id.
      持久对象转为游离对象:
      当执行 close() 或 clear(),evict() 之后,持久对象会变为游离对象。
      瞬时对象转为持久对象:
      通过 Session 的 update(),saveOrUpdate() 和 lock() 等方法,把游离对象变为持久对象。

    要先查后改

    修改方法:

    1.update
    2.saveOrUpdate
    当没设置存入数据的主键时执行save
    设置了就执行update,主键在数据库找不到时,就会报状态异常
    3.merge
    当没有主键时,执行插入,当有主键时,先查询,判断是否存在,存在就修改,不存在就执行插入
    瞬时态的数据被merge操作后变成游离态,返回的数据为持久态

    查询方法

             Session session = HibernateUtil.getsession();
            Transaction transaction = session.beginTransaction();
            User user = new User();
            user.setAge(208);
            user.setName("ewjj");
        User user2 = session.get(User.class, 5);
        //一发送就执行sql语句
        User load = session.load(User.class, 1);
        //使用结果时,才执行sql语句,推荐
         session.saveOrUpdate(user);
            transaction.commit();
            session.close();
    
            Configuration con = new Configuration();
           con.configure();// 加载配置文件
           SessionFactory factory = con.buildSessionFactory();// 得到
                                                               // SessionFactory对象
           System.out.println(factory);
           Session session = factory.openSession();
           Transaction transaction = session.beginTransaction();
           User user = new User();
           try {
               user.setAge(20);
               user.setName("ew");
               session.save(user);
               transaction.commit();
           } catch (Exception e) {
               if (transaction != null) {
                   transaction.rollback();
               }
           } finally {
               session.close();
           }
    
    
    

    工具类

           private HibernateUtil() {
       }
       static SessionFactory factory;
       static {
           Configuration con = new Configuration();
           factory = con.configure().buildSessionFactory();
       }
       public static Session getsession(){
       return factory.openSession();
       }
       ```

    相关文章

      网友评论

          本文标题:Hibernate

          本文链接:https://www.haomeiwen.com/subject/mmjaqxtx.html