zoukankan      html  css  js  c++  java
  • Hibernate学习笔记(二)

    Hibernate概述:

    什么是Hibernate:是一个持久层的ORM的框架
    什么是ORM:
    ORM:对象关系映射,指的是将一个java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以完成数据库的相关操作

    为什么学习Hibernate
    简化JDBC的开发
    性能很好

    Hibernate的API
    Configuration:加载配置文件
    SessionFactory:内部维护连接池。配置C3p0连接池,自定义工具类。

    Session:
    维护一级缓存,与数据库交互桥梁。
    常用的方法:
    save(Object obj)
    get()/load()
    update()
    delete()
    saveOrUpdate()

    Transaction:
    commit();
    rollback();


    #####持久化类编写的规则

    持久化类的概述

    【】什么是持久化?将内存中的一个对象持久化到数据库中过程。Hibernate框架就是用来进行持久化的框架

    【】什么是持久化类?一个java对象与数据库的表建立了映射关系,那么这个类在Hibernate中称为是持久化类
    【】持久化类=java类+映射文件


    持久化类编写的规则

    【】对持久化类提供一个无参数的构造函数 Hibernate底层需要使用反射生成实例

    【】属性需要私有,对私有属性提供public的get和set函数的方法 Hibernate中获取,设置对象的值

    【】对持久化类提供一个唯一标识OID与数据库主键对应 java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一记录,
    在Hiberbate中通过持久化类的OID的属性区分是否是同一对象

    【】持久化类中属性尽量使用包装类类型 因为基本数据类型默认是0,那么0就会有很多的歧义。包装类类型默认值就是null

    【】持久化类不要使用final进行修饰


    #####主键生成策略

     

    ######持久化类的三种状态


    ######Hibernate的一级缓存

    //区分三种状态
        public void demo1(){
                Session session=HibernateUtils.GetSession();
               //手动开启事务
               Transaction transaction=session.beginTransaction();
               HibernateDemo1 hibernateDemo1=new HibernateDemo1();//瞬时态对象:没有唯一标识OID,没有被Session管理
               hibernateDemo1.setCust_name("XXXX");
                session.save(hibernateDemo1);//持久态对象:有唯一标识OID,被Session管理
               transaction.commit();//事件的提交
               session.close();//会话关闭
              
               //session.clear();//清空所有
               //session.evict(hibernateDemo1);//清空一个对象。这是一级缓存的管理处理
               
               //脱管态对象:有唯一标识对象OID,没有被Session管理
              System.out.println("客户名称:"+hibernateDemo1.getCust_name());
        }


    #####事务的回首

    【】事务:事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么全部成功,要么全部都失败
    【】事务:事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么全部成功,要么全部都失败

    ####事务的特性:

    【】原子性:代表事务不可分割

    【】一致性:代表事务执行前后,数据的完整性保持一致

    【】隔离性:代表一个事务执行的过程中,不应该受到其他事务的干扰

    【】持久性:代表事务执行完成后,数据就持久到数据库中

    ####如果不考虑隔离的问题,会引发如下的安全问题:

    【】读问题

    #脏读:一个事务读到另一个事务未提交的数据

    #不可重复读:一个事务读到另一个事务已经提交的update数据,导致在前一个事务多次查询的结果不一致

    #虚读:一个事务读到另一个事务已经提交的insert数据,导致在前一个事务多次查询的结果不一致

    【】写问题(了解)

    #引发两类丢失更新

    【】读问题的解决

    #设置事务隔离级别

    #Read uncommitted 以上都问题都会发生

    #Read committed 解决脏读,但是不可重复读和虚读有可能发生

    #Repeatable read 解决脏读和不可重复读,但是虚读有可能发生

    #Serializable 解决所有读问题

    一般的情况下,数据库通常会使用第二或者第三种方式隔离,默认的oracle是使用第二种,而mysql是使用第三种

    关于在Hibernate中配置隔离的相关的问题--照片

    设置隔离级别 <property name="hibernate.connection.isolation">4</property>

    ####sevice事务:

    #####Hibernate的其他API

    【】Query

    public void queryTest(){
              Session session=HibernateUtils.GetSession();
              //手动开启事务
              Transaction transaction=session.beginTransaction();
              
              //通过Session获得Query接口
              String hql="from HibernateDemo1";//查询HIbernateDemo1中的对应表的数据,可以设置where
              org.hibernate.Query query=session.createQuery(hql);
              //设置条件
              //query.setParameter(0, "1");
              //设置分页
              query.setFirstResult(0);//起始数据
              query.setMaxResults(2);//每页的显示数
              List<HibernateDemo1> list=query.list();
              transaction.commit();//事件的提交
              session.close();//会话关闭
        }

    【】Criteria

    public void CriteriaTest(){
              Session session=HibernateUtils.GetSession();
              //手动开启事务
              Transaction transaction=session.beginTransaction();
              
              //通过session获得Criteria的对象
             /* Criteria criteria=session.createCriteria(HibernateDemo1.class);
              List<HibernateDemo1>list=criteria.list();//获取数据表的全部信息*/
              
              //条件查询
              Criteria criteria=session.createCriteria(HibernateDemo1.class);
              criteria.add(Restrictions.like("cust_name","宋%"));
              List<HibernateDemo1>list=criteria.list();//获取到查询的信息
              
              //设置分页
              criteria.setFirstResult(0);
              criteria.setMaxResults(3);
              
              transaction.commit();//事件的提交
              session.close();//会话关闭
        }

    【】SQLQuery

     

     

     信息类:

    public class HibernateDemo1 {
        
        private long cust_id;
        private String cust_name;
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_phone;
        private String cust_mobile;
        public long getCust_id() {
            return cust_id;
        }
        public void setCust_id(long cust_id) {
            this.cust_id = cust_id;
        }
        public String getCust_name() {
            return cust_name;
        }
        public void setCust_name(String cust_name) {
            this.cust_name = cust_name;
        }
        public String getCust_source() {
            return cust_source;
        }
        public void setCust_source(String cust_source) {
            this.cust_source = cust_source;
        }
        public String getCust_industry() {
            return cust_industry;
        }
        public void setCust_industry(String cust_industry) {
            this.cust_industry = cust_industry;
        }
        public String getCust_level() {
            return cust_level;
        }
        public void setCust_level(String cust_level) {
            this.cust_level = cust_level;
        }
        public String getCust_phone() {
            return cust_phone;
        }
        public void setCust_phone(String cust_phone) {
            this.cust_phone = cust_phone;
        }
        public String getCust_mobile() {
            return cust_mobile;
        }
        public void setCust_mobile(String cust_mobile) {
            this.cust_mobile = cust_mobile;
        }
        @Override
        public String toString() {
            return "HibernateDemo1 [cust_id=" + cust_id + ", cust_industry="
                    + cust_industry + ", cust_level=" + cust_level
                    + ", cust_mobile=" + cust_mobile + ", cust_name=" + cust_name
                    + ", cust_phone=" + cust_phone + ", cust_source=" + cust_source
                    + "]";
        }
        
        
    }

    工具类:

    public class HibernateUtils {
        //这个包的主要重用是为了放置工具类
        //这个工具类是Hibernate的工具类
        
        public static final Configuration cfg;
        public static final SessionFactory sf;//创建一个SessionFactory对象:类似于JDBC中连接池
        
        static{
            //加载Hibernate核心配置文件
            cfg=new Configuration().configure();
            sf=cfg.buildSessionFactory();//此处相当于创建工厂
        }
        //对外设置一个接口
        public static Session GetSession(){
            //通过SessionFactory获取到Session对象,类似于JDBC中的Connection
            return sf.openSession();
        }
    }
    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    Mysql:Changes in MySQL 5.6.6 (2012-08-07, Milestone 9):Group-Commit等等:重大变化版本!
    Mysql:Changes in MySQL 5.6.9 (2012-12-11, Release Candidate):GTID-based variables have been 【renamed】
    Mysql:Changes in MySQL 5.6.13 (2013-07-31, General Availability):不再支持可能引起混乱的【选项缩略】写法!
    Mysql:Changes in MySQL 5.6.22 (2014-12-01, General Availability):【sql-log-bin】
    Mysql:Changes in MySQL 5.6.30 (2016-04-11, General Availability):--ssl-mode:
    Mysql:Changes in MySQL 5.6.34 (2016-10-12, General Availability):secure-file-priv
    Windows Linux子系统Windows 10安装指南
    WSL2-参考的对象类型不支持尝试的操作。
    Win10开启Hyper-V后无法运行VMware虚拟机的解决方法
    Kubernetes---高可用的 K8S 集群构建
  • 原文地址:https://www.cnblogs.com/byczyz/p/11427494.html
Copyright © 2011-2022 走看看