Hibernate基础

Posted 海盗屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate基础相关的知识,希望对你有一定的参考价值。

Hibernate中的实体规则

  创建实体类注意事项:

    1.持久化类提供无参构造函数

    2.成员变量私有 提供共有get set 方法

    3.属性应尽量使用包装类 Integer、Float、Double等(如果用int 不赋值会默认0 如果Integer 不赋值默认null)

    4.持久化类需要提供oid,与数据库中的主键列对应

    5.不要用finall修饰类

  主键类型:

    1.自然主键(少见) 如果业务需要 某列必须有,且不重复,可以作为主键使用

    2.代理主键(常见) 如果没有业务逻辑只需要一个数字 可以用这个

  主键生成策略:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.hibernate.domain">    
    <class name="User" table="User">
        <!--id:主键,name:属性名称,column:字段名称  -->
        <id name="UserId" column="UserId">
            <!--generator:主键生成策略 class:标记主键如何生成 取值:
            1、native:自动增长,会根据当前的数据库自动切换
            2、identity:mysql自己维护主键,录入时不需要指定主键
            3、sequence:Oracle的自增标记
            4、uuid:32位字符串
            5、assigned:自定义字符串
            6、foreign:外键
            7、increment:hibernate自己查询最大id+1进行插入-->
            <generator class="native"/>
        </id>
       
    </class>
</hibernate-mapping>

 

Hibernate中的对象状态

  瞬时状态

    没有id,没有与session关联

  持久化状态

    有id,与session关联

  游离|托管状态

    有id,没有与session关联

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.openSession();
        User user = new User(); //瞬时状态 没有id 没有与session关联
        user.setUserName("哈哈");
        session.save(user); //持久化状态 有id 有关联session
        session.close(); //游离|托管状态 有id,没有关联session
    }
}

 

Hibernate中的一级缓存

  为了提高数据库中的操作效率

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.openSession();
        User u1= session.get(User.class,1);
        User u2= session.get(User.class,1);
        User u3= session.get(User.class,1);
        User u4= session.get(User.class,1);
        User u5= session.get(User.class,1);
        System.out.println(u3==u4); //true
        session.close();
    }
}

  第一次执行步骤:

    1.调用get查询

    2.发送sql语句

    3.resultSet返回

    4.将resultset中的内容组装成User对象

    5.存入session缓存

    6.对象返回

  第二次执行步骤:

    1.先从缓存中查看是否存在id为1的user对象

    2.如果有直接返回缓存中的

    

Hibernate中的事务

  事务特性:ACID(原子性、一致性、隔离性、持久性)

  事务并发问题:

    脏读:读到了正在操作还没提交的数据。

    不可重复读:两次连续读取,数据不一致。(中间可能有人修改了)

    幻|虚读:把user表整表删掉,结果有个人加了一条进去。

  事务的隔离级别:

    读未提交:会出现脏读、不可重复读、幻读

    读已提交:可以解决脏读,不可解决不可重复读,幻读

    可重复读:可以解决脏读,不可重复读,不可解决幻读 (mysql默认级别)

    串行化:都可以解决,降低效率

  在hibernate中指定数据库的隔离级别:

    在hibernate.cfg.xml全局配置中

<!--
         0001 1: 读未提交
         0010 2: 读已提交
         0100 4: 可重复读
         1000 8: 串行化 -->
        <property name="hibernate.connection.isolation">4</property>

  在项目中管理事务:

    业务开始前打开事务,业务执行之后提交事务,执行过程中出现异常,回滚事务。

    为了保证事务session对象的一致性,需要使用getCurrentSession(); 需要配置全局配置文件

<!--开启currentSession -->
        <property name="hibernate.current_session_context_class">thread</property>
        Session session1 = HibernateUtils.getCurrentSession();
        Session session2 = HibernateUtils.getCurrentSession();
        System.out.println(session1==session2); //true

返回同一个与线程绑定的session。

通过getCurrentSession()方法获得的session对象 提交事务时,自动会关闭session,不需要我们手动session.close()关闭。

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.getCurrentSession();
        Transaction trans = session.beginTransaction();
        try{
            session.save(new User("haha","hh",18,"男"));
        }catch (Exception e){
            trans.rollback();
        }
        trans.commit();
    }
}

 

Hibernate中的批量查询

  HQL查询(Hibernate Query Language)主要用法

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.openSession();

        //查询userList
        String hql = "from User";
        Query query = session.createQuery(hql);
        List<User> users = query.list();
        System.out.println(users);

        //条件查询一个user
        String hql1 = "from User where UserId = 5";
        Query query1 = session.createQuery(hql1);
        User user = (User)query1.uniqueResult();
        System.out.println(user.getUserName());

        //占位符
        String hql2 = "from User where UserName = :UserName and Age = :Age";
        Query query2 = session.createQuery(hql2);
        query2.setParameter("UserName","武大郎");
        query2.setParameter("Age",18);
        User user2 = (User)query2.uniqueResult();
        System.out.println(user2.getUserName());

        //分页查询
        String hql3 = "from User";
        Query query3 = session.createQuery(hql3);
        query3.setFirstResult(0);
        query3.setMaxResults(10);
        List<User> list3 = query3.list();
        System.out.println(list3);
    }
}

  Criteria查询(单表查询-已过时)

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.openSession();

        //查询列表
        Criteria criteria = session.createCriteria(User.class);
        List<User> list = criteria.list();
        System.out.println(list);

        //查询一条
        Criteria criteria1 = session.createCriteria(User.class);
        criteria1.add(Restrictions.eq("UserId", 1));
        User user1 = (User) criteria1.uniqueResult();
        System.out.println(user1.getUserName());

        //分页列表
        Criteria criteria2 = session.createCriteria(User.class);
        criteria2.setFirstResult(0);
        criteria2.setMaxResults(10);
        List<User> list2 = criteria2.list();
        System.out.println(list2);

    }
}

  原生SQL查询

public class Main {
    public static void main(String[] args) {
        Session session = HibernateUtils.openSession();

        String sql = "select * from user";
        SQLQuery query = session.createSQLQuery(sql);
        List<User> list = query.list();
        System.out.println(list);


        SQLQuery query1 = session.createSQLQuery("select * from user where userId = :userId");
        query1.setParameter("userId",1);
        query1.addEntity(User.class);
        User user = (User) query1.uniqueResult();
        System.out.println(user.getUserName());

    }
}

 

以上是关于Hibernate基础的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate基础

[vscode]--HTML代码片段(基础版,reactvuejquery)

Hibernate基础

Hibernate 基础

Hibernate基础

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础