今天就抽点时间好好总结一下hibernate框架吧,对于框架这个东西,在不认识它之前,我始终抱着一种憧憬和向往之情,在我的诸多博客之中好多都是对于某一种技术或者是某一个特定的问题,来进行阐述思想或者是列出解决方法,在网上其他的博客上面也是很少有人的博客上面有这种对于一种技术或者框架的总体表述。
可能是因为我看的博客还是很少,我有一个习惯,就是看一篇文章的博文之后,就会吧这个人写的其他类别中的博文都看一遍,并且会关注一下这个人创建博客的时间,和每篇博文的发表时间,如果是长期关注我博文的朋友都会知道,一般只要是工作日内,我的博客是始终在线的,总是会将我在工作或者生活中遇到的问题记录下来,但是我发现我的评论和留言很少,真是不清楚,是我写的博文很low,转载的博文很low,还是我写的太屌直接一针见血的解决了你们的问题,哈哈。
总之一句话,注意看文章的发表时间,留言评论后,会很快得到疑问的解答,和技术的阐述。
在工作中,总是有一种想要回炉深造的那种感觉,总是觉得对于框架和技术的理解,停留在表层,太肤浅,偏向于应用,所以才会萌生想要对于框架和技术的一篇一篇博文的长篇大论。
总之,请大家关注:我的技术自学史,这个分类
①:hibernate引言
- hibernate是一个类比于mybatis的ORM框架
- 是一个专注于持久层,是进行数据库访问和操作的ORM框架
- 解释:
- 持久层(dao,数据的访问层)
- 数据库访问和操作(CRUD增删改查)
- ORM框架(对象数据库转换)/实体和表数据转换
- 总而言之,就是一个对数据库访问操作的一个框架,被应用于dao层
-
②:为什么要使用hibernate框架
③:hibernate的好处
- 提供了用于对数据的增删改查
- session.save();
- update();
- delete();
- get();
④:hibernate的核心设计思路
- hibernate这个框架主要维护的就是关系
- 分别对于O/R/M这三层进行关系的维护和处理(类对应表,属性对应列)
- O:对象层面(entity实体)
- R:关系(table表之间的关系)
- M:映射(实体和表之间的关系转换)
⑤:第一个hibernate程序:
a)搭建开发环境
查看:(这些依赖jar还有配置文件,在下载下来的jar里面都有)
- 如果没有的话,大家可以去网上搜一下这个jar
- 依赖jar就在lib=>require必须里面
- 配置文件就在etc文件夹里面,大家可以找一下
- 我们知道一般框架的环境搭建,其实也没有什么其他的,大致都是:导入依赖jar,引入配置文件,配置配置文件等
基础的依赖jar:
b)引入配置文件(配置文件的放置位置如下图)
- hibernate.cfg.xml
- c)初始化配置
- hibernate.cfg.xml中的配置是hibernate框架运行的相关参数
- 1:连接的相关参数
- 2:hibernate自身的相关属性
- 1)dialect方言:
- 告知hibernate当前连接的是哪一种数据库,根据当前数据库,来进行数据库的优化和调整
- 2)show sql:
- 在控制台输出hibernate执行的sql语句
- 3)format_sql
- 在控制台格式化sql语句
- 格式化:就是一个关键字一行
- 举例:
- select *
- from table
- where id = 1;
3:映射的注册
配置文件的示意图在下面,大家可以参考研究一下:
⑥hibernate的开发步骤(O R M)
- 开发步骤一共是5个:
- a)O:实体
- b)R:关系Table
- c)M:映射/注解
- d)在配置文件中注册实体路径
- e)api编程
-
O:创建实体对象(上面的注解是后面将要提到的M:映射)
R:关系
- M:映射
- 这个映射就是上面实体中所添加的注解
- 注解:具有额外功能的标记
- 下面就分别介绍一下,所需要添加的注解
- @Entity:标识本类是一个实体类
- @Table(name="employee"):标识当前类O和Table/R之间的映射关系name=表名
- 下面这几个注解,来描述id
- 这个是固定不变的,标识id字段
- @Id
- 如果表中字段和实体类中的字段不相同,则需要加上下面的注解,如果相同的话,可以不加。
- name=“”表中的字段“”
- @Column(name="id")
- 下面这两个需要一起说明
- 第一行是一个主键生成器:帮助主键自动递增(当前主键中查询出最大值之后,进行+1)
- name的名字可以任意,是需要下面一行调用的标识
- strategy=“”“increment”策略=“”“递增”
- 第二行是主键生成器的使用
- @GenericGenerator(name="tableGenerator",strategy="increment")
- @GeneratedValue(generator="tableGenerator")
- 还有在日期上面可以加上@Temporal(TemporalType.DATE)
-
⑦:api编程
下面展示的就是上面,封装成工具类的代码展示
查询之后显示出来的数据效果
⑧:下面介绍一下hibernate的CRUD增删改查的具体语法
- 插入:
- session.save(Employee);
- 删除:
- Employee e = (Employee)session.get(Teacher.class,1);
- session.delete(e);
- 修改:
- Employee e = (Employee)session.get(Teacher.class,1);
- e.setName("小花花")
- session.update(e);
- 查询:
- a)主键为条件的查询
- Employee e = (Employee)session.get(Employee.class,1);
⑨:对于hibernate中对象的理解之后,才可以封装工具类
- a)Configuration
- 作用:
- 读取hibernate框架中的配置文件
- Configuration config = new Configuration();
- config.configure();
- 注意:
- 默认会读取根目录下面的/hibernate.cfg.xml文件
- 配置文件一般会一次性全部读入
- b)SessionFacotry
- 作用:创建Session
- 特点:
- 重量级资源/功能多,占内存
- 一个应用应该只创建一个
- 多线程访问,线程安全
- 如果一个类中没有成员变量,则线程安全
- c)Session
- 作用:
- 提供了一套通用的CRUD方法
- session和Connection对象一一对应
- 特点:
- 轻量级资源,功能单一,内存占用少,线程不安全
- session不能被多线程共享
十:openSession和getCurrentSession区别
- Session session = SessionFactory.openSession();
- Session session = SessionFactory.getCurrentSession();
- 功能:
- openSession每一次调用都会产生新的Session
- getCurrentSession一个线程 获得Session是同一个
- 使用:
- 如果想要使用getCurrentSession,需要注意下面几点
- 1)getCurrentSession必须在hibernate.cfg.xml中进行配置
- 这个配置在上面的配置文件中有,需要的话,可以查看一下
- 2)getCurrentSession所获得的session必须运行在事务中
- 3)getCurrentSession所获得的session在事务结束之后,会自动关闭
十一:程序中使用哪一种Session的获取方式?
1)getCurrentSession进行session绑定,可以进行事务控制
十二:复杂查询:
①:hibernate的简单查询
- Employee e = (Employee)session.get(Employee.class,1);
②:非id的条件查询:Query(HQL)
- Query query = session.createQuery("HQL")
- query.list();
③:首先我们需要知道的是:
- hql的基本语法
- a)HQL类似于SQL
- b)from类名
- c)没有select子句
- d)如果需要使用列时,通过as定义列别名,以别名.属性进行访问
- e)hql基本语法暂不完整,下面会进行补充展示
④:参数绑定
- 参数绑定基础模型
- @Test
- public void test(){
- Session session = HibernateUtil.getCurrentSession(0;
- Transaction tx = session.getTransaction();
- //开始事务
- tx.begin();
- //操作
- Query query = session.createQuery("from Teacher as t where t.name =?");
- //参数绑定
- query.setString(0,"ty");
- //结果查看
- List<Teacher> ts = query.list();
- for(Teacher teacher :ts){
- system.out.println("teacher name is :"+teacher.getName());
- }
- //关闭事务
- tx.commit();
⑤:复杂查询基本用法
- 1)hibernate的简单查询,以id为条件的查询
- session.get();
- 2)把非id为条件的查询,归类于复杂查询
- 复杂查询的开发步骤:Query
- Query query = session.createQuery("HQL");
- querysetXXX();下标从0开始
- List result = query.list();
- 根据框架的特点:
- 在javaee的分层开发中,合理的使用。
- javaee:
- action:struts2/springMVC处理c层的控制器
- service:控制事务
- dao:hibernate处理数据访问操作