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)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
好吧 今天主要看例子。昨天的还有内容没有完成,今天的内容也有部分没有完善。
hibernate简单应用的更多相关文章
- 菜鸟学习Hibernate——简单的增、删、改、查操作
上篇博客利用Hibernate搭建起一个简单的例子,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述如何利用Hinbernate框架实现简单的数据库操作. 1.加入junit.jar 2.新建 ...
- 新秀学习Hibernate——简单的增加、删、更改、检查操作
部分博客使用Hibernate单的样例,把数据库的映射显示了出来在上一篇的博客基础上这篇博客讲述怎样利用Hinbernate框架实现简单的数据库操作. 1.增加junit.jar 2.新建一个工具类H ...
- Hibernate二次学习一----------Hibernate简单搭建
因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...
- Spring+SpringMVC+Hibernate简单整合(转)
SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,下面同样做一个简单的应用实例,介绍SpringMVC的基本用法,接下来的博客也将梳理一下Str ...
- 【hibernate】<第一节>hibernate简单入门
所需工具: ide:eclipse or myeclipse jdk:1.7 jar包:hibernate-distribution-3.6.0.Final 和对应mysql的驱动类(对应jar包如图 ...
- 菜鸟学习Hibernate——简单的一个例子
一.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了能够使用Hibernate快速上手,我们先讲解一个简单的Hibernate应用实例hibernate ...
- Intellij IDEA的Hibernate简单应用
1.创建数据库及其表 create database demo; use demo; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL ...
- Hibernate简单的基础理论
和Hibernate有关的概念,是掌握Hibernate必须了解的知识.就个人经验来说,可以在了解如何简单开发Hibernate之后,再来学习这些概念,这样可以有个比较清楚的认识.Hibernate是 ...
- hibernate简单介绍
1. Hibernate是什么? hibernate是 轻量级的 ORM 框架. ORM全称object/relationmapping [对象/关系映射]. Hibernate主要用来实现Jav ...
随机推荐
- 【HDOJ】2062 Subset sequence
这道题目非常好,饶了点儿圈子.我的思路是,先按照组排列.例如,1 2 31 2 2 1 3 11 2 3 2 1 3 ...
- libvlc 双击,鼠标事件消息响应
基于vlc 2.1 动态库实现接收双击消息的接收,使双击vlc播放画面可以全屏显示. 需要其他版本的vlc可以与我联系(有偿进行修改) 下载地址:http://download.csdn.net/de ...
- poj2817WordStack(状压)
链接 与上题类似 预处理一下各字符串之间最大的相同字符数就可以 注意dp要初始为负无穷 #include <iostream> #include<cstdio> #inclu ...
- Linux Kernel 整数溢出漏洞
漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级: 漏洞类型: ...
- 【转】VC MFC 如何删除文件,目录,文件夹
原文网址:http://shijuanfeng.blogbus.com/logs/100675115.html 第一种方法:定义一个文件类对象来操作CFile TempFile; Temp ...
- word 中Sentences、Paragraph等含义和用法
word 中有Words,Characters,Sentences.Paragraph,Sections 具体含义如下表达式 含义 返回的对象 Words(index) ...
- FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
- NOIP2013 花匠 DP 线段树优化
网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...
- HashPasswordForStoringInConfigFile 已过时
在.net 4.5版本下,使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile进行MD5加密时,会出 ...
- JSP-讲解(生成java类、静态导入与动态导入)
一.JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护. JSP是HTML代码与Java代码的混合体. JSP文件通常以JSP或J ...