hibernate简单应用

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)Incrementhibernate代理生成自增主键

(5)Uuid:位子字符串!

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

 

核心API

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

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

SessionCURD核心对象

Transaction:事务对象(非查询)

Query和 criteria:查询对象

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

 

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

 

3、sessionCURD方法。

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直接从数据库中查询数据,生成1sql。而迭代器会先从数据库中查询出所有的主键列id,使用时,优先从内存(缓存)中查找数据,只有当找不到数据时才回去数据库中进行查询。

具体使用哪一条语句,取决于数据量的大小,一般5m作为一个标识。5m以内都是可以使用list()当数据量大于5m的时候建议使用iterator().但是一般情况下都适用list().因为我们一般在查询的时候会使用分页,所以 还是 查询的数据量很小。一般都不会用到这个 iterator().5m是一个 很庞大的数字,可以算一下5m的汉字量应该有多大。一个汉字两个字节。是两个byte1024byte=1kb1024kb=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还有  很多内容都没有完成。需要更加仔细的练习今天的内容,才能知道日后框架需要的其他内容。

Getload的区别除了之前说过的在当查找结果,没有找到对应对象时,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、加载配置信息的方式1xml  【这里需要注意一点,如果 这个 映射配置文件的名称就是: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 方法之间的区别?

getload两个方法都作为根据对象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

 

好吧 今天主要看例子。昨天的还有内容没有完成,今天的内容也有部分没有完善。

 

转载于:https://www.cnblogs.com/letben/p/5185894.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值