美文网首页
Hibernate基本概念和入门(一)

Hibernate基本概念和入门(一)

作者: 程序猿峰岑 | 来源:发表于2022-06-17 01:46 被阅读0次

    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文件目录下
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">123456</property>
            <!--是否显示sql语句-->
            <property name="show_sql">true</property>
            <!--是否格式化sql语句-->
            <property name="format_sql">true</property>
            <!--是否自动提交事务-->
            <property name="hibernate.connection.autocommit">true</property>
            <!--配置JavaBean与表的映射文件-->
            <mapping resource="com/gfy/hibernate/domain/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
    
    • 编写映射文件hibernate.mapping *.hbm.xml声明对象如何关系连接库表字段,该文件放入与对应的Model同一目录下创建
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.gfy.hibernate.domain.User" table="t_user">
            <id name="uid" column="id">
                <!--generator id 的生成策略-->
                <generator class="native"></generator>
            </id>
            <property name="username"></property>
            <property name="password"></property>
        </class>
    </hibernate-mapping>
    
    • 调用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中配置
    <property name="hibernate.current_session_context_class">thread</property>
    

    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配置文件中设置

    <!--是否自动提交事务-->
    <property name="hibernate.connection.autocommit">true</property>
    
    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<Object> 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<Object> 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<Object> 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<Object> 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基本概念和入门(一)

          本文链接:https://www.haomeiwen.com/subject/bocfvrtx.html