ORM存在的意义:
写SQL语句有什么不好吗 ?
1.不同的数据库使用的SQL语法不同。比如:PL/SQL与T/SQL
2.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL。
3.程序过分依赖SQL对程序的移植及扩展,维护等带来很大的麻烦。
编写第-个Hibernate例子
- 创建Hibernate的配置文件
- 创建持久化类
- 创建对象-关系映射文件
- 通过Hibernate API编写访问数据库的代码
hibernate.cfg.xml常用配置
注意:hibernate的前缀可以省略,即:hibernate.dialect等同于dialect
hibernate的执行流程
session简介
- 在hibernate中session可以理解为操作jdbc的对象,
- session与connection,是多对一关系,每个session都有一个与之对应的
connection,一个connection不同时刻可以供多个session使用。 - 把对象保存在关系数据库中需要调用session的各种方法
如:save(),update(),delete(),createQuery()等。
session详解
- 如何获得session对象 ?
1 )openSession
2 )getCurrentSession - 如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<propertyname="hibernate.current session_context_class">thread</property>
如果是全局事务(ita事务)
<propertyname="hibernate.current_session_context_class">jta</property> - openSession获取session代码:
@Test
public void testOpenSession()
Configuration config=new Configuration().configure();//获得配界对象
//获得服务注册对象
ServiceReqistry serviceRegistry = new ServiceRegistryBuilder () ,applysettings (config.getproperties ()) .buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory= config,buildsessionFactory(serviceRegistry);
//获得session对象,
Session session=sessionFactory.openSession();
if(session!=nul1)
System.out.println("session创建成功!");
else
System.out.println("session创建失败!");
- getCurrentSession获取session代码:
@Test
public void testGetCurrentSession()
Configuration config=new Configuration().configure();//获得配界对象
//获得服务注册对象
ServiceReqistry serviceRegistry = new ServiceRegistryBuilder () ,applysettings (config.getproperties ()) .buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory= config,buildsessionFactory(serviceRegistry);
//获得session对象,使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:如果是本地事务(jdbc事务)<propertyname="hibernate.current session_context_class">thread</property>
Session session=sessionFactory.getCurrentSession();
if(session!=nul1)
System.out.println("session创建成功!");
else
System.out.println("session创建失败!");
- openSession与getCurrentSession的区别
- getCurrentSession 在事务提交或者回滚之后会自动关闭,而openSession
需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。 - openSession每次创建新的session对象,getCurrentSession使用现有的
session对象。
- hbm配置文件常用设置
mapping:
<hibernate-mapping
schema="schemaName"
catalog="catalogName"
default-cascade="cascade_style" //级联风格
default-access="field/property/ClassName" //访问策略
default-lazy="true/false" //加载策略
package="packagename"
/>
class:
<class
name="ClassName" //类名
table=''tableName" //类对应映射的表名
batch-size=''N" //抓取策略,n表示批量
where="condition" //设置条件
entity-name="EntityName" //一个类映射成多张表,需要加这个属性(很少这样使用)
/>
id(表主健):
<id
name="propertyName" //映射的属性
type="typename" //映射的属性的名称
column="column_name" //映射的数据库表的字段名
length="length" //指定数据库字段长度
<generator class="generatorClass"/> //主键生成策略(重要)
</id>
<component></component>:组件属性,类对象包含子对象时使用的映射标签。
transaction简介
- hibernate对数据的操作都是封装在事务当中,并且默认是非自动提
交的方式。所以用session保存对象时,如果不开启事务,并且手工
提交事务,对象并不会真正保存在数据库中。 - 如果你想让hibernate像idbc那样自动提交事务,必须调用session
对象的doWork0方法,获得jdbc的connection后,设置其为自动提
交事务模式。(注意:通常并不推荐这样做)
hibernate与java映射类型
-
基本类型
-
时间类型
-
对象类型
注:Mysql不支持标准 SQL的 CLOB 类型,在 Mysql 中,用 TEXT,MEDIUMTEXT 及 LONGTEXT 类型来表示长度超过 255 的长文本数据。
hibernate中通过session操作数据库,获取数据时get和load方法的区别
- 在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句
返回持久化对象。
load方法会在调用后返回一个代理对象,
该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会
发出sql语句。 - 查询数据库中不存在的数据时,get方法返回null
load方法抛出异常org.hibernate.ObjectNotFoundException