1,导包、
hibernate jdbc tomcat mavern 的包部署到tomcat中去保证运行时也能找到相应的类
2xml文件
2.1hibernate.cfg.xml放在main/resorce
在这个配置文件中配置连接数据库的常量
mapping引用实体类所对应的 映射文件
show_sql配置是否显示sql语句
3,创建实体类
根据表结果创建实体类,get set方法,无参构造
4,右键选中实体类new一个hibernate.hbm.xml文件
表示实体类所对应的映射文件,这个文件中把类联系在一起
5,代码获取一个session对象
6.开启事物 session.beginTransation()
7,session.save(useres)
8,关闭事物和资源
SSH
struts + sping+ hibernate
很多企业会同时使用三个框架来解决自己项目中不同层级代码繁重的情况
hibernate主要针对于持久化层的免费开源框架.
持久化层 也就是dao,操作数据库的代码。我们通过jdbc操作数据库。
操作数据库的查询结果我们之前使用的HashMap。’
从数据库中查询出来的数据保存到哪里比较合理?
1List<HashMap>,之前我们是util方法不能确定返回值到底是什么类型。
2<List<Users>> <List<Student>> <List<City>>
持久化的解释
狭义: 将数据保存到即使断电也不会丢失的动作。
广义:对数据库操作的各种动作都可以理解为持久化的相关动作
持久化就是和数据库有关系的。
hibernage是一个orm类型的框架
object relationnal mapping
对象 关系 映射
orm十分重要的特性:可以让我们通过操作对象。达到操作数据库的目的。
hibernate特点
1将对数据库的操作转换为对象Java对象的操作,从而简化开发。
我们的代码只需要操作对象,然后调用hibernate代码,hibernate会自动转成对应的sql语句最终执行的还是sql语句。
2提供线程和进程两个级别的缓存提升应用程序性能。
之前jdbc每次操作数据库都需要打开连接,执行完毕之后再把连接关闭。
hibernate实现了多级缓存,再一次操作数据库完成之后不会立马把连接对象进行回收,而是重复的使用。
减少打开和关闭数据库次数,减少创建连接数据对象,提升性能。
3有丰富的映射方式将Java对象之间的关系转换为数据库表之间的关系。
根据一张表,创建一个对象类这个动作就是映射,hibernate提供对映射的支持(xml)
4屏蔽不同数据库实现之间的差异。
直接使用sql语句无法避免在数据进行切换的时候sql代码的修改。
create table (username char,age int)支持mysql,orlcal不支持。
使用hibernate之后我们的代码操作的是对象,并不会直接写sql语句。hibernate会根据不同数据库生成不同数据库需要的sql语句。
⑤非侵入式
Hibernate不要求持久化类实现任何接口或继承任何类。
提供一个utils类,在使用的时候直接new utils,这种就是非入侵式。
侵入式的体现,想要使用提供的方法,必须继承于utils的类
hibernate插件下载
http://download.jboss.org/jbosstools/mars/stable/updates/
选择hibernatetools进行下载安装并重启eclipse
hibernate工具,帮我们生成hibernate所需要的一些代码(xml)
导包(hibernate和jdbc)之后开始代码
1创建一个hibernate配置文件,创建在main/resouce
资源文件夹,存放配置文件,比如properties,xml
hibernate.cfg.xml用户配置连接数据库的常量和配置hibernate本身(配置我们想要hibernate的某些功能)
其中需要在session-factory添加配置连接数据库的四个常量
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/1702shop</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
2创建一个持久化的类
比如我们想用hibernate操纵users表。我们就需要按照users表的结果创建对应的对象。
表对应类,表字段对应属性,属性的类型需要注意。
需要set get方法
3创建 对象和表的对象关系的映射xml文件。xml中代码会自动生成
选中类对象右键new hibernate hbm.xml文件
4在hibernate.cfg.xml文件中声明映射文件的位置
<mapping file ="路径指向hbm.xml"/>
5开始代码
Session代表Hibernate应用程序和数据库之间的一次会话,作用相当于JDBC中的Connection。
我们的代码使用Session,然后Hibernate会帮我们来建立连接,并通过连接操作数据库
5.2,SessionFactory 创建Session对象的工厂
5.3,ServiceRegistry 注册hibernate配置信息,完成xml文件和注册
5.4,ServiceRegistryBuilder 用于创建ServiceRegistry类的类
5.5 Configuration 读取配置信息的类,同时还提供了sessionfactory对象的方法
事务
在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
录入一个学生信息,并且把这个学生的英语考试成绩录入。
1通过inser语句向student表中插入学生信息
2获取学生id与考试成绩一并插入score表中
以上两个动作只有全部执行才能够算任务完成,只执行其中一个步骤是不能认为任务完成。
两个动作需要绑定在一起,他们称之为一个单元,也就是一个事务。
插入一个班的学生信息到数据库中,只能一条条的插入。
for(){
//循环体里插入每一个学生的信息
//现第二十五条数据出现问题,那么后面25就停止了,因为出现了异常,代码停止向下继续运行
}
把所有五十条数据全部插入到数据库中叫一个事务,事务就是要么完全执行,要么完全不执行,
那么在出现异常的时候我们需要把之前已经做过的25条数据进行删除。删除事务中已经执行了的步骤这个动作叫做回滚。
session
一级缓存,线程级的缓存,内置的,必须使用的缓存。是一个内存缓存。
好处:如果缓存中有数据直接返回缓存中的数据。
缓存三个方法:
1 flush() 把缓存中的数据的改变推送到数据库。
2refresh() 获取数据库最新数据,更新到缓存中。
3clear() 清空缓存中的数据。
默认commit之后才有反应。
因为默认事务隔离级别
脏读 不可重复读 幻读
read uncommited y y y
read commited x y y
repeadabel read x x y
serializable x x x
如果没有事务隔离级别会出现脏读,幻读,不可重复读这些并发问题。
mysql默认repeadabel read 级别
①读未提交:READ UNCOMMITTED
允许Transaction01读取Transaction02未提交的修改。
②读已提交:READ COMMITTED
要求Transaction01只能读取Transaction02已提交的修改。
③可重复读:REPEATABLE READ
确保Transaction01可以多次从一个字段中读取到相同的值,即Transaction01执行期间禁止其它事务对这个字段进行更新。
④串行化:SERIALIZABLE
确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。
临时状态 三无
new User()
持久化状态 三有
get save update
游离状态 有id,无缓存,有数据
session.clear
删除状态 有id,无缓存,无数据
delete
配置文件:
cfg
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.isolation">1</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
hbm
<class name="com.qianfeng.Users" table="USERS"
select-before-update="true">
每次更新之前都先查询一般
1如果大多更新的数据与数据表中数据不一样,值建议为false
2如果经常出现更新的数据与表中数据一样,建议为true
单向多对一
两张表,一张是many一张是one。在开发过程中并不是任何两张表都使用多对一,我们需要看这两张表是否存在多对一的关系。
1创建实体类
one : 属性包含自己本身的信息
many : 属性包含自己本身的信息+ one的对象的引用。
2添加hbm.xml文件
one : 属性名称和表字段进行关联
many : 属性名称和表字段进行关联
<many-to-one name ="" class="" cloum =""></many-to-one>
name 是many类中one对象引用的变量名
class one 是one的类名(包+类)
cloum 是many所对应表中表示引用one所对应表id的字段。(类似外键)
3查询
两张表都可以单独进行查询。通过get(class,1);
我们可以通过many.one.onecluomname的方式实现jdbc中表连接的效果
4插入
插入many,因为many中有对one的引用,所以不能仅仅插入many所对应的信息,还需要指定一个one
Prodcut p = new Prodcut() p.setName() p.setProvider(session.get(Provier.class,1)),
双向多对一
以下步骤是在单向多对一基础上:
1实体类
one 中添加set类型的集合属性,泛型是many所对应的类名
2xml文件
one中添加
<set><key table=""><colunm name=""></colunm>
</key><ont-to-many calss=""><set/>
通过one获取到many获取到是是一个set集合,通过对set集合的遍历获取到每一个值。