Hibernate基本概念和入门(一)

2022-06-17  本文已影响0人  程序猿峰岑

Hibernate简介

1.1项目中架构的体系结构
image.png
1.2 ORM框架
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框架
1.5Hibernate优点

Hibernate的简单使用

2.1Hibernate的使用步骤
<!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>
<!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>
 @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的核心文件的多种形式

 public Configuration configure() throws HibernateException {
        this.configure("/hibernate.cfg.xml");
        return this;
    }
3.2 SessionFactory工厂

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


image.png
3.3Session会话

SessionFactory提供了两种方法获取session

<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更新

//开启事务
        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 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的区别

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 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();
    }

}
上一篇 下一篇

猜你喜欢

热点阅读