Hibernate学习(一)


Hibernate相当于对JDBC做了一层封装。

ORM:对象关系映射,更加方便的处理模型数据。一套标准的,简单的,易于被传递的,关于对象和关系的映射。

JDBC的缺点:

  • 开发效率低
  • 重复性工作多
  • 代码冗余(pstmt的setXX方法,方法参数冗余的getXX()方法,如果POJO的属性很多,代码增加)

Hibernate

一个开源的对象关系映射框架
对JDBC进行了非常轻量级的对象封装
将JavaBean对象和数据库的表建立对应关系。

Hiberntate的优势

Hibernate是一个优秀的Java持久化层解决方案。
是当今主流的对象——关系映射工具。
Hibernate简化了JDBC繁琐的编码。
Hibernate将数据库的连接信息都存放在配置文件中。

持久化

将程序中数据在瞬时状态和持久状态间转换的机制。

这里写图片描述

持久化层

JDBC就是一种持久化机制
将程序数据直接保存成文本文件也是持久化机制的一种实现。
在分层结构中,DAO层(数据访问层)也被称为持久化层。

持久化完成的操作

将对象保存到关系型数据库中,
将关系型数据库中的数据读取出来以对象的形式封装。

这里写图片描述


ORM(对象关系映射)

ORM(Object Relational Mapping),对象关系映射。

  • 编写程序的时候,以面向对象的方式处理数据。
  • 保存数据的时候,却以关系型数据库的方式存储。

ORM解决方案包含下面四个部分:

  • 在持久化对象上执行基本增、删、改、查操作的API。
  • 用于对持久化对象或属性查询的一种语言或者API.
  • 用于实体关系映射的工具。
  • 能够与事务对象交互、执行检查、延迟加载以及其他优化功能。

使用Hibernate操作数据库

使用Hibernate操作数据库需要七个步骤

(1)读取并解析配置文件
Configuration conf = new Configuration().configure();
(2)读取并解析映射信息,创建SessionFactory
SessionFactory sf = conf.buildSessionFactory
(3)打开Session
Session session = sf.openSession();
(4)开始一个事物(增删改操作必须,查询操作可选)
Trabsaction tx = session.begin Transaction();
(5)数据库操作
session.save(user);
(6)提交事务
tran.commit();
(7)关闭Session
session.close();

增删改需要开启事物,查询不需要

添加操作:
/*      User user = new User();
        user.setName("aaa");
        user.setPwd("123");
        //5.数据库操作
        session.save(user);*/
更新数据:
/*      User user = new User();
        user.setId(3);
        user.setName("bbb");
        user.setPwd("sss");
        session.update(user);*/
删除操作:
    /*  User user = new User();
        user.setId(3);
        session.delete(user);*/
查询操作:
        User user=(User)session.get(User.class, 2);
        System.out.println(user);

Hibernate的运行实例

首先,将Jar包导入,lib文件导入根目录下。
然后右键,Build Path 添加进系统虚拟机运行文件之中。

这里写图片描述

然后,在包com.jredui.entity下,新建一个实体类User;并创建hibernate映射文件(User.hbm.xml)。

– package对应实体类的包 –>
– 每一个实体类对应一个hibernate映射文件 –>
– Mybatis每一个Dao层文件对应一个映射文件 –>

Hibernate的配置文件:
这里写图片描述

Hibernate.cfg.xml配置文件配置数据库的连接信息等;

  • 用于配置数据库连接;
  • 运行时所需的各种属性;
  • 默认文件名为”hibernate.cfg.xml”

创建Hibernate配置文件
这里写图片描述


Hibernate查询操作

Hibernate支持两种主要的查询方式

HQL(Hibernate Query Language,Hibernate查询语言)查询;

是一种面向对象的查询语言,其中没有表和字段的概念。,只有类,对象和属性的概念。
HQL是应用较为广泛的方式

Criteria查询

又称为“对象查询”,它用面向对象的方式将构造查询的过程做了封装。

为什么使用HQL?

使用HQL可以避免使用JDBC查询的一些弊端;

  • 不需要再编写繁复的SQL语句,针对实体类机器属性进行查询
  • 查询结果是直接存放在List中的对象,不需要再次封装。
  • 独立于数据库,对不同的数据库根据Hibernate dialect属性的配置自动生成不同的SQL语句执行。

这里写图片描述

使用HQL需要四步

  • 得到Session
  • 编写HQL语句
  • 创建Query对象(Query接口是HQL查询接口,它提供了各种的查询功能;)
  • 执行查询,得到结果

设置别名(alias)

from Street as as === from Street s
s是Street的别名,通过as关键字指定,关键字as是可选的。

Hibernate的基本使用(HQL语句)

HQLTest.java
    @Test
    public void test() {
        //1.编写HQL语句
        String hql="from User";
        //2.创建Query对象
        Query query = session.createQuery(hql);
        //3.执行查询,得到结果
        List<User> list = query.list();
        System.out.println(list);
    }

where子句、占位符

where子句

where子句指定限定条件:
(通过与SQL相同的比较操作符指定条件)
如:

  • =、<>、<、>、>=、<=
  • between and、not between and
  • in、not in
  • is、like

(通过and、or等逻辑连接符组合各个逻辑表达式)
-
这里写图片描述

占位符

?  占位符
  • 使用?作占位符,可以先设定查询参数
  • 通过setType()方法设置指定的参数
  • 必须保证每个占位符都设置了参数值
  • 必须依照?所设定顺序设定
  • 下标从0开始,而不是使用PrepareStatement对象时的从1开始

这里写图片描述


命名参数、封装参数

命名参数

:name即命名参数
标识了一个名为“name”的查询参数
根据此参数进行参数值设定
不需要依照特定的顺序

这里写图片描述
语法:

:参数名字
@Test
    public void test2(){
        //命名参数,语法     :参数名字
        String hql="select u.name from User u where u.id=:id";
        Query query = session.createQuery(hql);
        query.setParameter("id", 2);
        List<User> list=query.list();
        System.out.println(list);
    }

封装参数

  • 动态设置查询参数
  • 将参数封装为一个bean
@Test
    public void test3(){
        //封装参数
        String hql="select u.name from User u where 1=1";
        User user = new User();
        user.setId(1);
        if(user.getId()>0){
            hql+="and id=:id";
        }
        if(user.getName()!=null){
            hql+="and name=:name";
        }
        Query query=session.createQuery(hql);
        //传参
        query.setProperties(user);
        List<User> list = query.list();
        System.out.println(list);
    }

聚合函数

count():统计函数
max()和min():最大值和最小值函数
avg()和sum():平均值和求和函数

这里写图片描述
排序:(默认升序:ASC 降序:DESC )

  • order by子句实现对查询结果的排序
  • 默认情况下按升序顺序排序
  • 排序策略(asc升序、desc降序)

这里写图片描述

分组

  • 通过group by子句实现
  • 并使用having子句对group by返回的结果集进行筛选

这里写图片描述


分页、子查询

分页

Query对象提供了简便的分页方法
    setFirstResult(int firstResult)方法
        设置第一条记录的位置
    setMaxResults(int maxResults)方法
        设置最大返回的记录条数(pageSize)

这里写图片描述

子查询:

  • ·子查询是SQL中非常重要的功能
  • HQL同样支持此机制
  • Hibernate子查询必须用圆括号包围且必须出现在where子句中
原文地址:https://www.cnblogs.com/aixing/p/13327637.html