您的位置:首页 > 其它

hibernate简单应用

2016-02-10 11:19 302 查看
Hibernate 第二章

核心API 和CURD实现

核心API介绍

单表操作方法

查询hql语句

1、认识hibernate

核心思想ORM:实现数据库中的文件一一映射为java中的实体类。

使用hibernate

1)引入hibernate

2)使用相关核心配置文件:

i. 数据库配置文件: *.hibernate.cfg.xml

ii. 映射文件: *.hbm.xml(描述表和列,与实体类和属性对应关系!)

注意:需要使用hibernate 指定主键的自动实现方法!学名:“主键生成策略”

(1)native 本地,hibernate 根据不同数据库自动选择主键的生成方式

(mysql,sqlserver -->自增,oracle:序列)

(2)Identity:自增长!!使用mysql+sqlserver

(3)Sequence:适用于oracle

(4)Increment:hibernate代理生成自增主键

(5)Uuid:位子字符串!

(6)Assigned:表示有java单独生成一个唯一主键

核心API

配置configuration:根启动hibernate ,加载配置文件

SessionFactory:初始化数据源信息,一个数据源对应一个SessionFactory对象,该对象会自动分析表和实体的关系文件。大对象:创建和销毁非常消耗内存,建议一个 项目中只有1个。

Session:CURD核心对象

Transaction:事务对象(非查询)

Query和 criteria:查询对象

以上6类接口,criteria用的相对比较少,都存在于 org.hibernate包中。

【注意:SessionFactory对象是线程安全的大对象,可以被整个项目使用。Session1不能被多个方法共享。是县城不安全的。】

3、session中CURD方法。

Save(对象)新增

Update(对象)修改,该对象必须包含id

Delete(对象)删除,该对象必须包含id

SaveOrUpdate(对象)

Session里面可以保存数据,这时候这里面的数据叫做 一级缓存数据

SaveOrUpdate(对象)

对象中没设置id属性,直接增加

对象中设置了id属性,直接修改

查询:load/get 两种方法的区别。Id找不到的时候,get会返回一个 null,

Load会出现Exception。

调用修改方法时,有一个 脏检查。【大多数人念做,心脏的脏。表示,重要得点进行修改,不重要的点就不再修改。】

这其实是由于更新对象的方式不正确导致的。

比如:

表中数据:

User_id user_name user_password

1 lifei lifei

User user = new User();

user.setUser_id(1);

user.setUser_name("letben");

此时调用修改方法 必然密码项会被置成null。

但是重点其实在于user_name是被改的属性属于核心属性或者叫重点属性。是一定要被修改的,但是这并不应该把密码置空。所以这是不合理的。对于合理的方式应该是:先把用户取出来,然后再修改。

【这个 东西老师那里今天演示也没有实现,所以 先不管这个我们先实现正确的修改方式。】

查询:

使用HQL查询语言!是一种面向对象的查询语句

比如:查询所有

Select * from 表名 where...

From 实体对象名 where...

使用query 对象,查询语句必须按照面向对象的写法。

From 类名 where 属性=值。。。

动态修改 命令

Dynamic-update="true",在对应关系文件中的class 标签内添加【不过并未实现】

查询完整语法:

From 类名 as 别名 where 别名.属性=值...

Oeder by desc/asc

Group by....

Having...

查询固定列

Select 别名.属性1,别名.属性2 from

类名 as 别名 where 条件...

查询方法

获得列表 list();【常用】

Iterator();【应用较少】

区别:list直接从数据库中查询数据,生成1条sql。而迭代器会先从数据库中查询出所有的主键列id,使用时,优先从内存(缓存)中查找数据,只有当找不到数据时才回去数据库中进行查询。

具体使用哪一条语句,取决于数据量的大小,一般5m作为一个标识。5m以内都是可以使用list()当数据量大于5m的时候建议使用iterator().但是一般情况下都适用list().因为我们一般在查询的时候会使用分页,所以 还是 查询的数据量很小。一般都不会用到这个 iterator().5m是一个 很庞大的数字,可以算一下5m的汉字量应该有多大。一个汉字两个字节。是两个byte。1024byte=1kb。1024kb=1mb 。5m=5120kb=5120*1024byte/2=2621440个汉字。

Hibernate 注入变量值

?或 :别名

From TblUser u where u.uname=?

From TblUser u where u.uname=:别名

分页查询

setFirstResult(开始位置);

setMaxResults(每页条数);

开始位置=(当前页-1)* 每页条数

第二天

2016.1.4 hibernate 的复习巩固

说实话这样定义的话,就基本上就可以不管之前周哥讲的东西了,只要跟紧华哥就行。

框架:

什么是框架?

把一部分能够完成某种特定功能的代码封装到一部分类中,这些类之间有一定的关联关系。把这些具有关联关系的类称作框架。

Hibernate:持久层框架,封装的是jdbc的代码,用来连接数据库。

持久层?持久化?

持久化,就是 把原来只在内存里面的东西写到硬盘上,使之掉电不消失。这样的过程称作持久化。完成这样功能的代码称作持久层。

有人引入了中间件。

中间件的范围很广。用于连接java代码和数据库的桥梁,屏蔽了数据库的细节的hibernate就可以称作是一个中间件。是凡具有这样通用型功能的屏蔽了一定的细节,使之更加简化方便的java类们,就可以称作中间件。中间件的存在也恰恰是因为可以让操作更加平滑。才能够光为人们使用。虽然中间件并不一定更加简单。但是流行起来的中间件一定是可以简化人们操作的。

Orm:编程思想

Object relation mapping 对象关系映射。

两个方面:

一方面是指:抽象的类和数据表之间的对应关系

另一方面是:具体的类的对象和数据表中一条元组之间的对应关系。

搭建Hibernate的框架的环境:

1、映射关系,javabean类,映射文件,*.hbm.xml

2、创建一个hibernate的核心配置文件,(连接数据库参数,hibernate的属性配置,加载映射文件)

3、创建数据库会话(session),session这个对象上,拥有对数据库操作的各种方法(链接,事务管理,提供在映射关系的基础之上)。

4、加载hibernate配置信息的方式有三种:

1)Xml

2)硬编码形式,就是生写一套链接方式。

3)属性文件

主键生成策略

Hibernate 中 操作的对象的状态变化:新生态(瞬态)、托管 、持久态、游离态(脱管)。

Hibernate 关系映射。一对一,一对多,多对一,多对对,继承映射。

不能故步自封,要更多的理解其中的精妙,视图自己写一个真正的框架,我其实只是刚刚走了一步。比如dom4j还有 很多内容都没有完成。需要更加仔细的练习今天的内容,才能知道日后框架需要的其他内容。

Get和load的区别除了之前说过的在当查找结果,没有找到对应对象时,load会报异常而get方法返回null以外。还有一点就是:load是延时加载,当这条结果被用到的时候,才会去加载,如果这个结果没有用到,就不会加载,最明显的点在于是否会生成对应的sql语句。执行get语句时,会立刻生成sql语句,并且执行然后输出结果。在配置对应的hibernate时候,的class位置时,如果设置了这样一个属性:lazy="false" 那么get方法就等效与load方法,在是否延迟这个问题上。当继续考虑到空值查询时,依然延续之前的。查询结果返回方式。

第三天:

复习:

1、hibernate 链接数据库 jdbc 的通用持久化框架

2、Orm映射思想 的这样一种封装的概念。主要包括抽象层面的类和表的对应,以及该类的一个对象和具体的一条元组之间的对应关系。

3、Hibernate操作的是对象

4、Hibernate 包括什么:session 的会话:链接,事务管理,操作数据表的各种方法

5、Hibernate 环境的搭建:

Po类 和映射文件: hibernate.cfg.xml hibernateUtil configuration

6、加载配置信息的方式1、xml 【这里需要注意一点,如果 这个 映射配置文件的名称就是:hibernate.cfg.xml 的话,在程序的 configuration.configure([这里面就可以什么都不写]);如果全局映射文件改名为: hibernate23.cfg.xml 在程序的configuration.configure("hibernate23.cfg.xml");】 2、 硬编码 3、属性文件

7、对应对象的状态: 新生状态(瞬态) 托管 持久化 游离态(脱管)

举例:当一个对象创建之后,还没有调用具体dao层的方法时,该对象处于新生状态也叫瞬态,随后调用dao层的添加方法,创建session对象,在执行session.Save(对象)的方法时,处于托管状态,之后调用transaction.commit()此时对象处于持久化状态,当session.close()后,对象处于游离态。

8、get 和load 方法之间的区别?

get和load两个方法都作为根据对象id查询一个 元组的方法,区别表现在:(对于单表:)当利用get方法进行查询时,会立即生成一条查询语句,并进行查询。无论该对象是否会被使用。当利用load方法进行查询时,只有当查到的结果被使用时,才会生成查询语句并进行查找,也就是说,load方法在获得对象时,存在延迟加载的状况。【如果,提前关闭了session,会报出 session is already closed的异常。】但是这种方式会更加高效,因为他并不会占用更多的内存资源,比起get方法 load中加载到的内容会在内存中留存时间更短。弊端在于一旦该对象不存在会报出异常。这是我们不希望看到的。【这种加载延迟可以通过在 *.hbm.xml的配置文件的class标签中通过 设置 lazy="false",来取消。】当能够查到结果时,是这样,如果查询不到结果时:get方法会返回null,load 会返回exception。

当对于多表进行查询时,等我今天做完实验,在补充到这里面。多表查询时,get也会存在延迟。

实验算是做完了,当比如我们查询员工的时候,使用get方法和 load方法两者是有区别的,get方法无论后面是否使用这个信息,都会生成sql语句,也就是 立即执行,如果是使用load方法,如果后面使用这条信息,才会生成对应的sql语句,进行查询,也就是存在延迟加载的情况。此时,会有另外一个情况【此时要去员工类里面关闭对应的toString()方法。否则看不到效果】hibernate出于安全性的考虑,即使利用get方法,去查询员工信息,也不会得到对应的查询部门的语句。【如果tostring()方法要求得到部门信息就怎么样都会执行,也就看不到效果了。】这就是get方法在多表联查中的“犯懒”现象,这 是处于安全性的考虑。这种现象是可以遏制的。也是通过配置lazy,如果设置lazy=“false”也就是 查询语句会立即执行。在查询到员工后,会立即对部门的信息进行查询,在配置的时候通过员工查询到部门打出lazy后给出的联想是false 也就是多对一的时候是帮助得到那一个部门的,但是一对多的时候,打出lazy之后给出的联想是true也就是 如果要查询更多的数据,也就是一对多的时候是不希望你查到结果的。但是都可以配置为false。只是在配置的时候hibernate希望你按照他的方式进行配置。

9、一对多 多对一 单向关联映射 和双向关联映射。

10、级联 : 级联新增 和 级联删除 (级联删除还有一些问题)

11、一对一 多对多

12、符合主键映射,符合主键类的映射

13、对于普通属性的 细粒度划分

14、明天会讲 继承映射 和hql。

所以今天的重点主要在 这些类的映射配置文件上面。

然后po 是真实的对应一个 表的实体类。

vo 是只面对 展示或者 中间存储的 视图类。

两者都是 javabean对象 区别在于 是否真实对应一个 表。

每个Hibernate session的基本操作 - 包括 persist(), merge(), saveOrUpdate(), delete(), lock(), refresh(), evict(), replicate() - 都有对应的级联风格(cascade style)。 这些级联风格(cascade style)风格分别命名为 create, merge, save-update, delete, lock, refresh, evict, replicate。 如果你希望一个操作被顺着关联关系级联传播,你必须在映射文件中指出这一点。

添加新的员工时,如果部门是新的,那就需要设置级联,如果部门是之前得到的,那就不需要级联。

老师是班级的老师,班级是老师的班级,这种逻辑属于多对多,如果单纯这么生连,一条记录都插不进去,所以多对多的关系必然有中间表的存在。

第四天:

查询:

1、session会话对象中提供,直接查询方法 get load

2、表转化查询

3、HQL

4、Sql

好吧 今天主要看例子。昨天的还有内容没有完成,今天的内容也有部分没有完善。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: