Hibernate入门

什么是hibernate,hibernate是数据持久化工具,也是一个开源的ORM解决方案,Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供面向对象的数据访问API。
Hibernate的优缺点?
Hibernate是一个自定义的工具类,用于获取Hibernate的Session对象,Session是Hibernate执行持久化操作的核心API,Hibernate处理数据库查询时,编写的代码非常简洁,查询的结果可以直接获得一个集合实例,能够直接使用。
1.Hibernate的优点。
1.Hibernate功能强大,是Java应用与关系数据库之间的桥梁,提高了代码的编写速度,避免了比较繁琐的JDBC操作。
2.Hibernate支持面向对象的特性,如组合、继承、多态等。
3.可移植性好,系统不会绑定在某个特定的关系型数据库,如果需要更换数据库,通常只需要修改Hibernate配置文件即可正常运行。
4.Hibernate框架开源免费,可以在需要时研究源代码,还写源代码进行功能的定制,具有可拓展性。
2.Hibernate框架的缺点。
1.不适合以数据为中心大量使用存储过程的应用。
2.大规模的批量插入、修改和删除不适合用Hibernate。
3.MyBatis与Hibernate两者之间的区别。
Hibernate与Mybatis都属于ORM框架,为数据层提供持久化操作的支持。以下为两者之间的区别。
1.相对于MyBatis的‘SQL-Mapping’,Hibernate的ORM实现更加完善,提供了对象状态管理功能。Hibernate针对的是Java对象,即使使用Hibernate的查询语言(HQL)其书写规则也是面向对象的。
2.Hibernate与具体数据库的关联只需要在XML中配置即可,Hibernate开发者不需要关注SQL的生成与结果的映射,所有的HQL语句与具体使用的数据库无关,便于修改,移植性好,而MyBatis直接使用SQL语句,不同数据库可能会有差异,如果要更换数据库,则需要大量修改SQL语句以及一些配置,可移植性差。
如何在idea中创建一个Hibernate框架,第一步在idea中创建一个web项目,然后倒入所需jar包,配置Hibernate的hibernate.cfg.xml配置文件和实体类的映射文件,最后测试运行即可。
其中hibernate.cfg.xml的主要内容如下:
‘’

oracle.jdbc.driver.OracleDriver scott root jdbc:oracle:thin:@localhost:1521:orcl org.hibernate.dialect.Oracle10gDialect
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <!-- <property name="hbm2ddl.auto">create</property> -->
    <!-- getCurrentSession:处于事务,无需手动关闭 -->
    <property name="current_session_context_class">thread</property>

    <mapping resource="cn/entity/User.hbm.xml"/>

</session-factory>

",
同时实体类的映射文件的名称一般以.hbm.xml作为后缀,其主要的内容如下:

其中calss节点中name为实体类的名称,table使用数据库对应的表,schema是用户名, 常用的主键生成策略如下: 1.assigned:主键由应用程序负责生成,无须Hibernate参与,但没有指定元素时默认生成策略。 2.increment:对类型为long、short或int的主键,以自动增长的方式生成主键的值,主键值按顺序递增,增量为1. 3.identity:对如SQL Server、DB2、MySQL等支持标识列的数据库,可使用该主键生成策略生成自动增长主键,但要在数据库中将相应的主键字段设置为标识列。 4sequence:对如Oracle、DB2等支持序列的数据库,可使用该主键生成策略生成自动增长主键,通过子元素param可传入数据库中序列的名称语法如下: 序列名 5.native:由Hibernate根据底层数据库自行判断采用何种主键生成策略,即由使用的数据库生成主键的值。 在配置完映射文件后,还需要再配置文件hibernate.cfg.xml中引用该配置文件引用的语法: 同时如何读取hibernate的配置文件代码如下: private static Configuration cfg ; private static final SessionFactory sessionFactory; static { //初始化 配置文件和sessionFactory try { cfg =new Configuration().configure(); sessionFactory=cfg.buildSessionFactory(); } catch (HibernateException e) { //ctrl + alt + T 外侧代码 //e.printStackTrace(); throw new ExceptionInInitializerError(); } }
//构造函数私有化
private  HibernateUtil(){}

//公开的静态方法,获取session
public static Session getCurrectionSession(){
    Session session  =sessionFactory.getCurrentSession();
    System.out.println("session " + session);
    return session;
}
对于使用hibernate实现数据库的增、删、改、查的操作则需要要使用session对象调用其提供的方法即可。
Hibernate中Java对象的三种状态。
1.瞬时状态
   瞬时状态又称临时状态,如果Java对象与数据库中的数据没有任何的关联,即Java对象在数据库中没有相关联的记录,则此时Java对象的状态为瞬时状态,Session对于瞬时状态的Java对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,将被GC处理。
2.持久状态
当对象与Session关联,被Session管理时,它就处于持久状态,处于持久状态的对象拥有数据库标识(数据库中的主键值)。那么对象在通过Session的查询接口时、或者调用get和load方法从数据库中加载对象的时候,此对象会与数据库表中的一条记录关联的,此时对象与加载它的Session发生关联,其次对瞬时状态的对象调用Session的save()、saveOrUpdate()等方法时,在保存对象的数据时,Java对象会与session发生关联,对于持久状态的对象,Session会持续跟踪和管理它们,如果对像的内部状态发生了任何变更,Hibernate会选择合适的时机将变更同步到数据库中。就如脏检查一样。
3.游离状态
游离状态又称托管状态,处于持久状态的对象,脱离与其关联的Session的管理后,对象就处于游离状态,处于游离状态的对象,Hibernate无法保证对象所包含的数据与数据库中的记录一致,因为Hibernate已经无法感知对该对象的任何操作。Session提供了update()、saveOrUpdate()等方法。将处于游离状态的对象的数据以更新的方式同步到数据库中,并将该对象与当前的Session关联,这时对象的状态就从游离状态转换为持久状态。
三种状态之间的转换。
1.瞬时状态转换为持久状态。
使用了Session的save()、saveOrUpdate()等方法保存对象后,该对象的状态由瞬时状态转换为持久状态。
使用Session的get和load方法获取对象,该对象的状态是持久状态。
2.持久状态转换为瞬时状态
  使用了delete方法后,对象从持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。
  3.持久状态转为游离状态
  执行Session的evict()、clear()或close()方法后,对象由原来的持久状态转换为游离状态。
  4.游离状态转为持久状态
  执行Session的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session关联。
  5.游离状态转为瞬时状态
  执行Session的delete()方法后,对象就变为游离状态,即Session无法管理此对象,无法将其数据与数据库同步。
**脏检查**
    脏检查的代码如下:
     public static void main(String[] args) {
    //更新
    Transaction tx=null;
    Session session=null;


    try {
        session=HibernateUtil.getCurrectionSession();
        tx=session.beginTransaction();
        User user=(User) session.load(User.class,1122);//更新时根据id查询是否有此用户
        //load方法是延迟加载不管是否有此对象id会赋给该对象。
        user.setEmpName("肥熊3219");
        tx.commit();//使用脏检查来实现更新数据
    } catch (HibernateException e) {
        e.printStackTrace();
        if (tx!=null){
            tx.rollback();
        }
    }
}
需要注意的是,当Session缓存中对象的属性发生变化时,Session并不会立即执行脏检查和执行相关的SQL语句,而是在特定的时间点,即刷新缓存时才执行,这使得Session能够把多次变化合并为一条或一批SQL语句,用来减少访问数据库的次数,来提高程序的性能。
在默认	情况下,Session会刷新缓存
1.调用flush()方法时,会刷新缓存并触发脏检查,同时执行相关的SQL语句。
2.调用commit()方法时,在调用commit()方法时,会先调用Session的flush()方法,然后向数据库提交事务。
更新数据的方法
1.update()方法,用于将游离状态的对象恢复为持久状态,同时进行数据库的更新操作,如果该对象为null时,会引发报错。
2.saveOrUpdate()方法,及同时包含了save()和update()方法的功能,如果对象是瞬时状态即刚刚新建在数据库的表中没有一行记录与之对应,则会调用save()方法,如果是游离状态则会调用update(0方法。
3.merge(),复制当前的对象生成一个副本,进行持久状态对象的脏检查操作来实现更新功能,但当前对象的状态不会改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值