1、JDBC的缺点?
- hibernate适合用中小型企业开发软件代码相当繁琐。
- 从一个数据库移值到另外一个数据库,得改变很多内容,比较差。
- 在进行请求的时候,直接从内存中提取数据就可以了,这样的过程称为数据缓存,Jdbc虽然提供了数据库连接池,但是没有提供数据缓存。
- jdbc技术是面向sql语句操作,而不是面向对象操作的。
2、JDBC的优点?
- 如果操作数据库,则越底层效率越高。
3、Hibernate的优点?
- Hibdrnate的代码是比较简单的。
- Hibernate是面向对象的操作。
- Hibernate的移动植性很强。
- Hibernate的缓存是世界级的。
4、Hibernate的缺点?
- 不能干预sql语句的生成。
- 如果一张表中有千万级别的数据量,也不适合用Hibernate。
- 如果表之间的关系相当复杂,也不适合用hibernate来做。
- hibernate适合用中小型企业开发软件。
5、Hibernate的编程步骤?
- 创建 pojo 类;
- 创建配置文件(包含数据库连接的相关信息,以及连接的映射文件);
- 创建映射文件;
- 调用 hibernate 的 API;
创建 SessionFactory;
创建 Session;
启动事务,session.beginTransaction();
执行 CRUD 操作;
提交或回滚事务;
6、Hibernate的执行流程?
7、关于SessionFactory?
1、sessionFactory是存放配置文件、映射文件、持久化类的信息的。
2、sessionFactory只有一个,一个sessionFactory代表一个数据库的链接。
3、sessionFactory类本身是线程安全的。
2、sessionFactory只有一个,一个sessionFactory代表一个数据库的链接。
3、sessionFactory类本身是线程安全的。
4、维护着 hibernate 的二级缓存(可选)。
5、创建session。
8、关于Session?
- 轻量级的,可以频繁的创建和删除,一个session代表数据库的一个链接,一般一个事务中的操作对应一个Session
- 线程不安全的(多线程访问需要进行线程控制);
- 维护着 hibernate 的一级缓存(必用的);
- 可以执行 CRUD 操作;
9、Session的get()和load()方法的区别?
session.get(...):
1)数据库中无对应记录,返回 null;
2)直接到数据库中去查;
3)使用代理类;
session.load(...):
1)数据库中无对应记录,抛出 ObjectNotFoundException;
2)先到缓存中去查,缓存中没有,再到数据库中去查;
3)不使用代理类;
1)数据库中无对应记录,返回 null;
2)直接到数据库中去查;
3)使用代理类;
session.load(...):
1)数据库中无对应记录,抛出 ObjectNotFoundException;
2)先到缓存中去查,缓存中没有,再到数据库中去查;
3)不使用代理类;
10、对象的状态?
说明:
1、把1,2,3步这样的对象称为临时状态的对象。
2、临时状态的对象没有和hibernate发生交互。
3、当执行第四步的时候,pereson对象和hibernate容器发生了交互,如果主键的生成机制为increment,这个时候会发出,Select max(pid) 查找主键的最大值,如果主键的生成机制为identity,则会发出insert语句。
4、把第四部完成以后的对象称为持久化对象,因为和hibernate发生交互了。
5、当执行第5步,完成事务提交,这个时候hibernate中的session并没有关闭,所以该对象还是持久化对象,在数据库里有对应的值了。
6、当执行第6步的时候,session关闭了,该对象变成脱管对象脱离hibernate管理了。
1、把1,2,3步这样的对象称为临时状态的对象。
2、临时状态的对象没有和hibernate发生交互。
3、当执行第四步的时候,pereson对象和hibernate容器发生了交互,如果主键的生成机制为increment,这个时候会发出,Select max(pid) 查找主键的最大值,如果主键的生成机制为identity,则会发出insert语句。
4、把第四部完成以后的对象称为持久化对象,因为和hibernate发生交互了。
5、当执行第5步,完成事务提交,这个时候hibernate中的session并没有关闭,所以该对象还是持久化对象,在数据库里有对应的值了。
6、当执行第6步的时候,session关闭了,该对象变成脱管对象脱离hibernate管理了。
11、对象状态转化图?