HibernateDay0102

首先让我们看一下JavaEE的三层架构:

使用hibernate的好处:操作数据库的时候,可以使用面向对象的思想来完成,不需要书写SQL;

Hibernate:是一个持久层ORM框架,对象关系映射;DBUTils是1级,Mybatis是2级,Hibernate是4级

所谓的ORM,就是利用描述对象和数据库表之间映射的元数据,自动将java应用程序中的对象,持久化到关系型数据库的表中;通过java对象,就可以完成表的操作,这之间重要在于映射;

Hibernate一个简单Demo的实现过程:

  1. 下载hibernate;

解压之后:

Doc中存放的相关的文档;lib下面是存放各种jar包,其中required下面的是必需jar包;project下存放的是各种相关的源代码;

  1. 创建数据库和表:

CREATE DATABASE hibernate_day01;//建库

create table cst_customer//建表

(

cust_id bigint(32) not null auto_increment comment '客户编号',

cust_name VARCHAR(32) not NULL comment '客户名称',

cust_source VARCHAR(32) DEFAULT NULL comment '客户信息来源',

cust_industry VARCHAR(32) DEFAULT NULL comment '客户所属行业',

cust_level VARCHAR(32) DEFAULT NULL comment '客户级别',

cust_phone varchar(64)DEFAULT NULL comment '固定电话',

cust_mobile VARCHAR(16)DEFAULT NULL comment '移动电话',

PRIMARY key(cust_id)

)

  1. 引入相关jar包:

  1. 创建实体类,相关属性和表中保持一致(持久化类),创建一个com.domain包,在该包下面创建一个实体类Customer,get,set方法默认生成即可;

  1. 创建映射文件:

在com.domain包下创建一个Customer.hbm.xml文件,注意需要导入相关约束:

之后对该文件进行相关的配置:

  1. 创建hibernate的核心配置文件;

在src下面创建一个hibernate.cfg.xml,同样需要导入约束

书写一个简单的测试程序,用来向数据库中添加数据:

Configuration主要用于hibernate框架加载映射文件,以及对其启动;它会默认去到src目录下找hibernate.cfg.xml文件;SessionFactory是Session对象的工厂,它一般消耗更多的资源,我们可以在加载的时候,只创建一个SessionFactory即可,在以后的使用过程中用来获取Session对象,session对象是用来操作数据库的,是hibernate的运转中心,所有的持久化对象必须在session的管理下才能够进行持久化操作;Session的创建过程有两种,一种是openSession,另一种是getCurrentSession,前者是每次都会获取到一个新的Session对象,每次使用完之后需要手动进行关闭;后者创建的session会和当前线程进行绑定,它在提交或者回滚之后会自动关闭;

关于什么是JavaBean?

JavaBean是java中一种特殊的类,可以将多个对象封装到一个对象中。它的特点是可序列化、可以提供set和get方法、以及默认构造方法所有的属性都被定义为private

为什么在JavaBean中大多数都是使用包装类而不是基本数据类型,原因是java是面向对象的,JavaBean作为一种规范,在习惯是把它的属性都封装成为包装类,这样也方便调用一些方法;另外在阿里巴巴的开发手册中写基本类型接收NULL值有风险,容易出现空指针异常;

关于hibernate中持久化类的编写规则: 

持久化类需要提供无参的构造方法;持久化类的属性需要私有,对私有的属性提供公有的get和set方法;持久化类的属性尽量使用包装类型的;持久化类要有一个唯一标记OID与表的主键进行对应;持久化类尽量不要使用final进行修饰;因为hibernate中 有延迟加载机制,所谓的延迟加载就是产生代理对象,hibernate产生代理对象是利用字节码的增强技术来完成的,其实就是产生了当前类的一个子类对象实现的,如果使用了final来修饰持久化类,那么就无法产生代理对象,hibernate的延迟加载机制就会失效;

Hibernate中的主键生成策略:首先我们需要清楚主键的类型,主键分为自然主键和代理主键自然主键是具有业务含义的字段作为主键,就像我们在一个表中,把name当做主键,那么我们需要规定该属性不能为null值,而且不能修改并且不能够重复;代理主键是不具备业务含义的字段,该类字段一般取名为id;

关于hibernate中对象的三种状态:

瞬时态:没有id,没有session关联

持久态:有id,有session关联

托管态:有id,没有session关联               Demo实现如下:

结论:将我们希望同步到数据库中的数据转换为持久化状态,另外还有一个比较重要的方法SaveOrUpdate,它不论对象此时是瞬时态还是游离态,调用该方法都会转化为持久态;

关于Session对象的创建有两种方式,一种个是通过openSession()进行获取,另一个方法是通过getCurrentSession进行获取;二者的区别是采用前者时,SessionFactory每次会直接创建一个新的Session实例,在使用完成之后必须调用close方法进行关闭,而使用后者创建的session实例,会绑定到当前线程中,并在提交或者回滚过程中自动关闭;

Hibernate中的一级缓存就是session,图解如下:

Hibernate的事务控制:

关于Hibernate中的三种查询方式:

HQL:Hibernate Query Language它的语法类似于SQL,但它是面向对象的;一般用在多表查询但不复杂;

步骤:

获取Hibernate的Session对象,利用openSession这个方法;

编写HQL语句

获取调用Session.createQuery创建查询对象

如果HQL语句中包含参数,使用setXxx设置参数

调用query对象的list或者uniqueResult()方法执行查询

利用Criteria进行查询:面向对象的查询方式,不用写SQL

利用SQLquery来进行查找:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章