当前位置: 首页 > news >正文

说说Hibernate

当你在实战项目中需要用到SSH时, 如果你之前只用过Mybatis那自然是不能解决问题的, 因为在很多银行类金融类项目中你可能会使用到Hibernate, 那么关于Hibernate你应该要了解什么呢, 本篇文章就以学习Hibernate框架为目的, 巩固在工作中可能需要用到的这种ORM技术, 同时也欢迎家人们探讨交流和指正。

概述

Hibernate是一种Java语言下的对象关系映射(ORM)解决方案。它为面向对象领域模型到传统的关系型数据库的映射, 提供了使用方便的持久化框架

它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始, 开发人员都可以采用Hibernate。

Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射), 还提供了面向对象的数据查询检索机制, 从而极大地缩短了手动处理SQLJDBC上的开发时间。

前面已经提到了Hibernate是一种Java语言下的ORM解决方案, 所以我们要对ORM有一定了解, 再往前走就是JDBC, 所以我们就要先理解JDBC, 那么JDBC是什么呢?

什么是JDBC?

JDBC代表Java Database Connectivity, 它是提供了一组Java API来访问关系型数据的Java程序, 这些Java API可以使Java程序执行SQL语句, 能够与任何符合规范的SQL数据库进行交互。JDBC提供了一个灵活的框架来编写操作数据库的独立的应用程序, 该应用程序能够运行在不同的平台上且不需要修改, 能够与不同的DBMS进行交互。

JDBC的优点和缺点

JDBC的优点

JDBC的缺点

干净整洁的SQL处理

大项目中使用很复杂

大数据下有良好的性能

很大的编程成本

对于小应用非常好

没有封装

易学的简易语法

难以实现MVC的概念

查询需要指定DBMS

为什么是ORM(对象关系映射)?

当我们工作在一个面向对象的系统中时, 存在一个对象模型和关系数据库不匹配的问题。

RDMS用表格的形式存储数据, 然而像Java或者C#这样的面向对象的语言他表示一个对象关联图。考虑下面的带有构造方法和公有方法的Java类:

public class Employee{private int id;private String first_name;private String last_name;private int salary;public Employee(){}public Employee(String fname, String lname, int salary){this.first_name = fname;this.last_name = lname;this.salary = salary;}public int getId(){return id;}public String getFirstName(){return first_name;}public String getLastName(){return last_name;}public int getSalary(){return salary;}
}

现考虑以上的对象需要被存储和索引进下面的RDBMS表格中:

create table EMPLOYEE(id INT NOT NULL auto_increment,first_name VARCHAR(20) default
NULL,last_name VARCHAR(20) default
NULL,salary int default NULL,PRIMARY KEY(id)
);

第一个问题, 如果我们开发了几页代码或应用程序后, 需要修改数据库的设计怎么办?

第二个问题, 再关系型数据库中加载和存储对象时我们要面临一下5个不匹配的问题。

不匹配

描述

粒度

有时你会有一个对象模型, 该模型类的数量比数据库中关联的表的数量更多

继承

RDBMS不会定义任何在面向对象编程语言中本来就有的继承

身份

RDBMS明确定义一个'sameness'的概念: 主键。然而, Java同时定义了对象判等(a==b)和对象值判等(a.equals(b))

关联

面向对象的编程语言使用对象引用来表示关联, 而一个RDBMS使用外键来表示对象关联

导航

在Java中和在RDBMS中访问对象的方式完全不相同

ORM(Object-Relational Mapping)是以上所有不匹配问题的解决方案。

什么是ORM?

ORM表示Object-Relational Mapping, 是一个方便在关系型数据库和类似于Java, C#等面向对象的编程语言中转换数据的技术。一个ORM系统相比于普通的JDBC有以下的优点:

  1. 使用业务代码访问对象而不是数据库中的表

  1. 从面向对象逻辑中隐藏SQL查询的细节

  1. 基于JDBC的'under the hood'

  1. 没有必要去处理数据库实现

  1. 实体是基于业务的概念而不是数据库的结构

  1. 事务管理和键的自动生成

  1. 应用程序的快速开发

一个ORM解决方案由以下四个实体组成:

  1. 一个API来在持久类的对象上实现基本的CRUD操作

  1. 一个语言或API来指定引用类和属性的查询

  1. 一个可配置的服务用来指定映射元数据

  1. 一个技术和事务对象交互来执行dirty checking, lazy association fetching和其他优化的功能

Java ORM框架

在Java中有几个持久化的框架和ORM选项。一个持久化的框架是ORM存储和索引对象到关系型数据库的服务。

Enterprise JavaBeans Entity Beans

Java Data Objects

Castor

TopLink

Spring DAO

Hibernate

And many more

Hibernate简介

Hibernate是由Gavin King于2001年创建的开放源代码的对象关系型框架。它强大且高效的构建具有关系对象持久性和查询服务的Java应用程序。

Hibernate将Java类映射到SQL数据类型中, 并把开发人员从95%的公共数据持久性编程工作中解放出来。

Hibernate是传统Java对象和数据库服务器之间的桥梁, 用来处理基于O/M映射机制和模式的那些对象。

Hibernate优势

  1. Hibernate使用XML文件来处理映射Java类别到数据库表格中, 并且不用编写任何代码。

  1. 为在数据库中直接储存和检索Java对象提供简单的API。

  1. 如果在数据库中或任何其他表格中出现变化, 那么仅需要改变XML文件属性。

  1. 抽象不熟悉的SQL类型, 并为我们提供工作中所熟悉的Java对象。

  1. Hibernate不需要应用程序服务器来操作。

  1. 操控你数据库中对象复杂的关联。

  1. 最小化与访问数据库的智能提取策略。

  1. 提供简单的数据询问。

支持的数据库

Hibernate支持几乎所有的主要RDBMS。以下是一些由Hibernate所支持的数据库引擎:

HSQL Database Engine

DB2/NT

MySQL

PostgreSQL

FrontBase

Oracle

Microsoft SQL Server Database

Sybase SQL Server

Informix Dynamic Server

支持的技术

XDoclet Spring

J2EE

Eclipse plug-ins

Maven

Hibernate架构

架构

Hibernate架构是分层的, 作为数据访问层, 你不必知道底层API。Hibernate利用数据库以及配置数据来为应用程序提供持续性服务

下面是一个非常高水平的Hibernate应用程序架构视图:

下面是一个详细的Hibernate应用程序体系结构视图以及一些重要的类:

Hibernate使用不同的现存Java API, 比如JDBC, Java事务API(JTA), 以及Java命名和目录界面(JNDI)。JDBC提供了一个基本的抽象级别的通用关系型数据库的功能, Hibernate支持几乎所有带有JDBC驱动的数据库。JNDI和JTA允许Hibernate与J2EE应用程序服务器相集成。

下面的部分简要地描述了在Hibernate应用程序架构所涉及地每一个类对象。

配置对象

篇日志对象是你在任何Hibernate应用程序中创造的第一个Hibernate对象, 并且经常只在应用程序初始化期间创造。它代表了Hibernate所需一个配置或属性文件。配置对象提供了两种基础组件。

数据库连接: 由Hibernate支持的一个或多个配置文件处理, 这些文件是hibernate.properties和hibernate.cfg.xml。

类映射设置: 这个组件创造了Java类和数据库表格之间的联系。

SessionFactory对象

配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

Session对象

一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

Transaction对象

一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

Query对象

Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

Criteria对象

Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

Hibernate环境

为了给Hibernate应用准备需要地开发环境, 该怎样安装Hibernate应用和一些其他相关的包。这里会用MySQL数据库来对一些Hibernate应用的例子进行试验。

下载Hibernate

首先要在想要把Hibernate应用安装在Windows系统或是Unix系统这两者之间做出选择, 之后进行到下一步骤去下载与Windows系统对应的.zip文件或是与Unix系统对应的.tz文件。

之后到http://www.hibernate.org/downloads这个网址来下载最新版本的Hibernate应用。

这里下载的是hibernate-distribution-3.6.4.Final这个版本的应用, 在这个版本的应用下当我们解压下载的文件时会显示以下的目录结构:

安装Hibernate

一旦你下载好并解压了Hibernate应用最新版本的安装文件, 你需要执行以下两个简单的步骤。

一定要确保你把你的CLASSPATH变量设置合理, 否则当你编译你的应用时可能会遇到问题。

首先把从/lib复制来的所有库文件拷贝到CLASSPATH里, 并且改变你的CLASSPATH变量来涵盖所有的JAR。

最后复制hibernate3.jar这个文件到CLASSPATH里。这个文件位于安装文件的根目录里, 它是Hibernate应用针对的主要JAR。

Hibernate的前提

以下是一个Hibernate应用需要的有关包/库的表格, 在安装Hibernate应用之前你需要先安装它们, 为了安装这些包你必须把来自/lib的库文件拷贝到CLASSPATH, 并按以下说明相应地改变CLASSPATH变量。

S.N.

包/库

1

dom4j - XML 解析 www.dom4j.org/

2

Xalan - XSLT 处理器 http://xml.apache.org/xalan-j/

3

Xerces - The Xerces Java 解析器 http://xml.apache.org/xerces-j/

4

cglib -Java 类生成库 http://cglib.sourceforge.net/

5

log4j - 日志控制 http://logging.apache.org/log4j

6

Commons - 日志,邮件等 http://jakarta.apache.org/commons

7

SLF4J - 简单日志门面 http://www.slf4j.org

Hibernate配置

配置

Hibernate 需要事先知道在哪里找到映射信息,这些映射信息定义了 Java 类怎样关联到数据库表。Hibernate 也需要一套相关数据库和其它相关参数的配置设置。所有这些信息通常是作为一个标准的 Java 属性文件提供的,名叫 hibernate.properties。又或者是作为 XML 文件提供的,名叫 hibernate.cfg.xml

我们将考虑 hibernate.cfg.xml 这个 XML 格式文件,来决定在我的例子里指定需要的 Hibernate 应用属性。这个 XML 文件中大多数的属性是不需要修改的。这个文件保存在应用程序的类路径的根目录里。

Hibernate属性

下面是一个重要的属性列表, 你可能需要表中的属性来在单独的情况下配置数据库。

S.N.

属性和描述

1

hibernate.dialect

这个属性使 Hibernate 应用为被选择的数据库生成适当的 SQL。

2

hibernate.connection.driver_class

JDBC 驱动程序类。

3

hibernate.connection.url

数据库实例的 JDBC URL。

4

hibernate.connection.username

数据库用户名。

5

hibernate.connection.password

数据库密码。

6

hibernate.connection.pool_size

限制在 Hibernate 应用数据库连接池中连接的数量。

7

hibernate.connection.autocommit

允许在 JDBC 连接中使用自动提交模式。

如果您正在使用JNDI和数据库应用程序服务器然后您必须配置以下属性:

S.N.

属性和描述

1

hibernate.connection.datasource

在应用程序服务器环境中您正在使用的应用程序 JNDI 名。

2

hibernate.jndi.class

JNDI 的 InitialContext 类。

3

hibernate.jndi.<JNDIpropertyname>

在 JNDI的 InitialContext 类中通过任何你想要的 Java 命名和目录接口属性。

4

hibernate.jndi.url

为 JNDI 提供 URL。

5

hibernate.connection.username

数据库用户名。

6

hibernate.connection.password

数据库密码。

Hibernate和MySQL数据库

MySQL数据库是目前可用的开源数据库系统中最受欢迎的数据库之一。

我们要创建hibernate.cfg.xml配置文件并将其放置在应用程序的CLASSPATH的根目录里。你要确保在你的MySQL数据库中testdb数据库是可用的, 而且你要有一个用户test可用来访问数据库。

XML配置文件一定要遵守Hibernate 3 Configuration DTD, 在 http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd这个网址中是可以找到的。

相关文章:

说说Hibernate

当你在实战项目中需要用到SSH时, 如果你之前只用过Mybatis那自然是不能解决问题的, 因为在很多银行类金融类项目中你可能会使用到Hibernate, 那么关于Hibernate你应该要了解什么呢, 本篇文章就以学习Hibernate框架为目的, 巩固在工作中可能需要用到的这种ORM技术, 同时也欢迎家…...

目标检测论文阅读:DETR算法笔记

标题&#xff1a;End-to-End Object Detection with Transformers 会议&#xff1a;ECCV2020 论文地址&#xff1a;https://link.springer.com/10.1007/978-3-030-58452-8_13 官方代码&#xff1a;https://github.com/facebookresearch/detr 作者单位&#xff1a;巴黎第九大学、…...

Golang sync.Once 源码浅析

本文分析了Golang sync.Once 源码&#xff0c;并由此引申&#xff0c;简单讨论了单例模式的实现、 atomic 包的作用和 Java volatile 的使用。 sync.Once 使用例子 sync.Once 用于保证一个函数只被调用一次。它可以用于实现单例模式。 有如下类型&#xff1a; type instanc…...

C++面向对象(上)

文章目录前言1.面向过程和面向对象初步认识2.引入类的概念1.概念与用法2.类的访问限定符及封装3.类的作用域和实例化4.类的大小计算5.this指针3.总结前言 本文将对C面向对象进行初步介绍&#xff0c;引入类和对象的概念。围绕类和对象介绍一些基础知识&#xff0c;为以后深入学…...

经常用但是不知道什么是BFC?

BFC学习 block formatting context 块级格式上下文 简单理解&#xff1a; 一个独立容器&#xff0c;内部布局不会受到外面的影响 形成条件&#xff1a; 1.浮动元素&#xff1a;float除none之外的值 2.绝对定位&#xff1a;position:absolute,fixed 3.display:inline-blo…...

GO的临时对象池sync.Pool

GO的临时对象池sync.Pool 文章目录GO的临时对象池sync.Pool一、临时对象池&#xff1a;sync.Pool1.1 临时对象的特点1.2 临时对象池的用途1.3 sync.Pool 的用法二、临时对象池中的值会被及时清理掉2.1 池清理函数2.2 池汇总列表2.3 临时对象池存储值所用的数据结构2.4 临时对象…...

高精度算法一

目录 1. 基础知识 2. 大整数 大整数 3. 大整数 - 大整数 1. 基础知识 利用计算机进行数值计算&#xff0c;有时会遇到这样的问题&#xff1a;有些计算要求精度高&#xff0c;希望计算的数的位数可达几十位甚至几百位&#xff0c;虽然计算机的计算精度也算较高了&#xff0c…...

2023年全国最新食品安全管理员精选真题及答案1

百分百题库提供食品安全管理员考试试题、食品安全员考试预测题、食品安全管理员考试真题、食品安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 11.预包装食品的标签内容应使用规范的汉字&#xff0c;但可以同时使用&a…...

C++入门:引用

目录 一. 什么是引用 1.1 引用的概念 1.2 引用的定义 二. 引用的性质和用途 2.1 引用的三大主要性质 2.2 引用的主要应用 三. 引用的效率测试 3.1 传值调用和传引用调用的效率对比 3.2 值返回和引用返回的效率对比 四. 常引用 4.1 权限放大和权限缩小问题 4.2 跨…...

SpringSecurity的权限校验详解说明(附完整代码)

说明 SpringSecurity的权限校是基于SpringSecurity的安全认证的详解说明(附完整代码) &#xff08;https://blog.csdn.net/qq_51076413/article/details/129102660&#xff09;的讲解&#xff0c;如果不了解SpringSecurity是怎么认证&#xff0c;请先看下【SpringSecurity的安…...

Java-集合(5)

Map接口 JDK8 Map接口实现子类的特点 Map和Collection是并列关系&#xff0c;Map用于保存具有映射关系的数据&#xff1a;Key-ValueMap中的key和value可以是任何引用类型的数据&#xff0c;会封装到HashMap$Node对象中Map中的key不允许重复&#xff0c;原因和HashSet一样Map…...

研制过程评审活动(四)设计定型阶段

1、设计定型阶段主要任务 设计定型的主要任务是对武器装备性能和使用要求进行全面考核,以确认产品是否达到《研制任务书》和《研制合同》的要求。   设计定型阶段应最终确定《产品规范》、《工艺规范》和《材料规范》的正式版本,并形成正式的全套生产图样、有关技术文件及目…...

【Linux】进程替换

文章目录进程程序替换替换原理替换函数函数返回值函数命名理解在makefile文件中一次生成两个可执行文件总结:程序替换时运行其它语言程序进程程序替换 程序要运行要先加载到内存当中 , 如何做到? 加载器加载进来,然后程序替换 为什么? ->冯诺依曼 因为CPU读取数据的时候只…...

LeetCode171-Excel表列序号(进制转换问题)

LeetCode171-Excel表列序号1、问题描述2、解题思路&#xff1a;进制转换3、代码实现1、问题描述 给你一个字符串columnTitle,表示Excel表格中得列名称。返回该列名称对应得列序号。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 …...

React SSR

ReactDOMServer 参考链接&#xff1a;https://zh-hans.reactjs.org/docs/react-dom-server.html ReactDOMServer 对象允许你将组件渲染成静态标记。通常&#xff0c;它被使用在 Node 服务端上 // ES modules import * as ReactDOMServer from react-dom/server; // CommonJS v…...

如何系统地优化页面性能

页面优化&#xff0c;其实就是要让页面更快地显示和响应。由于一个页面在它不同的阶段&#xff0c;所侧重的关注点是不一样的&#xff0c;所以如果要讨论页面优化&#xff0c;就要分析一个页面生存周期的不同阶段。 通常一个页面有三个阶段&#xff1a;加载阶段、交互阶段和关…...

Vulnhub 渗透练习(八)—— THE ETHER: EVILSCIENCE

环境搭建 环境下载 靶机和攻击机网络适配都选 NAT 即可。 信息收集 主机扫描 两个端口&#xff0c;22 和 80&#xff0c;且 apache httpd 2.4.0~2.4.29 存在换行解析漏洞。 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中…...

华为OD机试题 - 水仙花数 2(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

字符设备驱动基础(二)

目录 一、五种IO模型------读写外设数据的方式 二、阻塞与非阻塞 三、多路复用 3.1 应用层&#xff1a;三套接口select、poll、epoll 3.2 驱动层&#xff1a;实现poll函数 四、信号驱动 4.1 应用层&#xff1a;信号注册fcntl 4.2 驱动层&#xff1a;实现fasync函数 一、…...

看见统计——第三章 概率分布

看见统计——第三章 概率分布 参考 https://github.com/seeingtheory/Seeing-Theory中心极限定理 概率分布描述了随机变量取值的规律。 随机变量Random Variables &#x1f525; 定义&#xff1a;将样本空间中的结果映射到实数的函数 XXX 称为随机变量(random variable)&a…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...