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 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/newbest/p/9285706.html
Copyright © 2011-2022 走看看