JavaWeb Hibernate使用全面介绍
作者:showswoller 发布时间:2021-09-13 11:26:07
前言
以下内容科班同学学过UML和数据库的应该比较熟悉
数据模型:数据模型是对数据库特征的抽象,也就是用户从数据库中看到的模型,例如一张数据表或者用户从数据表中所看到的存储信息,此模型既要面向对象又要面向系统
领域模型:领域模型是对现实世界中的对象的可视化表现,又称为概念模型,领域模型或者分析对象模式,没有所谓唯一正确的领域模型,所有模型都是对我们试图要理解的领域的近似,领域模型主要是在特定群体用于理解和沟通的工具
一、实体关联之间的映射
接下来的内容与数据库中的ER图映射成关系表十分相似
1、单向多对一的关联
两个类映射成表,并且把被关联表的主键作为关联表的外键
<hibernate-mapping>
<class name="com.mr.product.Product" table="tab_product">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" type="string" length="45">
<column name="name"/>
</property>
<property name="price" type="double">
<column name="price"/>
</property>
<many-to-one name="factory" class="com.mr.factory.Factory">
<column name="factoryid"/>
</many-to-one>
</class>
</hibernate-mapping>
2、多对一双向关联
以任一个表的主键作另一个表的外键都可以
<hibernate-mapping>
<class name="com.mr.product.Product" table="tab_product">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" type="string" length="45">
<column name="name"/>
</property>
<set name="products" inverse="true">
<key column="factoryid"/>
</property>
<one-to-many class="com.mr.product.Product">
</set>
</class>
</hibernate-mapping>
3、一对一主键关联
指的是两个表之间通过主键形成一对一的映射
<hibernate-mapping>
<class name="com.mr.people.People" table="tab_people">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="name" type="string" length="45">
<column name="name"/>
</property>
<property name="sex" type="string" length="2">
<column name="sex"/>
</property>
<property name="age" type="int">
<column name="age"/>
</property>
<ont-to-ont name="com.mr.idcard.IDcard"
cascade="all"/>
</class>
</hibernate-mapping>
4、一对一外键关联
这个配置比较简单 添加一个新字段即可 此处不再赘述
5、多对多关联
多对多关联比较特殊 需要另外的一张表来保存多对多的映射关系
<hibernate-mapping>
<class name="com.mr.user.User" table="tab_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" not-null="true"/>
<set name="roles" table="tab_mapping">
<key column=""user_id"></key>
<many-to-many class="com.mr.role.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
6、级联操作
级联操作指的是当主控方执行对数据表的更改时,关联对象是否进行同步操作,在映射文件中通过对cascade属性的设置决定是否对关联对象采用级联操作
all 所有情况下均采用级联操作
none 默认参数 所有情况下均不采用级联操作
save-update 在执行save-update方法时执行级联操作
delete 在执行delete方法时执行级联操作
二、实体继承关系映射
继承是面向对象的重要特性 在Hibernate中是以面向对象的思想进行持久化操作的,所以在Hibernate中数据表所映射的实体的对象也是可以存在继承关系的 主要有以下三种
1、类继承树映射成一张表
学生和职员共同继承了人的实体对象,也将拥有人的实体的对象的全部属性 可以将这三个类映射到一张表中 添加一个字段来区分同名属性
<hibernate-mapping package="com.mr.person">
<class name="Person" table="tab_person">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string"/>
<property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<subclass name="Studeng" discrimination-value="学生">
<property name="school"/>
</subclass>
<subclass name="Staffer" discrimination-value="职员">
<property name="company"/>
</subclass>
</class>
</hibernate-mapping>
2、每个子类映射成一张表
上述的三个类也可以将每个子类映射成一张表 两个子类映射的表都将通过主键关联到超类映射的表,形成一对一的关系
<hibernate-mapping package="com.mr.person">
<class name="Person" table="tab_person">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string"/>
<property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<joined-subclass name="Student" table="tab_student">
<key column="id"/>
<property name="school"/>
</joined-subclass>
<joined-subclass name="Staffer" discrimination-value="职员">
<key column="id"/>
</joined-subclass>
</class>
</hibernate-mapping>
3、每个具体类映射成一张表
将 每个具体类映射成一张表 每个子类的映射表中都含有继承的父类属性映射的字段
<hibernate-mapping package="com.mr.person">
<class name="Person" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<discriminator column="type" type="string"/>
<property name="name" not-null="true"/>
<property name="age" type="int"/>
perperty name="sex" type="string"/>
<union-subclass name="Student" table="tab_student">
<key column="id"/>
<property name="school"/>
</union-subclass>
<union-subclass name="Staffer" discrimination-value="职员">
<key column="id"/>
</union-subclass>
</class>
</hibernate-mapping>
三、Hibernate查询语言
HQL(Hibernate Query Language)是完全面向对象的查询语言,它提供了更加面向对象的封装,它可以理解如多态, 继承和关联的概念 HQL看上去与SQL相似 但它却提供了更加强大的查询功能
HQL是面向对象的查询语言,所以它需要从目标对象中查询信息并返回匹配单个实体或多个实体对象的集合,而SQL语句是从数据库中查找指定信息,返回的单条信息或多条信息的集合
所以HQL区分大小写 语法如下
select "对象.属性名"
from "对象"
where "条件"
group by"对象.属性名" having "分组条件"
order by "对象.属性名"
实体对象查询
from person
最好指定 一个别名 方便其他地方引用
from person per
此时返回的是person对象中的所有数据
查询指定字段数据
select Person(id,name) from Person per
HQL参数绑定机制
参数绑定机制可以使查询语句和参数具体值相互独立,不但可以提高程序开发效率,还可以有效的防止SQL的注入攻击 HQL中有以下两种方法
1:利用顺序占位符?替代具体参数
session=HibernateUtil.getSession();
String sql="from Employee emp where emp.sex=?";
Query q=session.createQuery(hql);
q.setParameter(0,"男");
emplist=q.list();
2:利用占位符:parameter 替代具体参数
session=HibernateUtil.getSession();
String sql="from Employee emp where emp.sex=:sex";
Query q=session.createQuery(hql);
q.setParameter("sex","男");
emplist=q.list();
其余各种查询与SQL基本一致 此处不再赘述
来源:https://blog.csdn.net/jiebaoshayebuhui/article/details/127289442


猜你喜欢
- 本文实例为大家分享了Android倒计时的开始与停止,剩余时分秒的展示效果,供大家参考,具体内容如下1.声明开启倒计时相关方法Handler
- 首先写一个测试文件然后点击IDEA右侧的maven,然后选择package,之后点击上面运行或者直接双击即可,等下方控制台构建成功即可:然后
- 一 Paint ,Canvaspublic class drawView extends View{ private Paint
- 先看实例 代码如下 classip { privatestaticlongiptolong(stringstrip) //将127.0.0.
- 前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过
- 本文实例为大家分享了C语言实现字符串拼接和拷贝的具体代码,供大家参考,具体内容如下字符串拼接:#include<stdio.h>
- 前言平时做一些统计数据,经常从数据库或者是从接口获取出来的数据,单位是跟业务需求不一致的。比如, 我们拿出来的 分, 实际上要是元又比如,我
- 本文实例为大家分享了Unity使用鼠标旋转物体效果的具体代码,供大家参考,具体内容如下了解完基础知识后,然我们来做个小程序练习一下1.在Ma
- 枚举的基本用法回顾以下是一个常见的 C# 枚举(enum)的示例:enum Weekday{
- 微信登录的实现与qq登录类似。不过微信登录比较麻烦,需要拿到开发者资质认证,花300块钱,然后应用的话还得有官网之类的,就是比较繁琐的前期准
- 一、基本概念JavaWeb里面的listener是通过观察者设计模式进行实现的。对于观察者模式,这里不做过多介绍,大概讲一下什么意思。观察者
- Java IO 转化流乱码引起转换流读取乱码读取电脑磁盘上的Java.txt文件内容,文件路径: e:\Java\Java.txt
- 本文实例讲述了C#中timer定时器用法。分享给大家供大家参考。具体如下:下面的代码通过Timer定时器每隔1000毫秒(1秒)触发一次事件
- 本文实例讲述了Android内容提供者ContentProvider用法。分享给大家供大家参考,具体如下:PersonContentProv
- 下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按下颜色listview默认情况下,item的背景色是黑
- 本文主要介绍了C# WinForm状态栏实时显示当前时间(窗体状态栏StatusStrip示例),分享给大家,具体如下:实现效果:通过Sta
- Plugins摘一段来自MyBatis官方文档的文字。MyBatis允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis允许使
- 一. 首先Swagger是什么?Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
- Maven系列11.什么是Maven?Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生
- GPS定位是目前很多手机都有的功能,且非常实用。本文以实例形式讲述了Android中GPS定位的用法。分享给大家供大家参考之用。具体方法如下