Hibernate
1.Hibernate的学习路线
2.Hibernate的概述
框架:就是一个=软件的半成品,完成部分功能
2.1什么是Hibernate
是持久层的ORM框架
2.2什么是ORM
Hibernate是一个优秀的ORM实现框架
ORM(Object-Relational Mapping)
:对象关系映射
- 开发语言是java是面向对象
- 数据库是Mysql 是关系型数据库
让java跟数据库中的表之间产生关系,直接操作对象就可以操作数据库
传统方式的不足
- 表中的字段获得类中的属性发生变化,DAO中的代码都要跟着发生变化(修改程序源代码)
2.3为什莫学习Hibernate:
3.Hibernate的入门
3.1下载Hibernate的开发包
解压之后:
- documentation:Hibernate的开发文档跟规范,还有一些测试的项目
- lib:Hibernate的开发包,required是必须的,别的是可选的
- product:一些相关的项目的源代码模板
3.2创建项目,引入jar包,日志文件
引入required必须包,还有他要用到的数据库驱动包connection
还需要log4j的jar包
- slf4j 简单日志门面,是一个接口,log4j是整合日志的一个规范
可以把日志文件的配置文件引入log4j.properties
打开配置文件,可以在最后边更改,从而设置日志信息打印在哪,默认是在控制台,可以加一个file打印在文件中,路径上面可以更改。
3.3创建表跟实体类
3.4创建映射文件(ORM框架)
- 映射文件通常是一个XML文件,而且这个文件是可以任意命名。通常情况下名称:
类名.hbm.xml
创建约束:Hibernate 的核心包core下第一个后边位置,找到3.0 mapping的约束里面的123<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
,copy过去
- 建立类和表的映射123456789101112<hibernate-mapping><class name="实体类路劲" table="表名"><id name="实体主键属性名" column="表主键名"><generator class="native"/></id>//普通属性与表中字段建立映射<property name="实体名" column="属性名" /> //两个名字是一样的<property name="" column="" /><property name="" column="" />。。。</class></hibernate-mapping>
3.5创建核心配置文件连接哪个数据库
- src下创建一个固定名称的xml hibernate.cfg.xml
创建约束:project下etc下的hibernate.cfg.xml
里面的约束copy过去,或者找
Hibernate 的核心包core下第一个后边位置,找到3.0 configuration的约束dtd里面的约束
两个是一样的
- 参数:
project下etc下的hibernate.properties是模板,找到参数写123456789101112131415161718192021222324<hibernate-configuration><session-factory>//连接数据库的基本参数<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql///表名</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123</property>// 配置hibernate的属性://hibernate的方言:(也是在上面那个文件中找,mysql是这莫写)<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>//可以配置一些其他的属性//打印出sql语句<property name="hibernate.show_sql">true</property>//格式化一下<property name="hibernate.format_sql">true</property>//hbm2ddl.auto:对应数据库的ddl操作:create,create-drop,update,validate<property name="hibernate.hbm2ddl.auto">update</property>//加载映射文件<mapping resource="com/itheima/domain/...xml(**映射文件的路劲**中间是/并且以src下面的第一个包开头前面不加/)" /></session-factory></hibernate-configuration>
3.6使用Hibernate
|
|
4.Hibernate 常见的配置
4.1配置文件的配置
映射文件:将对象与表建立映射关系。类名.hbm.xml
配置没有网的时候,编写配置文件的提示信息:
先复制,约束下边的路劲
在window属性中找到
xml catalog点 add 在找本地的dtd约束,引入,改为url,粘贴刚才复制的。
4.1.1class标签:建立类与表的映射
- name:实体类的全路劲
- table:数据库的表名(如果类名与表明相同,则table可以省略)
- catalog:写数据库名(可以不写)
4.1.2id标签: 用来表中的主键与类中属性建立映射
- name :类中的属性名
- column:表中的字段名(如果属性名跟字段名一致则可以省略)
- type (从这个以下可以省略):数据的类型(hibernate类型,java类型,数据库类型)
也可以这么写:
4.1.3property标签:表中的字段与类中的属性的映射
跟id大同小异
- length :代表表中的长度(因为hibernate可以帮助你建表,默认设置为255)
4.2核心配置文件
不能联网的时候配置一下,就可以提醒了
如果没有写在src底下,在加载的时候记得传一个路劲过去。
4.2.1分类
- hibernate.properties
- 格式:key=value键值对的形式,但是不能加载映射文件。(手动写)
- 加载:
Configuration con=new Configuration();
- hibernate.cfg.xml
- 格式:格式化的格式
- 加载:
Configuration con=new Configuration().configure();
4.2.2内容
配置基本配置参数
其他参数
加载映射文件
<mapping resource="com/itheima.domain/...xml" />
hbm2ddl.auto参数(hibernate mapping to ddl):对应数据库的ddl操作:(一般会使用update,validata,别的一般用作测试)
- create: 如果数据库有表,先删掉,重新创建一个新的表
- create-drop:如果数据库有表,先删掉,重新创建,使用完毕,会删除该表(没有表也会创建使用完再删除)
- update:如果有表使用原来的表,没有则创建新表,并且可以更新,插入的时候没有字段创建一个新的字段
- validate:如果没表则报错,有表使用原来的表,并对表进行校验(实体对象的属性跟表的字段不一样时会报错)
5.Hibernate的常用API
5.1Configuration:配置对象
5.1.2加载核心配置文件
因为核心配置文件有两种书写方式。
- hibernate.properties
- 格式:key=value键值对的形式,但是不能加载映射文件。(手动写)
- 加载:
Configuration con=new Configuration();
- hibernate.cfg.xml
- 格式:格式化的格式
- 加载:
Configuration con=new Configuration().configure();
5.1.3 加载映射配置文件
如果不用配置文件来加载映射文件可以
手动加载映射文件:(两种方法)Configuration.addResource(路劲...);
//这种方法有一个条件,就是实体类跟配置文件在同一个包中Configuration.addClass(实体类名.class);
5.2 SessionFactory
SessionFactory 对象内部维护了连接池和二级缓存(不讲)。是一个线程安全重量级的对象,所以说一般情况下,一个项目只对应一个SessionFactory。
所以一般把他单独抽出来。
5.2.1抽取一个工厂的工具类
|
|
5.2.2配置连接池
Hibernate中自带了连接池,但是可以自己配置c3p0
引入c3p0相关的jar包,包括hibernate跟其整合的包,
在lib中option中的c3p0中配置核心配置文件:在session-factory中
|
|
5.3session(完成基本的CRUD的操作)
Session session=sessionFactory.openSession();
相当于JDBC中的connection,生命周期是以事务的开始跟结束为界限
不是线程安全的,所以最好定义成局部变量
是数据库核心对象
5.3.1save
save方法中:
- 先查询在,修改对象里面的东西,save跟update的效果是一样的
- 新建一个对象,然后设置id跟其他的值后save,只要主键生成策略不是
assigned
,那么则不用手动设置id,设置了也没用
5.3.2查询get/load
- get:
- 查询一个:get(实体类的class,数据库id); //这里的id在实体里用的long型,所以加L
Customer customer=sess.get(Customer.class, 1l);
load
- 查询一个:load(实体类的class,数据库id);
Customer customer=sess.load(Customer.class, 1l);
重要
**get跟load的区别:**
- 加载时间
- get方法:当程序执行到这行的时候,马上发送一条sql语句,返回Customer的对象
- load方法:当程序执行到这行的时候,没有马上发送sql语句(使用的是Hibernate中延迟加载的策略lazy,真正使用该对象的时候才会加载)(使用的时候才执行,不用根本不加载,只用id也不行,因为人家已经知道了)
- 返回值
- load返回的实体类的代理对象
- get返回实体类本身
- 查询找不到的对象
- load抛出ObjectNotFoundException
- get 返回一个null,或报空指针
- 加载时间
5.3.3 update修改
先创建对象在修改
先查询在修改
5.3.4 delete删除
- 直接创建对象 然后删除
- 先查询在删除(推荐,为以后的级联删除方便)
5.3.5 saveOrUpdate 保存或更新
没有id即保存,有id即更新
5.3.6 查询全部
HQL:Hibernate Query LanguageQuery query=session.createQuery("from Customer");
List<Customer> lists=query.list();
5.4 Transaction 事务操作
beginTranscction(); //开启事务
commit(); //提交事务
- 注:hibernate5中有一个特性,就是会自动提交,前提是必须使用内置的连接池,但是为了低版本跟防止多事务提交出现错误,一般都要手动提交