1. 什么是ORM
ORM(Object/Relationship Mapping):对象/关系映射
2. 写SQL语句有什么不好?
不同的数据库使用的SQL语法不同。比如:PL/SQL与T/SQL。
同样的功能在不同的数据库中有不同的实现方式。比如分页SQL。
程序过分依赖SQL语句对程序的移植及扩展,维护带来很大麻烦。
3. 什么是Hibernate
Hibernate是Java领域的一款开源的ORM框架技术。
Hibernate对JDBC进行了非常轻量级的对象封装。
4. 编写Hibernate例子
创建Hibernate的配置文件——hibernate.cfg.xml
创建持久化类
创建对象——关系映射文件
通过Hibernate API编写访问数据库的代码
导入Hibernate必须的jar包---hibernate-release-4.2.4.Final\lib\required
导入Mysql的jdbc驱动--mysql-connector-java-5.1.7-bin.jar
导入Junit4的jar包--junit-4.10.jar
5. 使用Junit进行测试
@Test:测试方法②
@Before:初始化方法①
@After:释放资源③
6. hibernate.cfg.xml常用配置
7. Session
session可以理解为操作数据库的对象。
session与connection,是多对一关系,每个session都有一个与之对应的
connection,一个connection不同时刻可以供多个session使用。
把对象保存在关系数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。
8. Transaction简介
hibernate对数据库的操作都是封装在事务中的,并且默认是非自动提交的方式。所以session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式。(注意:不推荐使用)
9. 如何获取session对象
1) openSession
2) getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件进行配置:
如果是本地事务(jdbc事务)
<property name=”hibernate.current_session_context_class”>thread</property>
如果是全局事务(jta事务)
<property name=”hibernate.current_session_context_class”>jta</property>。
10. openSession与getCurrentSession的区别
getCurrentSession在事务提交或者回滚之后自动关闭,而openSession需要你手动关闭。如果使用openSession而没有手动关闭,多次之后导致连接池溢出。
openSession每次创建新的session对象,getCurrentSession使用现有的session对象。
11. Hbm配置文件常用设置
<hibernate-mapping
schema=”schemalName”
catalog=”catalogName”
default-cascade=”cascade_style”//级联风格
default-access=”field|property|ClassName”//访问策略
default-lazy=”true|false”//加载策略
package=”package”/>
<class
name=”ClassName”
table=”tableName”//表明
batch-size=”N”//数据条数
where=”condition”//抓取数据条数
entity-name=”EntityName”/>
<id//主键
name=”propertyName”//属性
type=”typename”//数据类型
column=”column_name”//映射的字段的名称
length=”length”//字段的长度
<generator class=”generatorClass”/>//主键生成策略
</id>
12. 单一主键
assigned 由java应用程序负责生成(手工赋值)。
native 由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence,等等。
13. 基本类型
14. 对象类型
MySql不支持标准SQL的CLOB类型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据。
15. 组建属性
实体类中的某个属性属于用户自定义的类的对象
<component name=”address” class=”Address”>
<property name=”postcode” column=”POSTCODE”></property>
<property name=”phone” column=”PHONE”></property>
<property name=”address” column=”ADDRESS”></property>
</component>
16. 单表CRUD操作实例
save
update
delete
get/load(查询单个记录)
17. get与load的区别
①. 在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql句,返回持久化对象。
②. load方法会在调用后返回一个代理对象。该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
③. 查询数据库中不存在的数据时,get方法返回null。
④. load方法抛出异常org.hibernate.ObjectNotFoundException
18. Hibernate开发流程