hibernate复习、总结

搭建

1、 配置maven

    <dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-core</artifactId>

      <version>4.0.0.Final</version>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

        <version>8.0.20</version>

    </dependency>

    <dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>jstl</artifactId>

      <version>1.2</version>

    </dependency>

    <dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>javax.servlet-api</artifactId>

      <version>3.0.1</version>

      <scope>provided</scope>

    </dependency>

    <dependency>

      <groupId>com.fasterxml.jackson.core</groupId>

      <artifactId>jackson-databind</artifactId>

      <version>2.8.3</version>

    </dependency>

    <dependency>

      <groupId>org.apache.taglibs</groupId>

      <artifactId>taglibs-standard-impl</artifactId>

      <version>1.2.5</version>

</dependency>

2、 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="connection.driver_class">com.mysql.jdbc.Driver</property> <!--Oracle 数据驱动-->

        <property name="connection.url">jdbc:mysql://localhost:3306/study?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC</property> <!--数据库路径-->

        <property name="connection.username">root</property>

        <property name="connection.password">521123</property>

<!--        mysql不同版本对应的方言 -->

<!--        MySQL 5.5及以上版本  :  org.hibernate.dialect.MySQL5InnoDBDialect  这个是网上人说的,我安装的就是mysql 5.5, -->

<!--        开始方言用的org.hibernate.dialect.MySQLInnoDBDialect老报错,改了之后就正常了,实践证明这是正确的。 -->

<!--        MySQL 5.5以下的 -->

<!--        org.hibernate.dialect.MySQLInnoDBDialect -->

<!--        org.hibernate.dialect.MySQLDialect 这个方言好像通用的 -->

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property><!--数据库方言-->

        <property name="show_sql">true</property><!--生成的sql语句-->

        <property name="format_sql">true</property><!--sql格式化-->

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

    </session-factory>

</hibernate-configuration>

其中<mapping resource="mapping/User.hbm.xml"/>

映射类的hibernate文件  maven在resources下

3、 操作

public List<User> findAll() {

        //1.获取session对象

        Session session = HibernateUtils.getSession();

        //2.定义hql语句

        String hql = "from User";

        //3.Session创建Query对象

        Query query = session.createQuery(hql);

        //4.query对象执行操作

        List<User> userList = query.list();

//        5.释放资源

        HibernateUtils.closeSession();

        return userList;

    }

    public void add(int id,String name,String password) {

        //1.获取session对象

        Session session = HibernateUtils.getSession();

        User us= new User();

        us.setName(name);

        us.setId(id);

        us.setPassword(password);

        session.save(us);

        session.beginTransaction().commit();

    }

    public User findByid(int id) {

        System.out.println("sadfas111");

        //1.获取session对象

        Session session = HibernateUtils.getSession();

      //2.利用session根据主键查询

        User stu = (User) session.get(User.class, id);

        HibernateUtils.closeSession();

        System.out.println("stu Fimd:"+stu.toString());

        return stu;

    }

    public void update(User use) {

        System.out.println("更新前"+use.toString());

        use.setName("修改");

        //1.获取session对象

        Session session = HibernateUtils.getSession();

        //执行操作

        //该对象的主键id必须存在

        session.update(use);

        session.beginTransaction().commit();

        HibernateUtils.closeSession();

 

        System.out.println("更新hou:"+use.toString());

    }

4、 补充:工具类HibernateUtils

private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

private static Configuration configuration = null;

private static SessionFactory sessionFactory = null;

static {

        try {

            configuration = new Configuration().configure(“/hibernate.cfg.xml”);

        } catch (HibernateException e) {

            e.printStackTrace();

        }

}

public static Session getSession() {

        Session session = threadLocal.get();

        if (session == null) {

            session = sessionFactory.openSession();

            threadLocal.set(session);

        }

        return session;

}

 

public static void closeSession() {

        Session session = threadLocal.get();

        if (session != null) {

            threadLocal.set(null);

            session.close();

        }

}

知识总结

一、 概述

Hibernate 是一个基于元数据的轻量级的 ORM 框架:

1、元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,相当于这个对象的上下文环境。

2、轻量级:占用资源少,没有侵入性。(其实我认为这只是相对而言,如果和 Ibatis 相比,它到成重量级的了)。

3、ORM:(Object Relation Mapping)对象关系数据库的映射这是 Hibernate 框架的重点,也就是说将我们程序中的实体(bean,这里也叫 POJO)和数据库中的表进行映射。java 类型和 sql类型映射,面向对象设计和关系型数据库设计的映射,从而我们只需要将更多的精力放到业务中,而不是 sql 数据库方面。

4、POJO:(Plain Ordinary Java Object),无格式的普通 java 对象,也就是上边说的实体,和数据库做映射的简单类

二、 hibernate核心接口

session:负责被持久化对象CRUD操作

sessionFactory:负责初始化hibernate,创建session对象

configuration:负责配置并启动hibernate,创建SessionFactory

Transaction:负责事物相关的操作

Query和Criteria接口:负责执行各种数据库查询

三、 hibernate工作原理:

1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件

2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息

3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory

4.Session session = sf.openSession();//打开Sesssion

5.Transaction tx = session.beginTransaction();//创建并启动事务Transation

6.persistent operate操作数据,持久化操作

7.tx.commit();//提交事务

8.关闭Session

9.关闭SesstionFactory

四、 持久层概念

ORM 是通过使用描述对象和数据库之间映射的元数据,将 Java 程序中的对象自动持久化到关系数据库中:

(1)持久化:就是对数据和程序状态的保持。大多数情况下特别是企业级应用,数据持久化往往也就意味将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。

(2)持久层:把数据库实现当做一个独立逻辑拿出来,即数据库程序是在内存中的,为了使程序运行结束后状态得以保存,就要保存到数据库。持久层是在系统逻辑层面上,专致于实现数据持久化的一个相对独立的领域。持久层的目的是通过持久层的框架将数据库存储服务从服务层中分离出来,而 Hibernate 是目前最流行的持久层框架。

 

五、 在持久化层,对象

  • 瞬时态(transistant):对象创建时,瞬时对象在内存孤立存在,携带信息的载体,不和数据库有任何关联,在hibernate里面,可以使用session的save()或saveOrUpdate()将瞬时态转为持久态
  • 持久态(Persistent):该对象在数据库已有对应的记录,并且拥有一个持久化标识,如果是使用hibernate的delete()方法,对应的持久态会变成瞬时态,因为此时他不和数据库有任何关联;当session执行close()或者clear()、evict(),持久态变成托管态,因为此时该对象已经不再hibernate持久层的管理之下
  • 托管态(Detached):当session执行close()或者clear()、evict(),持久态变成托管态,因为此时该对象已经不再hibernate持久层的管理之下;可以通过update()、saveOrUpdate()等方法,转变成持久化对象

 

六、 hibernate和JDBC

hibernate是基于JDBC的,它对JDBC访问数据库做了封装,大大的简化了数据访问层繁琐的重复性代码

性能比较好,属于轻量级的框架,支持多种关系数据库,和多种映射关系

七、 开发流程

l  配置Configuration

l  创建sessionFactory

l  开启session

l  开始事务

l  操作数据库

l  提交事务

l  关闭session

l  关闭sessionFactory

八、 hibernate的缓存机制

hibernate的一级缓存

session级别的缓存,在session接口的实现中包含一系列的java集合,这些java集合构成了session缓存;持久化对象也保存在一级缓存

当使用session的save()时,持久化一个瞬时态对象,该对象被载入内存,即使以后不使用这个对象,缓存不清空时,该对象仍然处于生命周期;当使用load()和get()时,会先在缓存中查找,有则返回,无者加载。

session能够在某些时间点,按照缓存中的变化执行相应的sql语句,来同步数据库,这一过程称作flush

hibernate向session缓存放入数据时,会同时保存快照数据(数据库备份),当修改一级缓存,进行flush时,会对比缓存和快照,如果不一致,就会使用update更新
一级缓存的操作:flush,clear,evict,reflush
flush:将缓存变化同步到数据库
clear:将缓存清空
evict:清除一级缓存指定的对象
refresh:重新查询数据库,更新快照和一级缓存

hibernate的二级缓存

sessionFactory级别的缓存,属于进程范围的缓存,分为两个部分:内置和外置

内置:hibernate自带的,不可卸载,通常在hibernate初始化阶段,hibernate会把元数据和预定义的sql语句放到sessionFactory的缓存,内置缓存属于只读的

外置:可配置的缓存插件,外置缓存中的数据是数据库数据的复制,,必须引入第三方插件才能使用

九、 二级缓存的并发策略

transactionnal: 提供repeatable read事务隔离级别,缓存事务支持,发生异常的时候能够回滚

read-write:提供read commit事务隔离级别,更新缓存时会锁定缓存中的数据

non-read-write:会导致脏读

read-only:数据只读,不允许修改

十、 优化Hibernate

l  使用双向一对多关联,不使用单向一对多
l  灵活使用单向一对多关联
l  不用一对一,用多对一取代
l  配置对象缓存,不使用集合缓存
l  一对多集合使用Bag,多对多集合使用Set
l  继承类使用显式多态
l  表字段要少,表关联不要怕多,有二级缓存撑腰

 GF ✡ 2020/5/3

posted @ 2020-05-04 20:11  夜凉初透陌汐  阅读(138)  评论(0编辑  收藏  举报