zoukankan      html  css  js  c++  java
  • 【Hibernate】04 主键策略 & CRUD

    实体类编写规范:

    - 每个属性不应该被公开的访问,设置私有

    - 提供可以访问和设置的方法,GETTER & SETTER

    - 必须编写一个主键属性【ID 唯一值】

    - 建议使用基本类型的包装类,因为基本类型不可以表示NULL


    主键生成策略:

    - HIbernate 要求实体类里面有一个属性作为唯一的值,对应表主键,主键可以不填

    <generator class="native" /> <!-- 主键自增策略 -->

    - 策略值项:

      1、increment 

        支持long、int、short类型,自增方式的唯一标识,步长1,

        无其他进程插入SQL可使用,不支持多线程操作【脏数据危险】

      2、identity 

        采用数据库底层提供的主键生成标识符,

        必须是数据库支持的数据类型

      3、sequence 

        根据底层数据库序列生成标识符,

        条件是数据库支持序列

      4、native 

        底层数据库对自动生成标识符的能力来选择【2、3、Hilo】其中的一种,

        可跨数据库平台开发

        【生成:主键、非空、自增、int类型】

      5、uuid 

        128位的UUID算法生成标识符,

        绝对唯一标识,占用空间太多

        【生成:主键、非空、VARCHAR类型】

        Java数据类型要使用Java.lang.String

      6、assigned

        由Java程序生成标识符,

        如果没有指定generator元素,默认使用此策略【自然主键】


    按ID查询:

        @Test
        public void query01(){
            Session session = HibernateUtil.getSession();
            
            // 实体类的字节对象,ID值
            User user = session.get(User.class, 4);
            System.out.println(user);
            session.close();
        }

    修改操作:

    先查询,再修改

    从思路上是正确的,实际上不需要查询的步骤,

    只需要new 一个对象,输入新的字段值和要修改的原始ID

    调用UPDATE方法就行了。

    另外SAVE也可以用来修改,但是这违背了使用规范,不要这么使用就对了

        @Test
        public void query02(){
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            Session session = sessionFactory.openSession();
    
            Transaction transaction = session.beginTransaction();
    
            // 实体类的字节对象,ID值
            User user = session.get(User.class, 4);
            System.out.println(user);
    
            // 修改字段
            user.setUser_name("用户1004");
    
            // 更新操作
            session.update(user);
    
            transaction.commit();
            session.close();
            sessionFactory.close();
        }

    注意:

    只修改部分字段,建议使用查询,再改值,在调用修改,因为可以保证其他不变的字段不改动

    另外频繁这么修改,性能效率很低,本质上UPDATE是对这个记录完全覆写,

    如果数据表一个字段数特别的多,调用修改性能效率真的很低

    删除操作:

    先查找,后删除

        @Test
        public void query03(){
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            Session session = sessionFactory.openSession();
    
            Transaction transaction = session.beginTransaction();
    
            // 实体类的字节对象,ID值
            User user = session.get(User.class, 4);
            System.out.println(user);
            
            // 删除操作
            session.delete(user);
            
            transaction.commit();
            session.close();
            sessionFactory.close();
        }

    也可以是直接获取ID然后封装给实体类对象

    再注入给删除操作

            User user = new User();
            user.setUser_id(1);
    
            // 删除操作
            session.delete(user);

    实体类对象的状态

    - 瞬时状态 

      对象没有ID值,对象和Session没有关联

    - 持久状态

      通过Session获取的,对象和Session具有关联关系

    - 托管状态

      对象有ID值,对象和Session没有关系


    SaveOrUpdate方法

    根据实体类实例的状态来调用不同的操作

    - 注入瞬时状态的对象,执行的是添加操作

    - 注入托管状态的对象,执行的是修改操作

    - 注入持久状态的对象,执行的是修改操作


     

  • 相关阅读:
    GUI编程
    Markdown学习
    [python3]正则表达式
    python3_json&pickle
    python3_module_sys
    python3_module_os
    Python3_module_random
    Pyhton3_module_time()
    Python3 正则表达式 Regular Expression
    Python循环对象
  • 原文地址:https://www.cnblogs.com/mindzone/p/12864255.html
Copyright © 2011-2022 走看看