Hibernate基本概念和入门(一)

Hibernate简介

1.1项目中架构的体系结构
image.png
1.2 ORM框架
  • 对象关系映射(英语:Object Relational Mapping简称ORM)
  • 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
  • Object对象,java对象此处特指JavaBean
  • Relational 关系二维表、数据库中的表
  • Mapping映射
1.3什么是Hibernate

Hibernate是一个开源源代码的对象关系映射框架,他对于JDBC进行了非常轻量级的对象封装

它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,POJO(Plain Ordinary Java Object)简单的java对象,实际就是普通的JavaBean

Hibernate 可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库

Hibernate可以应用在任何的JDBC的场合,即可以在Java的客户端程序使用,也可以在Servlet.jsp的web应用中使用

Hibernate是一个数据持久化的ORM框架,它的主要功能就是把对象映射到表中,操作API,只需要将一个对象存储到数据库,不需要写SQL语句

Hibernate也提供了对关系型数据库的增删改查操作


image.png
1.4主流的ORM框架
  • JPA Java persistence API JPA通过JDK5.0注解或xml描述对象关系表的映射
  • Hibenate最流行ORM框架,通过对象关系映射配置,可以完全脱离底层
  • MyBatis本是apache的一个开源项目iBatis支持的普通SQL查询存储过程和高级映射的优秀持久层框架
1.5Hibernate优点
  • Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问繁琐的重复性代码
    Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的ORM实现,它很大程度上简化了DAO层编码工作session.save(user)
    Hibernate使用Java的反射机制
    Hibernate性能非常好,因为它是一个轻量级框架,映射的灵活性很出色,它支持很多关系型数据库,从一对一到多对多的各种复杂关系

Hibernate的简单使用

2.1Hibernate的使用步骤
  • 下载Hibernate的jar包,并导入到项目中下载地址
  • 创建数据库和表


    image.png
  • 配置核心的配置文件hibernate.cfg.xml 这个文件有连接数据库的配置,创建该文件并放入到src文件目录下



    
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/hibernate_day01
        root
        123456
        
        true
        
        true
        
        true
        
        
    

  • 编写映射文件hibernate.mapping *.hbm.xml声明对象如何关系连接库表字段,该文件放入与对应的Model同一目录下创建


    
        
            
            
        
        
        
    

  • 调用hibernate的api
 @Test
    public void test01() {
        //保存用户数据
        //1.获取核心配置文件对象,默认是加载src的hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();
        //2.创建会话工厂
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //创建会话[会话相当于连接connect]
        Session session = sessionFactory.openSession();
        //开启事务
        Transaction transaction = session.getTransaction();
        transaction.begin();
        //保存【直接把对象保存到数据库】
        User user = new User();
        user.setUsername("gyf");
        user.setPassword("123");
        session.save(user);
        //提交事务
        transaction.commit();
        //关闭会话
        session.close();
        //关闭工厂释放资源
        sessionFactory.close();
    }
jar包功能解析图
image.png

3 Hibernate API详解

3.1 Configuration配置对象

Hibernate的核心文件的多种形式

  • hibernate.cfg.xml通常使用xml配置文件,可以配置内容更丰富
  • hibernate.properties用于配置key/value形式的内容。key不能充分的配置有很多的局限性。一般不用
    Configuration对象用于加载配置文件
    new Configuration构造方法配置加载的是hibernate.properties,configue()方法加载hibernate.cfg.xml,默认情况下上面两种配置都可以放在src目录下,configure(String resource)这个方法可以指定配置文件的路径
 public Configuration configure() throws HibernateException {
        this.configure("/hibernate.cfg.xml");
        return this;
    }
3.2 SessionFactory工厂

连接池操作数据库和Session操作数据库流程图对比


image.png
  • SessionFactory相当于Java Web连接池,用于管理所有的Session
  • 获得SessionFactory方式config.buildSessionFactory()
  • SessionFactory还用于缓存配置信息(数据库配置信息,映射文件预定HQL语句等)
  • SessionFactory线程安全的可以是成员变量,多个线程同时访问时,不会出现线程并发问题
3.3Session会话

SessionFactory提供了两种方法获取session

  • factory.openSession();获取一个全新的session
  • factory.getCurrentSession()获取一个与当前线程绑定的session
    如果要使用第二种方法
    a.必须在hibernate.cfg.xml中配置
thread

b.hibernate支持将创建的session绑定到本地线程中,底部使用ThreadLocal,在程序之间共享Session
c.如果提交或者回滚事务,底层将自动关闭session

 //创建会话[会话相当于连接connect]
        Session session = sessionFactory.openSession();
        Session session_1 = sessionFactory.openSession();
        Session session1 = sessionFactory.getCurrentSession();
        Session session2 = sessionFactory.getCurrentSession();
        System.out.println(session.hashCode());
        System.out.println(session_1.hashCode());
        System.out.println(session1.hashCode());
        System.out.println(session2.hashCode());
        new Thread(){
            @Override
            public void run() {
                super.run();
                Session session3 = sessionFactory.getCurrentSession();
                Session session4 = sessionFactory.getCurrentSession();
                System.out.println(session3.hashCode());
                System.out.println(session4.hashCode());
            }
        }.start();
        //关闭会话
        session.close();
        session_1.close();
3.4Transaction事务

掌握hibernate怎么获取事务,开启、提交和回滚事务
获得事务Transaction trans = session.getTransaaction();
trans.begin:开启事务 、 trans.commit:提交事务 trans.rollback回滚事务
扩展,不需要手动的管理事务,之后所有的事务管理都交于Spring
事务也可以在hibernate.cfg.xml配置文件中设置


true
3.5Session的API

save保存

User user = new User();
user.setUsername("gyf");
user.setPassword("123");
session.save(user);

get通过id查询,如果没有null

User user = (User) session.get(User.class,7);
        if (user != null) {
            System.out.println(user);
        }else{
            System.out.println("user is null");
        }

load通过id查询,如果没有抛异常

try{
            User user = (User) session.load(User.class,7);
        }catch (Exception e){
            e.printStackTrace();
        }

upload更新

  • 获取数据,调用set方法赋值,自动更新执行update方法
//开启事务
        Transaction transaction = session.getTransaction();
        transaction.begin();
        User user = (User) session.get(User.class,1);
        if (user != null) {
            user.setPassword("123456");
            session.update(user);
        }
        //提交事务
        transaction.commit();
  • 方法二,自己封装User对象,设置id时候需要调用update方法
User user = new User();
        user.setUid(2);
        user.setUsername("lisi");
        user.setPassword("1234");
        session.update(user);

delete删除
方法一

 User user = (User) session.get(User.class,2);
        session.delete(user);

方法二

   User user = new User();
        user.setUid(2);
        session.delete(user);
3.6 get和load的区别
  • get方法是直接加载数据库
  • load的设计是依赖懒加载,用到时才会查询数据库
  • load方法返回的是对象的一个代理

load的执行流程图


image.png
3.7Query查询对象

HQL:Hi9bernate Query Language 的缩写,就是Hibernate的查询语言,面向对象查询语言,最终底层要转成面向数据库查询语言
Query:用于查询对象,可以设置条件和分页查询

    Query query = session.createQuery("from User where username=? and password=?");
        query.setParameter(0,"gyf");
        query.setParameter(1,"123456");
       User user = (User) query.uniqueResult();
3.8 Criteria

QBC(query by criteria)hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作

  • Criteria:Hibernate独创的查询对象,全程无hql语句
    eq等于
        Criteria criteria = session.createCriteria(User.class);
        criteria.add(Restrictions.eq("username","gyf"));
        User user = (User) criteria.uniqueResult();

gt大于 注意如果是一条数据则使用uniqueResult 如果是返回多条数据使用上面的方法就会报错,需要使用list方法

    Criteria criteria = session.createCriteria(User.class);
        criteria.add(Restrictions.gt("uid",2));
        User user = (User) criteria.uniqueResult();

ge大于等于

 Criteria criteria = session.createCriteria(User.class);
        criteria.add(Restrictions.ge("uid",2));
        List objs=  criteria.list();
        for (int i = 0; i < objs.size(); i++) {
            Object obj = objs.get(i);
            System.out.println(obj);
        }
 
 

lt小于

criteria.add(Restrictions.lt("uid",2));
        List objs=  criteria.list();
                for (int i = 0; i < objs.size(); i++) {
                    Object obj = objs.get(i);
                    System.out.println(obj);
                }
 
 

le小于等于

 criteria.add(Restrictions.le("uid",2));
        List objs=  criteria.list();
                for (int i = 0; i < objs.size(); i++) {
                    Object obj = objs.get(i);
                    System.out.println(obj);
                }
 
 

模糊查询

 criteria.add(Restrictions.like("username","%s%"));
        List objs=  criteria.list();
                for (int i = 0; i < objs.size(); i++) {
                    Object obj = objs.get(i);
                    System.out.println(obj);
                }
 
 
3.9 SQLQuery

SQLQuery使用原生的SQL语句查询
使用原生SQL来查询数据

   SQLQuery query = session.createSQLQuery("select * from user");
        List objs = query.list();
        for (int i = 0; i < objs.size(); i++) {
            Object object = objs.get(i);
            System.out.println(object);
        }
Hibernate封装工具类
public class HibernateUtils {
    private static SessionFactory factory;
    static {
        Configuration cfg = new Configuration().configure();
        factory = cfg.buildSessionFactory();
        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                super.run();
                System.out.println("------close sessionFactory-------");
                factory.close();
            }
        });
    }

    public static Session openSession() {
        return factory.openSession();
    }

    public static Session getCurrentSession() {
        return factory.getCurrentSession();
    }

}

你可能感兴趣的:(Hibernate基本概念和入门(一))