栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Hibernate的学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate的学习笔记

文章目录
  • 简介
  • 配置文件
    • 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 的核心配置文件,主要配置数据库的连接参数以及数据库运行时的一些参数,如下所示:




    
        
        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。配置内容如下所示:




    
    
        
        
            
            
            
        
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

主键生成方式

常用的主键生成方式有如下几种:
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;



public class UserTest {
  
  @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();
  }

  
  @Test
  public void test2() {
    User user = new User();
    user.setId(8);
    // user.setAccountName("liudehua"); // 不会按accountName删除
    Session session = HibernateUtils.openSession();
    
    // 方法beginTransaction会完成上面的两个操作
    Transaction tx = session.beginTransaction();
    // 方法delete会获取对象user的属性ID的值,然后自动拼接一条删除的SQL语句,调用JDBC的API
    // 将SQL语句发送给数据库执行
    session.delete(user);
    tx.commit();
    session.close();
  }

  
  @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();
  }

  
  @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);
    }
  }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号