• Hibernate框架


    一.框架:java中的框架指的是在实现功能的前提下少些一部分代码。
    二.Hibernate框架:
            1.应用在javaee持久层(dao)的框架;
            2.在dao层里对数据库进行crud操作,使用hibernate框架(使用orm思想)进行crud操作。hibernate底层实际上就是对jdbc的封装;使用hibernate的好处:不用写复杂的jdbc代码,不用写sql语句实现;
            3.hibernate开源的轻量级框架。
    三.ORM思想(对象关系映射):
            1.让实体类(javabean)和数据库表一一对应(让实体类和数据库表对应,实体类的私有属性和数据表的字段对应);
            2.不用操作数据库表,只需操作数据库表对应的实体类;
            3.session对象(里面相当于封装的jdbc操作),例如:
                实体类User,  User u = new User();
                                      u.setName("张三");
                                      session.save(u);    // 就相当于在user表中添加了一个username为张三的用户
            jdbc操作:
            1.创建连接:Connection conn = DrverManager.getConnection(url,username,password);
               2.对sql进行预编译操作:
                        String sql = "select * from user";
                        PrepareStatement pst = conn.prepareStatement(sql);
            3.执行sql:ResultSet r = pst.executeQuerry();
            4.遍历结果集;
            5.关闭资源: conn.close().
    四.Hibernate框架的基本练习:
            1.导入相关jar包;
            2.创建实体类,创建映射的表(可以手动创建,也可以用Hibernate创建);
            3.配置实体类和数据库表的映射关系(一一对应关系):使用配置文件实现。
            (1)映射配置文件的名称和位置没有特殊要求,一般放在实体类的包下,名称采用实体类名.hnm.xml格式;
            (2)User.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 导入dtd约束 -->
    <!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:实体类的全路径
            table:映射的数据库表名
         -->
        <class name="cn.xiaolige.entity.User" table="user">
            <!-- 配置hibernate实体类id和表id对应
                Hibernate要求实体类要有一个属性唯一值和数据库表字段唯一值
             -->
             <!-- id标签
                 name:实体类里的id属性名
                 column:数据库中的id字段名
              -->
            <id name="uid" column="uid">
                <!--设置数据库表id增长策略
                    native:生成表id值就是主键自动增长
                  -->
                <generator class="native"></generator>
            </id>
            <!-- property 其他属性标签 -->
            <property name="username" column="username"></property>
            <property name="age" column="age"></property>
        </class>
    </hibernate-mapping>
                (3)创建hibernate的核心配置文件:文件名和位置固定,hibernate加载过程中只会加载核心配置文件(所以其他配置文件要引入)
                        文件名:hibernate.cfg.xml位置:src包下(或和src同级别的包下);
    <?xml version="1.0" encoding="UTF-8"?>
    <!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:///hibernate</property>        
            <property name="hibernate.connection.username">root</property>        
            <property name="hibernate.connection.password">root</property>
        
            <!-- 配置hibernate信息  可选-->
            <!-- 输出底层sql语句 -->
            <property name="hibernate.show_sql">true</property>
            <!-- 输出底层sql语句格式 -->
            <property name="hibernate.format_sql">true</property>
            <!-- 
                想要hibernate帮助创建表需配置hibernate.hbm2ddl.auto
                update表示如果有表更新如果没有表创建
             -->
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!-- 只能识别mysql数据库的方言
                例如在mysql中分页用limit,在oracle中分页用rownum
                有了这个属性org.hibernate.dialect.MySQLDialect就能识别类似limit的mysql的方言了
             -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> -->
            <!-- 把映射文件User.hbm.xml放到核心配置文件中 -->
            <mapping resource="cn/xiaolige/entity/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>        
                                      
                (4)实现添加操作:
                        1.加载hibernate核心配置文件;
                        2.创建sessionFactory对象;
                        3.使用sessionFactory创建session对象;
                        4.开启事物;
                        5.写具体逻辑crud操作;
                        6.提交事物;
                        7.关闭资源。
        @Test
        public void insert() {
    //        1.加载hibernate核心配置文件;
            //在src下找到名称是hibernate.cfg.xml文件,并且封装到对象里
            Configuration cfg = new Configuration().configure();
    //        2.创建sessionFactory对象;
            //读取hibernate核心文件后创建sessionFactory对象,在过程中根据映射关系在配置数据库里面把表创建
            SessionFactory sessionFactory = cfg.buildSessionFactory();
    //        3.使用sessionFactory创建session对象(类似于jdbc中的connection);
            Session session = sessionFactory.openSession();
    //        4.开启事物;
            Transaction tx = session.beginTransaction();
    //        5.写具体逻辑crud操作;
            User u = new User();
            u.setUsername("张三");
            u.setAge("18");
            session.save(u);
    //        6.提交事物;
            tx.commit();
    //        7.关闭资源。
            session.close();
            sessionFactory.close();
        }
     
     
    session对象的方法实现crud:
        save():添加操作;
        update():修改;
        delete(Object):删除两种删除模式a.先根据id查出一个对象,然后再Delete;b.new 一个新对象,设置这个对象的id,再调用delete();
          get(实体类.class,id值):根据id查询;
          saveOrupdate():对象是瞬时态做添加操作,是持久态和托管态做修改操作;(也可以理解为对象设置id则进行修改操作,无id则进行添加操作)
    session对象是单线层对象(session对象只能自己使用不能共用)。
     
    Transaction :事物就是操作中最基本的单元要么同时成功要么同时失败,
    事物的四个特性:
    原子性:一组操作要么同时成功要么同时失败;
    一致性:操作前和操作后数据不发生变化(例如转账前后钱数不能变);
    隔离性:多个事物操作一组数据时互不影响;
    持久性:事物commit后写入数据库(磁盘);
    事物的规范代码:
            try {
                    开启事物;
                    提交事物
            }catch{
                    回滚事物
            }finally{
                    关闭资源
            }
    需要配置事务的隔离级别
      read uncommited
      read commited
      repatable read
      serialzable
     
     * hibernate中也可以设置事务的隔离级别
       <property name="hibernate.connection.isolation">4</property>
     * 事务控制在那一层?
      service
      hibernate中获取与当前现场绑定的session
       1.在xml中配置当前线程绑定session
       2.使用factory的getCurrentSession方法获取
       3.使用与当前线程绑定的session不需要手动关闭
    五,实体类的编写规范:
    1.属性私有;
    2,公有的set,get方法;
    3.要求实体类里有属性作为唯一值(一般使用id);
    4.实体类数据类型建议不使用基本数据类型,使用基本数据类型的包装类(例如Character
        要表示一个学生成绩为0,和一个学生没参加考试,要是int score = 0;就不行Integer score = 0;Integer score = null;则可以
    );
    5.实体类的三种状态:
            瞬时态:对象无id,与session没有关系
            持久态:对象有id,与session有关系
            托管态:对象有id,与session没有关系
    六,主键生成策略:
    主要用native:根据使用的数据库帮选择哪个值
                uuid:hibernate自动帮我们生成一个uuid值
     
    什么是缓存:数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高,把数据存到内存里面不需要使用流方式可以直接读取内存中数据,把数据放到内存中提高读取效率。
     
    七,Hibernate缓存:
    1.一级缓存:Hibernate的一级缓存是默认打开的,使用范围是session的使用范围;存储的数据必须是持久态的;
    持久态会自动更新数据库(不用调update()或saveOrupdate()方法);
    2.二级缓存:redis替代了,
    八,Hibernate的api:
    hibernate查询
     
     * list:接受集合数据
       uniqueResult:接受唯一的结果集
     
     1.HQL查询
     
      hql:hibernate query language
      使用Query对象进行查询,在创建query对象的时候需要接受一个HQL语句:hql查询
      hql语句和sql语句很类似(sql查询的是字段和数据库表,hql查询的是对象和对象中的属性)
      hql和sql语句的语法基本一致
      hql查询是一种比较面向对象的查询方式(调用方法实现一些功能:分页)
      查询全部,倒叙查询,分页查询,条件查询,统计查询,投影查询
     2.QBC查询
      使用Criteria对象进行查询 (qbc:query by criteria)
      qbc查询是一种完全面向对象的查询语言
      查询全部,倒叙查询,分页查询,条件查询,统计查询,离线查询
     
      步骤:
       1.创建Criteria
        session.crateCriteria(class)
       2.调用方法,对查询的参数进行赋值
       3.接受返回结果
        criteria.list
        criteria.uniqueResult
     
      addOrder // 添加排序
      setProjection //添加统计函数
     3.SQL查询
     
     
     
     
     
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





    出身决定命运,但努力一定不会错。
  • 相关阅读:
    VS2019远程调试
    windows下使用redis-desktop-manager远程连接redis失败问题
    无法打开到SQL Server的连接 (Microsoft SQL Server, 错误:53) .
    由于管理员设置的策略,该磁盘处于脱机状态
    window下ping端口tcping
    dos命令远程登陆window server服务器并重启
    大二寒假作业之Android
    大二寒假作业之Android
    大二寒假作业之Android
    大二寒假作业之JavaWeb
  • 原文地址:https://www.cnblogs.com/xiaolige/p/9247837.html
Copyright © 2020-2023  润新知