您当前的位置: 首页 >  hibernate

liaowenxiong

暂无认证

  • 2浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Hibernate的学习笔记

liaowenxiong 发布时间:2022-07-02 17:02:18 ,浏览量:2

文章目录
  • 简介
  • 配置文件
    • hibernate.cfg.xml
    • 映射配置文件
      • 主键生成方式
      • 主键生成方式的配置
        • identity
        • sequence
        • native
        • increment
        • assigned
      • 映射类型
  • 使用 Hibernate 实现 CRUD

简介

Hibernate是对象关系映射(ORM,Object RelationShip Mapping)框架,Hibernate 用于系统中的封装数据访问层,我们称之为数据访问层框架(或叫持久层框架)。

这个框架会自动将数据库查询出来的数据行封装成所映射的Java类对象,也会将Java类对象中的数据根据所映射的数据表拼接成SQL语句,从而可以很便捷地存储数据、更新数据、删除数据。

实际上 Hibernate 的底层是调用 JDBC 有关 API 来访问数据库的。只是先将访问数据库的参数、数据库配置参数以及 Java 类与数据表的对应关系等全部记录在 xml 文件中,然后再调用 Hibernate 有关 API 去解析这些配置文件,从而实现数据库的访问以及数据的自动封装。

配置文件

关于配置文件的详解参考这些文章: 1.http://t.zoukankan.com/rodge-run-p-6415552.html 2.https://blog.csdn.net/qq_45874814/article/details/121461885 3.https://blog.csdn.net/weixin_44048823/article/details/106762026 4.https://www.cnblogs.com/rodge-run/p/6415552.html 5.https://blog.csdn.net/qq_34598667/article/details/86496008

hibernate.cfg.xml

这个 Hibernate 的核心配置文件,主要配置数据库的连接参数以及数据库运行时的一些参数,如下所示:


DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    
        
        com.mysql.cj.jdbc.Driver
        jdbc:mysql://localhost:3306/test
        root
        lwx83129
        
        true
        true
        
        update
        
        org.hibernate.dialect.MySQLDialect
        
        thread
        
        
    

映射配置文件

这个配置文件主要就是配置Java 实体类与数据表的对应关系,配置文件的命名规则为:类名.hbm.xml,例如:User.hbm.xml。配置内容如下所示:


DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

    
    
        
        
            
            
            
        
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

主键生成方式

常用的主键生成方式有如下几种: 1)identity 用于自动生成主键方式,除了 Oracle 不支持,其他数据库一般都支持(较常用) 2)sequence Oracle 中使用,用序列生成主键值 3)native 主键生成方式如果是 native,那就看配置文件 hibernate.cfg.xml 中方言 是什么,如果方言是 MySQL,相当于 identity,如果方言是 Oracle,相当于 sequence 4)increment 不常用 5)assigned 不常用,手动生成主键 id 的值

主键生成方式的配置 identity

如果数据库支持自动生成主键方式,则可以使用 identity,MySQL 数据库常用此生成方式。



	
    
	
	

sequence

Oracle 数据库常用。 创建表 t_foo 和序列 foo_seq:

SQL> CREATE TABLE t_foo(
2 t_id number(11) NOT NULL,
3 t_value varchar(50) NOT NULL,
4 PRIMARY KEY (t_id));
Table created.

SQL> create sequence foo_seg;
Sequence created.
SQL>

修改配置文件 hibernate.cfg.xml,修改为连接 Oracle 数据库: 在这里插入图片描述 将表的主键值的生成方法改为 sequence,如下所示: 在这里插入图片描述

native

native 根据配置文件中的方言选择是 identity 还是 sequence。

 
 
	foo_seq

如果是 MySQL 数据库,foo_seq 是不起作用的,但也不会出错;如果是 Oracle 数据库,foo_seq 就会起作用。

increment

不常用,如果主键生成方式为 increment,新建数据库表时不需要写“auto_increment”,插入数据时,同样也不需要指定 ID:

Foo foo = new Foo();
foo.setValue("foo_value1");
session.save(foo);

查看控制台,Hibernate 执行了 2 条 SQL: 在这里插入图片描述

increment 生成主键方式是先 “select max(t.id) from t_foo”,从 t_foo 中找到最大的 id, 之后将 max(t_id)1,这样就保证了主键唯一。但是这样有风险,当并发访问时会有风险。不建议使用。

assigned

不会自动生成主键值,需要用户自己指定,使用也较少。

必须手动设置 ID,如下代码所示:

// 需要指定id
Foo foo = new Foo();
foo.setId(9999);
foo.setValue ("foo_value2");
session.save(foo);
映射类型

参考文章:https://blog.csdn.net/yzy199391/article/details/80536419

使用 Hibernate 实现 CRUD
package priv.lwx.hibernate.basic.entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.jupiter.api.Test;
import priv.lwx.hibernate.basic.util.HibernateUtils;

import java.util.List;

/**
 * CRUD演示
 *
 * @author liaowenxiong
 * @date 2022/6/17 07:43
 */

public class UserTest {
  /**
   * 往数据表插入一条记录
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/17 09:00
   */
  @Test
  public void test1() {
    User user = new User();
    user.setAccountName("liaowenxiong");
    user.setRealName("廖文雄");
    user.setPassword("123");
    // 调用Hibernate的API,用于装载Hibernate配置文件
    Configuration cfg = new Configuration();
    // 调用无参的方法configure会默认装载目录classes下的Hibernate配置文件(hibernate.cfg.xml及mapping文件)
    cfg.configure();
    SessionFactory factory = cfg.buildSessionFactory();
    // 通过Session工厂类获取Session对象
    Session session = factory.openSession();
    // 通过Session对象获取事务对象
    Transaction tx = session.getTransaction();
    // 开启事务
    tx.begin();
    // 保存数据
    session.save(user);
    // 提交事务
    tx.commit();
    // 关闭Session
    session.close();
  }

  /**
   * 删除数据表中的指定记录
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/17 09:33
   */
  @Test
  public void test2() {
    User user = new User();
    user.setId(8);
    // user.setAccountName("liudehua"); // 不会按accountName删除
    Session session = HibernateUtils.openSession();
    /*// 获取事务对象
    Transaction tx = session.getTransaction();
    // 开启事务
    tx.begin();*/
    // 方法beginTransaction会完成上面的两个操作
    Transaction tx = session.beginTransaction();
    // 方法delete会获取对象user的属性ID的值,然后自动拼接一条删除的SQL语句,调用JDBC的API
    // 将SQL语句发送给数据库执行
    session.delete(user);
    tx.commit();
    session.close();
  }

  /**
   * 更新指定的数据行
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/17 09:42
   */
  @Test
  public void test3() {
    User user = new User();
    user.setId(13);
    user.setAccountName("liaowenxiong");
    user.setRealName("雄霸天下");
    Session session = HibernateUtils.openSession();
    Transaction tx = session.beginTransaction();
    session.update(user);
    tx.commit();
    session.close();
  }

  /**
   * 查询指定数据表
   *
   * @param
   * @return
   * @throws
   * @author liaowenxiong
   * @date 2022/6/17 09:58
   */
  @Test
  public void test4() {
    Session session = HibernateUtils.openSession();
    // 方法createQuery并没有调用JDBC访问数据库,只是拼接了一条查询SQL语句而已
    // User是类名,"from User"是Hibernate提供的面向对象的查询语言:HQL(Hibernate Query Language)语言。
    Query query = session.createQuery("from User");
    // 方法list调用JDBC的API访问数据库,再将获取到的数据封装成List对象返回
    List users = query.list();
    // 所以这里就可以关闭Session了
    session.close();
    for (User user : users) {
      System.out.println(user);
    }
  }
}

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0776s