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

<?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><!--第一部分: 配置数据库信息,必须有,这里使用的是postgre数据库 --><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">lwx83129</property><!--第二部分: 配置hibernate信息, 输出数据库SQL语句,可选 --><property name="hibernate.show_sql">true</property><property name="hibernate.format_sql">true</property><!-- 自动创建表和更新 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置方言 --><property name="hibernate.dialec">org.hibernate.dialect.MySQLDialect</property><!-- 配置threadLocal --><property name="hibernate.current_session_context_class">thread</property><!--第三部分: 核心配置文件关联映射文件 --><mapping resource="User.hbm.xml"/></session-factory>
</hibernate-configuration>

映射配置文件

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

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><!--name代表全类名,table代表数据库中表的名字--><class name="priv.lwx.hibernate.basic.entity.User" table="user"><!--id是实体类中的与对应数据表中作为主键的列相对应的属性--><id name="id" type="java.lang.Integer"><!--column是对应的数据表中作为主键的列--><column name="id" unique="true"/><generator class="identity"/></id><!--property用来配置类的其它属性与数据表中的列的映射关系--><property generated="never" lazy="false" name="accountName" type="java.lang.String"><column name="account_name"/></property><property generated="never" lazy="false" name="password" type="java.lang.String"><column name="password"/></property><property generated="never" lazy="false" name="realName" type="java.lang.String"><column name="real_name"/></property><property generated="never" lazy="false" name="age" type="java.lang.Integer"><column name="age"/></property><property generated="never" lazy="false" name="gender" type="java.lang.String"><column name="gender"/></property><property generated="never" lazy="false" name="birthday" type="java.util.Date"><column name="birthday"/></property><property generated="never" lazy="false" name="info" type="java.lang.String"><column name="info"/></property></class>
</hibernate-mapping>

主键生成方式

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

主键生成方式的配置

identity

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

<!--id是实体类中的与对应数据表中作为主键的列相对应的属性-->
<id name="id" type="java.lang.Integer"><!--column是对应的数据表中作为主键的列--><column name="id" unique="true"/><!--主键值的生成方式--><generator class="identity"/>
</id>

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。

<!-- 用来指明主键的生成方式 --> 
<generator class="native"> <param name="sequence">foo_seq</param>
</generator>

如果是 MySQL 数据库,<param name="sequence">foo_seq</param> 是不起作用的,但也不会出错;如果是 Oracle 数据库,<param name="sequence">foo_seq</param> 就会起作用。

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*/@Testpublic 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();// 关闭Sessionsession.close();}/*** 删除数据表中的指定记录** @param* @return* @throws* @author liaowenxiong* @date 2022/6/17 09:33*/@Testpublic 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*/@Testpublic 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*/@Testpublic 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<User> users = query.list();// 所以这里就可以关闭Session了session.close();for (User user : users) {System.out.println(user);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在diy的文件系统上创建文件的流程

【0】README 0.1&#xff09; source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 &#xff1b; 0.2&#xff09;本文总结的内容是干货&#xff0c;…

java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式立面是指建筑物的外观。 当穿过街道时&#xff0c;我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。 同样&#xff0c; 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 …

dnn模型 list index out of range_基于svm的财务预警模型

前言本文将我国A股上市公司作为研究对象&#xff0c;选取了A股 2015-2019 年度被 ST 或被 *ST上市公司&#xff0c;剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。数据收集及预处理导入所需要库 im…

汇编操作显存

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言&#xff0c;实体对象的状态分为三种&#xff1a; 1.暂时态 当对象刚创建&#xff0c;和 Session 没有发生任何关系时&#xff0c;当程序运行完就立刻消失&#xff0c;被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系&#xff0c;如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中&#xff0c;我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时&#xff0c;状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时&#xff0c;我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法&#xff0c;可用于刮刮卡&#xff0c;大转盘等抽奖算法。假设&#xff1a;有一个二维数组&#xff0c;记录了所有本次抽奖的奖项信息&#xff1a;$test_arr array(a>20,b>30,c>50);a奖概率20%&#xff0c;b奖概率30%&#xff0c;c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1&#xff09; source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传&#xff1b; 【1】 键盘输入缓冲区 step1&#xff09;缓冲区的数据结构如下&#xff1a; step2&#xff09;对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护&#xff0c;该缓存区保存着与该 Session 实例有关联的所有实体对象的数据&#xff0c;也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中&#xff0c;由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc)&#xff0c;特别是编译目标文件的依赖文件&#xff1b;本文旨在回顾 gcc 和 nams 编译器的编译命令&#xff0c;以及如果有多个依赖文件该如何编译&#xff1b; 【1】编译文件 1.1&#xff09;编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象&#xff08;看红色线条&#xff09;&#xff0c;找不到去二级缓存找&#xff0c;还找不到就不找了&#xff0c;直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列&#xff0c;通过它可以轻松的实现任务的异步处理&#xff0c; 如果你的业务场景中需要用到异步任务&#xff0c;就可以考虑使用celery&#xff0c; 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 0.2&#xff09; there are 4 methods solving maximum sum of subsequence&#xff0c; but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符&#xff0c;以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作&#xff0c;但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式&#xff0c;…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项&#xff1a; 1.前端界面的表单项的参数命名格式为&#xff1a;Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法&#xff0c;注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器&#xff0c;可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 【1】分析算法最混乱的方面大概集中在对数上面&#xff0c; 除分治算法外&#xff0c;可将对数最常出现的规律概括为下列一般法则&#xff1a; 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同&#xff0c;但是由于这是我写的书&#xff0c;而且我是撰写评论的人&#xff0c;因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期&#xff0c;而不展示时间 数…