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)

 

原文地址:https://www.cnblogs.com/newbest/p/9285706.html