zoukankan      html  css  js  c++  java
  • Hibernate入门(一)

    Hibernate的官方网站http://hibernate.org

    一、与MyBatis的比较

    相对于MyBatis的“SQL-Mapping”的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理、级联操作等功能
    完全面向对象,语句与数据库无关,开发者无需关注SQL的生成,开发简单,便于修改,数据库移植性好
    由于直接使用SQL,MyBatis使用自由度较高
    

    二、搭建Hibernate环境的步骤 

    1、引入所需的jar文件
    2、配置hibernate.cfg.xml
    3、创建持久化类并配置相关hbm.xml映射文件
    4、在hibernate.cfg.xml中引入hbm.xml映射文件
    

    三、hibernate.cfg.xml文件的配置

    <!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>
            <!-- 数据库url -->
            <property name="connection.url" >
                jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8
            </property>
            <!-- 数据库用户 -->
            <property name="connection.username">root</property>
            <!-- 数据库用户密码 -->
            <property name="connection.password">0000</property>
            <!-- 数据库JDBC驱动 -->
            <property name="connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <!-- 每个数据库对应其方言 -->
            <property name="dialect">
                org.hibernate.dialect.MySQLDialect
            </property>
            <!-- 指定当前session范围和上下文 -->
            <property name="current_session_context_class">thread</property>
            <!-- 是否运行期间生成sql输出到日志供调式 -->
            <property name="show_sql">true</property>
            <!-- 是否格式化sql -->
            <property name="format_sql">true</property>
            <!-- 关闭bean validate验证,因为javaee6有bean-validator.jar这个包,用javae5就没事了,
            在Hibernate中默认的 <prop key="javax.persistence.validation.mode">none</prop> 
                是auto而不是none! -->
            <property name="javax.persistence.validation.mode">none</property>
            <!-- mapper映射 -->
            <mapping resource="com/entity/User.hbm.xml"/>
        </session-factory>   
    </hibernate-configuration>

    四、创建持久化类需要实现(序列化)接口

    public class User implements java.io.Serializable {
        private Integer uid;
        private String uname;
        private Integer age;
        private String sex;
    
            //省略set/get方法
                    
    }

    五、创建持久化类的映射文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Maping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <class name="com.entity.User" table="user">
            <id name="uid" column="uid" type="java.lang.Integer">
                <generator class="identity"></generator>
            </id>
            <property name="uname" column="uname" type="java.lang.String"></property>
            <property name="age" column="age" type="java.lang.Integer"></property>
            <property name="sex" column="sex" type="java.lang.String"></property>
        </class>
    </hibernate-mapping>

    六、使用Hibernate API(测试类)

    public class Test {
        public static void main(String[] args) {
            Configuration config = new Configuration().configure();
            SessionFactory factory = config.buildSessionFactory();
            Session session = factory.openSession();
            
            Transaction tx = session.beginTransaction();
            
            
            //增加
            /*User user = new User();
            user.setUname("李四");
            user.setAge(14);
            user.setSex("男");
            返回当前主键值
            Serializable id = session.save(user);
            System.out.println(id);*/
            
            //修改
            User u1 = new User();
            u1.setUname("张dsf");
            u1.setAge(12);
            u1.setSex("男");
            session.save(u1);
            System.out.println(u1);
            
            //查所有 hql
            /*List<User> users = session.createQuery("from User").list();
            for (User user : users) {
                System.out.println(user);
            }*/
            
            //查所有 sql
            /*List<User> users = session.createSQLQuery("select * from user").addEntity(User.class).list();
            for (User user : users) {
                System.out.println(user);
            }*/
            
            //查一个
            //User u = session.get(User.class, 2);
            //User uu = (User)session.load(User.class, 2);
            //System.out.println(uu);
            
            //删除
            /*User u2 = new User();
            u2.setUid(4);
            session.delete(u2);
            System.out.println("over");*/        
            
            tx.commit();
            session.close();
            
        }
        }

    七、查询时get()方法和load()方法的区别

    1、区别一
    当使用Session的get()方式时,如果加载的数据不存在,则会返回null;
    使用Session的load()方法时,如果加载的数据不存在,则会抛出异常,
    
    2、区别二
    get()方法时及时加载
    load()方法时延时加载

    八、Hibernate中Java对象的三种状态

    1:瞬时态
    与session无关,与数据库无关,对对象的更变不会映射到数据库,特点是没有主键;
    
    2:持久态*
        与session有关,与数据库有关,对对象的更变会映射到数据库,当然有主键,获得的方式,get、load、save等;
    
    3:游离态
        曾经与session有关,曾经与数据库有关,总是从持久态演变过来的,对对象的更变不会映射到数据库;

    九、脏检查与刷新缓存

      Session是hibernate向应用程序提供的持续化操纵的主要接口,它提供了基本的保存、更新、删除和加载java对象的方法,Session具有一个缓存,可以管理和跟踪所有持久化的对象。
    
      当对象被加入到Session中时,Session会为当前持久化的对象的值类型的属性复制一份快照。操作中,如果持久化的对象的属性发生改变,那么当前的
    持久化对象即为脏对象,在事物提交时,Hibernate会对Session中持久化状态的对象进行检测,即比较当前持久化对象的当前属性与它的快照,以判断
    对象的属性是否发生的变化,这种判断成为脏检查,则Session会根据脏对象的最新属性值来执行相关额SQL语句,将变化更新到数据库中,一确保内存
    中的对象数据和数据库中的数据一致。
    
    注意:当Session缓存中对象的属性发生变化时,Session并不会立即执行脏检查和执行相关的SQL语句,而是在特定的时间点,即刷新缓存时才执行;
    
    当刷新缓存(调用Session的flush()方法)时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变;
    commit()方法会首先刷新缓存; 刷新缓存就是将数据库同步为与Session缓存一致; 刷新缓存时会执行脏检查; Session会在以下时间点刷新缓存; 调用Session的flush()方法; 调用Transaction的commit()方法;

    十、使用Session接口的saveOrUpdate()、merge()方法

    	saveOrUpdate()方法 
    	  如果对象有主键就会执行update
    	  如果对象没主键就会执行save
    	update()方法 
           常规修改
    	merge()方法 
    	  类似动态修改(联想动态sql)
    

     

  • 相关阅读:
    nginx转发域名小记
    简化kubernetes应用部署工具之Helm应用部署
    docker-compose的使用
    使用二进制包安装k8s
    搭建k8s(一)
    linux环境下安装使用selenium Chrome
    常用User-Agent大全
    缓存之Memcache
    git-commit Angular规范
    Kubernetes介绍及基本概念
  • 原文地址:https://www.cnblogs.com/newbest/p/9285706.html
Copyright © 2011-2022 走看看