zoukankan      html  css  js  c++  java
  • Hibernate第二篇【API讲解、执行流程图】

    前言

    从上一篇中已经大致介绍了Hibernate并且有了一个快速入门案例的基础了,….本博文主要讲解Hibernate API

    我们看看快速入门案例的代码用到了什么对象吧,然后一个一个讲解

    
        public static void main(String[] args) {
    
            //创建对象
            User user = new User();
            user.setPassword("123");
            user.setCellphone("122222");
            user.setUsername("nihao");
    
            //获取加载配置管理类
            Configuration configuration = new Configuration();
    
            //不给参数就默认加载hibernate.cfg.xml文件,
            configuration.configure();
    
            //创建Session工厂对象
            SessionFactory factory = configuration.buildSessionFactory();
    
            //得到Session对象
            Session session = factory.openSession();
    
            //使用Hibernate操作数据库,都要开启事务,得到事务对象
            Transaction transaction = session.getTransaction();
    
            //开启事务
            transaction.begin();
    
            //把对象添加到数据库中
            session.save(user);
    
            //提交事务
            transaction.commit();
    
            //关闭Session
            session.close();
        }
    

    Configuration

    配置管理类:主要管理配置文件的一个类

    拥有一个子类AnnotationConfiguration,也就是说:我们可以使用注解来代替XML配置文件来配置相对应的信息

    这里写图片描述

    configure方法

    configure()方法用于加载配置文件

    • 加载主配置文件的方法
      • 如果指定参数,那么加载参数的路径配置文件
      • 如果不指定参数,默认加载src/目录下的hibernate.cfg.xml

    buildSessionFactory方法

    buildSessionFactory()用于创建Session工厂


    SessionFactory

    SessionFactory–>Session的工厂,也可以说代表了hibernate.cfg.xml这个文件…hibernate.cfg.xml的就有<session-factory>这么一个节点

    openSession方法

    创建一个Session对象

    getCurrentSession方法

    创建Session对象或取出Session对象


    Session

    Session是Hibernate最重要的对象,Session维护了一个连接(Connection),只要使用Hibernate操作数据库,都需要用到Session对象

    通常我们在DAO层中都会有以下的方法,Session也为我们提供了对应的方法来实现

    
    public interface IEmployeeDao {
    
        void save(Employee emp);
        void update(Employee emp);
        Employee findById(Serializable id);
        List<Employee> getAll();
        List<Employee> getAll(String employeeName);
        List<Employee> getAll(int index, int count);
        void delete(Serializable id);
    
    }
    

    更新操作

    我们在快速入门中使用到了save(Objcet o)方法,调用了这个方法就把对象保存在数据库之中了。Session对象还提供着其他的方法来进行对数据库的更新

    • session.save(obj); 【保存一个对象】
    • session.update(obj); 【更新一个对象】
    • session.saveOrUpdate(obj); 【保存或者更新的方法】
      • 没有设置主键,执行保存;
      • 有设置主键,执行更新操作;
      • 如果设置主键不存在报错!

    我们来使用一下update()方法吧….既然是更新操作了,那么肯定需要设置主键的,不设置主键,数据库怎么知道你要更新什么。将id为1的记录修改成如下:

    
            user.setId(1);
            user.setPassword("qwer");
            user.setCellphone("1111");
            user.setUsername("zhongfucheng");

    这里写图片描述


    主键查询

    通过主键来查询数据库的记录,从而返回一个JavaBean对象

    • session.get(javaBean.class, int id); 【传入对应的class和id就可以查询】
    • session.load(javaBean.class, int id); 【支持懒加载】

    User重写toString()来看一下效果:

    
           User user1 = (User) session.get(User.class, 1);
            System.out.println(user1);
    

    这里写图片描述


    HQL查询

    HQL:hibernate query language 即hibernate提供的面向对象的查询语言

    • 查询的是对象以及对象的属性【它查询的是对象以及属性,因此是区分大小写的!】

    SQL:Struct query language 结构化查询语言

    • 查询的是表以及列【不区分大小写】

    HQL是面向对象的查询语言,可以用来查询全部的数据!

    
            Query query = session.createQuery("FROM User");
    
            List list = query.list();
            System.out.println(list);

    这里写图片描述

    当然啦,它也可以传递参数进去查询

            Query query = session.createQuery("FROM User WHERE id=?");
    
            //这里的?号是从0开始的,并不像JDBC从1开始的!
            query.setParameter(0, user.getId());
    
            List list = query.list();
            System.out.println(list);
    

    这里写图片描述


    QBC查询

    QBC查询: query by criteria 完全面向对象的查询

    从上面的HQL查询,我们就可以发现:HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码….QBC查询就是完全的面向对象查询…但是呢,我们用得比较少

    我们来看一下怎么使用吧:

    
            //创建关于user对象的criteria对象
            Criteria criteria = session.createCriteria(User.class);
    
            //添加条件
            criteria.add(Restrictions.eq("id", 1));
    
            //查询全部数据
            List list = criteria.list();
            System.out.println(list);

    这里写图片描述


    本地SQL查询

    有的时候,如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!

    但是呢,它有一个缺陷:它是不能跨平台的…因此我们在主配置文件中已经配置了数据库的“方言“了。

    我们来简单使用一下把:

    
            //将所有的记录封装成User对象存进List集合中
            SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM user").addEntity(User.class);
    
            List list = sqlQuery.list();
    
            System.out.println(list);
    

    这里写图片描述

    beginTransaction方法

    开启事务,返回的是一个事务对象….Hibernate规定所有的数据库操作都必须在事务环境下进行,否则报错!


    Hibernate执行流程图

    这里写图片描述

  • 相关阅读:
    函数地址经典基础C++笔试题(附答案)
    类型事务修改 mysql 表类型 实际测试可执行
    ARM7,ARM9有哪些区别
    I2C,SPI,UART总线的区别详解
    I²C
    AnyWhere——面向设备的编程模式
    Linux设备驱动编程之内存与I/O操作
    http://www.ibm.com/developerworks/cn/linux/lcnspidermonkey/index.html
    PCI Express总线接口板的设计与实现
    armfans文章搜集
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202972.html
Copyright © 2011-2022 走看看