Unity游戏资源更新(AB包)
目录
前言:
一、什么是AssetBundle
二、AssetBudle的基本使用
1.AssetBundle打包
2.BuildAssetBundle
BuildAssetBundleOptions
BuildTarget
示例
3.AssetBundle的加载
LoadFromFile
LoadFromMemory
LoadFromMemoryAsync
UnityWebRequestAsssetBundle
前言:
随着移动终端的发展,在一些大型游戏中动态加载游戏模型、贴图等资源文件以及实现游戏的更新,对开者来说是非常重要的工作。本文将结合Unity的AssetBundle资源包来做到游戏的更新。
一、什么是AssetBundle
AssetBundle是将资源用Unity提供的一种用于存储资源的压缩格式打包后的集合,它是对资源管理的扩展,可以动态地加载和写在,并大大减少游戏所占地内存,即使是已经发布地游戏也可以用它来增加新的内容。
一般情况下,AssetBundle开发流程地具体步骤如下:
1)创建AssetBundle。开发人员在Unity中通过脚本将所需要地资源打包成AssetBundle文件。
2)上传至服务器。开发者将创建好的AssetBundle文件通过上传工具上传到游戏地服务器中,让游戏客户端可以通过访问服务器来获得当前需要地资源,进而实现游戏的更新。
3)下载AssetBundle。游戏运行时,客户端可以将服务器上的游戏更新所需要的AssetBundle下载到本地设备,再通过加载模块加载到游戏中。Unity提供了相应的API来完成从服务器的下载AssetBundle操作。
4)加载AssetBundle。AssetBundle文件下载完成后,通过Unity提供的API可以加载资源里的模型、贴图、音频等并将它们实例化更新到游戏客户端。
5)卸载AssetBundle,Unity提供了相应的方法来卸载AssetBundle,卸载它可以节约内存。
二、AssetBudle的基本使用
1.AssetBundle打包
Unity有自带的打包创建工具,开发者可以一目了然的打包而不需要任何代码。
步骤:
1)选中我们需要打包的资源,在我的示例项目中,有一个名为CubeAsset的预制件
2)在Inspector面板可以看到最底下的AssetBundle选项,现在为None
3)展开选项创建新的AssetBundle。(点击New命名)
注意:只有Asset目录下的资源文件可以被打包到AssetBundle中,AssetBundle的名称固定为小写字母,如果使用了大写,系统会自动转换为小写。每个AssetBundle都可以设置一个Variant,Variant其实是一个后缀,如果有不同分辨率的同名资源,可以添加不同的Variant来加以区分。
2.BuildAssetBundle
创建好的AssetBundle需要导出,这一过程需要编写代码来实现。
Unity简化了开发者遍历资源的过程,自行打包时会将规定的所有资源打包(即之前用打包工具创建并且命名的全部资源),然后将它们置于指定的文件夹中,其声明格式如下:
public static AssetBundleMainfest BuildAseetBundles(string outputPath,BuildAssetBundleOptions assetBundleOptions=BuildAssetBundleOption.None,BuildTarget targetPlatfom=BuildTarget.WebPlayer);
其中,outputPath参数是AssetBundle的输出路径,一般情况下为Assets目录下的某一个文件,如:Application.dataPath+"/AssetBundle"; assetBundleOptions参数为AssetBundle的创建选项; BuildTarget参数为AssetBundle的目标创建平台。
BuildAssetBundleOptions
None | 不使用任何特殊选项构建 assetBundle。 |
UncompressedAssetBundle | Don't compress the data when creating the AssetBundle. |
DisableWriteTypeTree | 不包括 AssetBundle 中的类型信息。 |
DeterministicAssetBundle | 使用存储在资源包中对象的 ID 的哈希构建资源包。 |
ForceRebuildAssetBundle | 强制重新构建 assetBundle。 |
IgnoreTypeTreeChanges | 在执行增量构建检查时忽略类型树更改。 |
AppendHashToAssetBundleName | 向 assetBundle 名称附加哈希。 |
ChunkBasedCompression | 创建 AssetBundle 时使用基于语块的 LZ4 压缩。 |
StrictMode | 如果在此期间报告任何错误,则构建无法成功。 |
DryRunBuild | 进行干运行构建。 |
DisableLoadAssetByFileName | 禁用按照文件名称查找资源包 LoadAsset。 |
DisableLoadAssetByFileNameWithExtension | 禁用按照带扩展名的文件名称查找资源包 LoadAsset。 |
AssetBundleStripUnityVersion | 在构建过程中删除存档文件和序列化文件头中的 Unity 版本号。 |
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。当被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。
BuildTarget
StandaloneOSX | 构建一个 macOS 独立平台(Intel 64 位)。 |
StandaloneWindows | 构建一个 Windows 独立平台。 |
iOS | 构建一个 iOS 播放器。 |
Android | 构建 Android .apk 独立平台应用程序。 |
StandaloneWindows64 | 构建一个 Windows 64 位独立平台。 |
WebGL | WebGL。 |
WSAPlayer | 构建一个 Windows 应用商店应用程序播放器。 |
StandaloneLinux64 | 构建一个 Linux 64 位独立平台。 |
PS4 | 构建一个 PS4 独立平台。 |
XboxOne | 构建一个 Xbox One 独立平台。 |
tvOS | 构建到 Apple 的 tvOS 平台。 |
Switch | 构建一个 Nintendo Switch 播放器。 |
Stadia | 构建一个 Stadia 独立平台。 |
CloudRendering | Build a CloudRendering standalone. |
PS5 | Build to PlayStation 5 platform. |
示例
1)在Assets目录下创建一个Editor文件夹,在Editor文件夹创建一个新的c#脚本
2)输入代码
using UnityEditor;
public class BuildAsset:Editor
{[MenuItem("Test/BuildAssetBundles")]static void BuildAssetBundle(){BuildPipeline.BuildAssetBundles("./AssetBundle", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);}
}
其中我们类继承了Editor使用了MenItem特性,我们可以在菜单栏找到Test下的BuildAssetBundle启用BuildAssetBundle方法。
在编写的输出路径中./表示在当前项目的根目录上,一般输出路径不放在Assets目录下(Assets目录:Application.dataPath) 【注意需要提前创建好输出路径的文件夹】
在打包出来的文件中,如下:
每一个AssetBundle资源都有一个和原文件相关的.mainfest文本类型文件,该文件提供了所有打包资源的CRC(Cyclic Redundancy Check,循环冗余校验)和资源依赖信息。 【如cube.mainifest文件】
除此之外还有一个.mainfest文件,该文件也是文本类型文件,记录了整个 AssetBundle文件夹的信息,包括资源的列表和各个列表之间的依赖关系。
打包好的这些文件需要上传到开发平台供客户端下载,这样就可以达到更新游戏的目的。
3.AssetBundle的加载
LoadFromFile
public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);
path | 磁盘上文件的路径。 |
crc | 未压缩内容的可选 CRC-32 校验和。如果该值不为零,则在加载内容之前,将内容与校验和进行比较,如果不匹配,则给出错误。 |
offset | 可选的字节偏移量。此值指定从何处开始读取 AssetBundle。 |
从磁盘上的文件同步加载 AssetBundle。
该函数支持任何压缩类型的捆绑包。 在lzma压缩的情况下,数据将被解压缩到内存中。可以直接从磁盘读取未压缩和块压缩的捆绑包。
与 LoadFromFileAsync 相比,此版本是同步的,在完成 AssetBundle 对象的创建之前不会返回。
这是加载 AssetBundle 的最快方法。
using UnityEngine;
using System.Collections;
using System.IO;public class LoadFromFileExample : MonoBehaviour
{void Start(){var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine("./AssetBundle","cube"));if (myLoadedAssetBundle == null){Debug.Log("Failed to load AssetBundle!");return;}var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("CubeAsset");Instantiate(prefab);myLoadedAssetBundle.Unload(false);}
}
从本地存储中加载未压缩的捆绑包时,此 API 非常高效。如果捆绑包未压缩或采用了数据块 (LZ4) 压缩方式,LoadFromFile 将直接从磁盘加载捆绑包。使用此方法加载完全压缩的 (LZMA) 捆绑包将首先解压缩捆绑包,然后再将其加载到内存中。
LoadFromMemory
public static AssetBundle LoadFromMemory(byte[] binary, uint crc);
binary | 包含 AssetBundle 数据的字节数组。 |
crc | 未压缩内容的可选 CRC-32 校验和。如果该值不为零,则在加载内容之前,将内容与校验和进行比较,如果不匹配,则给出错误。 |
从内存区域同步创建 AssetBundle。
使用此方法从字节数组创建 AssetBundle。当下载了加密数据并需要从未加密的字节创建 AssetBundle 时,这很有用。
与 LoadFromMemoryAsync 相比,此版本是同步的,在完成 AssetBundle 对象的创建之前不会返回。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class Test : MonoBehaviour
{void Start(){//异步加载的一个变形同步加载,传入具有AssetBundle数据的字节数组AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(Path.Combine("./AssetBundle", "cube")));GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeAsset");//获取这个名字的游戏物体Instantiate(wallPrefab);//实例化这个游戏物体}
}
LoadFromMemoryAsync
public static AssetBundleCreateRequest LoadFromMemoryAsync (byte[] binary, uint crc);
binary | 包含 AssetBundle 数据的字节数组。 |
crc | 未压缩内容的 CRC-32 校验和(可选)。如果该参数不为零,则加载前将内容与校验和进行比较,如果不匹配则给出错误。 |
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class Test : MonoBehaviour
{IEnumerator Start(){//打开二进制数组文件,并将打开的数据传进去AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(Path.Combine("./AssetBundle","cube")));yield return createRequest;//等待加载时间AssetBundle ab = createRequest.assetBundle;//获取加载出来的东西GameObject prefab = ab.LoadAsset<GameObject>("CubeAsset");Instantiate(prefab);}
}
从内存区域异步创建 AssetBundle。
使用该方法可从一个字节数组异步创建 AssetBundle。当使用 UnityWebRequest 下载了加密数据并需要从未加密的字节创建 AssetBundle 时,这非常有用。
与 LoadFromMemory 相比,该版本将在后台线程上执行 AssetBundle 解压缩,不会立即创建 AssetBundle 对象。
UnityWebRequestAsssetBundle
使用UnityWebRequestAssetBundle.GetAssetBundle(string uri)到服务器下载AB包,现在官方推荐的主流方式,以前使用的WWW方式下载,还有UnityWebRequest.GetAssetBundle(string uri)这两种方式都已经弃用了;使用这个方式不但可以下载服务器上的资源,同时他也可以加载本地的资源,但是强烈建议如果要加载本地资源,还是使用本地同步/异步加载的方式比较妥当
string uriPath = @"file://E:\unity\AB\AssetBundle\cube";private void Start(){StartCoroutine(MyUnityWebRequest());}IEnumerator MyUnityWebRequest(){//本地加载路径前面要加上file://否则会出错//string uriPath = @"file://D:\Unity3D_Project\Advanced\Asset Bundle Project\AssetBundles\cubewall.unity3d";//UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uriPath);//服务器上下载//UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(urlPath);//本地上下载UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uriPath);yield return request.SendWebRequest();if (string.IsNullOrEmpty(request.error) == false)//判断下载有没有出错,request.error表示错误信息{Debug.Log(request.error);//输出错误yield break;//退出携程}//AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);//获取下载到的资源//获取资源的另外一种方式,直接获取到UnityWebRequest下载到的东西然后强转成DownloadHandlerAssetBundle,然后再获取到AssetBundleAssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;GameObject prefab = ab.LoadAsset<GameObject>("CubeAsset");Instantiate(prefab);}
相关文章:
Unity游戏资源更新(AB包)
目录 前言: 一、什么是AssetBundle 二、AssetBudle的基本使用 1.AssetBundle打包 2.BuildAssetBundle BuildAssetBundleOptions BuildTarget 示例 3.AssetBundle的加载 LoadFromFile LoadFromMemory LoadFromMemoryAsync UnityWebRequestAsssetBundle 前…...
GPT分区格式
GPT分区格式 [rootlocalhost ~]# gdisk /dev/sdb -bash: gdisk: 未找到命令 [rootlocalhost ~]# yum -y install gdisk- gdisk命令用于查看磁盘使用情况和磁盘分区(GPT分区格式) - 命令格式:gdisk [选项...] [设备路径] - 常用选项&…...
SVN管理-备份还原篇
背景: 当你没有svn的时候,写代码战战兢兢,又怕代码丢失白干,搞了svn做版本管理,随着时间的推移,所有的版本信息都在唯一的svn服务器,又开始担心服务器宕机,数据丢失问题,…...
程序的重定位
可以理解为编译和链接 过程中产生的地址项都是临时的相对的。编译的时候的地址,在链接时会被修改。最终链接后生成的bin文件的地址项,在加载运行时 也会被修改。 链接器会对所有的输入文件进行扫描,之后就可以确定段的大小,符号定…...
【STM32F103】TIM定时器PWM
定时器分类 STM32F1中除了互联型产品(STM32F103C8T6为64KB Flash 中容量产品),其余有8个定时器。 可以8个定时器分为高级,通用,基本三种。 高级定时器有两个,分别是TIM1和TIM8。 通用定时器有四个&…...
图论及其应用的一些论断---选择题
在任意一个网络N=(X,Y,I,A,c)中,最大流的值等于最小割的容量。在任意6个人的集会上,要么有3个人互相认识,要么有3个人互不认识。若G为无向简单图,则图G的边数ε,点数v之间有: ε < = ( v 2 ) ε<=\binom{v}{2} ε<=...
腾讯云轻量应用服务器镜像操作系统如何选择?
腾讯云轻量应用服务器镜像怎么选择?镜像是指轻量服务器的操作系统,可以选择宝塔Linux面板8.0.4腾讯云专享版,如果需要Win系统建议选择Windows Server 2012 R2 中文版,腾讯云服务器网txyfwq.com分享腾讯云轻量应用服务器镜像操作系…...
鸿蒙原生应用/元服务开发-发布基础类型通知类型与接口
基础类型通知主要应用于发送短信息、提示信息、广告推送等,支持普通文本类型、长文本类型、多行文本类型和图片类型。 表 基础类型通知中的内容分类 目前系统仅通知栏订阅了通知,将通知显示在通知栏里。基础类型通知呈现效果示意图如下所示。 图1基础类…...
Apisix常见问题
1.通过接口操作路由时X-API-KEY cd /usr/local/apisix/conf vim config-default.yaml注释掉这一部分 #allow_admin: # http://nginx.org/en/docs/http/ngx_http_access_module.html#allow# - 0.0.0.0/24 # If we dont set any IP list, then a…...
Docker 安装Mysql
目录 Docker Mysql安装 ✨安装和配置mysql ✨远程连接mysql远程连接 MySQL 是世界上最流行的开源数据库。根据 DB-Engines的调查数据,MySQL 是第二受欢迎的数据库,仅次于 Oracle 数据库。MySQL在过去由于性能高、成本低、可靠性好,已经成…...
Pillow图像处理(PIL.Image类的详细使用)
文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库(PIL、Pillow、Scikit-image、Opencv)Pillow 官方文档(超详细,超推荐)一、PIL库与Pillow库的区别二、Pillow库(…...
嵌入式开发——ADC开发
学习目标 了解ADC开发流程掌握采样方式能够使用ADC进行芯片内部通道进行采样能够使用ADC对外部电路进行采样学习内容 GD32F4的ADC 特点: 16个外部模拟输入通道;1个内部温度传感通道(VSENSE);1个内部参考电压输入通道(VREFINT);1个外部监测电池VBAT供电引脚输入通道。ADC开…...
FreeSWITCH t38测试
主叫 192.168.100.205 被叫 192.168.100.121 主叫侧发送multipage.tif 被叫侧接收传真,保存为recv.tif 主叫侧: originate [fax_enable_t381][fax_verbose1][fax_disable_v170][fax_ident77777777][fax_enable_t38_request1]sofia/internal/1234192.168.100.121:…...
跑腿配送系统技术探析
概述 跑腿配送系统是一种基于现代科技的服务平台,通过智能化的技术手段,实现用户需求的快速响应和高效配送。本文将探讨该系统的核心技术原理,以及在实际开发中的一些代码示例。 技术原理 1. 用户请求与任务分配 跑腿配送系统的第一步是…...
【数据不完整?用EM算法填补缺失】期望值最大化 EM 算法:睹始知终
期望值最大化算法 EM:睹始知终 算法思想算法推导算法流程E步骤:期望M步骤:最大化陷入局部最优的原因 算法应用高斯混合模型(Gaussian Mixture Model, GMM)问题描述输入输出Python代码实现 算法思想 期望值最大化方法&a…...
PMP证书可以挂靠吗?
PMP证书不是国内的证书,挂靠不了呀,想挂靠,可以考软考/一建等,里面也有项目管理相关的证书。 PMP证书虽然不能挂靠,但是用处还是很大的,例如提升个人能力、薪资待遇,还有持证可享一些城市的福利…...
HTML语义化的理解
HTML语义化是指在编写HTML代码时,合理地选择适当的标签和属性来描述页面的结构和内容,使得代码更具有可读性、可维护性和可访问性。 可读性:通过使用语义化的标签,可以清晰地表达页面的结构和内容,使得代码更易于阅读和…...
(Java企业 / 公司项目)注册,配置中心Nacos的怎么使用?(含相关面试题)(一)
在企业项目中使用Nacos实现的功能操作,以及如何在自己的环境中搭建Nacos环境,包含demo 一. 官网介绍:home (nacos.io) 文档地址:Nacos 快速开始 二. 准备Nacos环境 在公司里面很多的服务以及环境都是自己搭建的所以我在这里就从…...
计算机网络---知识点
ARPANET----NFSNET—ANSNET—Internet发展及协议 移动互联网 物联网 无线自组网、无线传感器网络、无线个域网 ISO/OSI网络体系结构 TCP/IP网络体系结构 对等通信、PDU 电路交换、报文交换、分组报文交换 虚电路、数据报 信道复用技术 网络性能的主要指标(…...
力扣42. 接雨水
双指针法 思路: 将数组前后设置为 left、right 指针,相互靠近;在逼近的过程中记录两端最大的值 leftMax、rightMax,作为容器的左右边界;更新指针规则: 如果数组左边的值比右边的小,则更新 left…...
SpringSecurity-2.7中跨域问题
SpringSecurity-2.7中跨域问题 访问测试 起因 写这篇的起因是会了解到 SSM(CrosOrigin)解决跨域,但是会在加入SpringSecurity配置后,这个跨域解决方案就失效了,而/login这个请求上是无法添加这个注解或者通过配置(WebMvcConfig)去解决跨域,所以只能使用SpringSecurity提供的.c…...
Java解决字典序最小回文串
Java解决字典序最小回文串 01 题目 给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操…...
【力扣100】207.课程表
添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度,然后使用队列进行入度为0的元素的进出# 数组:下标是课程号,array[下标]是这个课程的入度# 哈希…...
2024年生成式AI支出将翻倍,到2027年将超1500亿美元
据国际数据公司(IDC)的预测,2023年全球企业在生成式人工智能(GenAI)解决方案上的投资已达194亿美元,预计在2024年将翻番。该预测还指出,包括GenAI软件、相关硬件和服务在内的支出将在2027年达到1511亿美元,…...
【代码随想录】刷题笔记Day42
前言 这两天机器狗终于搞定了,一个控制ROS大佬,一个计院编程大佬,竟然真把创新点这个弄出来了,牛牛牛牛(菜鸡我只能负责在旁边喊加油)。下午翘了自辩课来刷题,这次应该是元旦前最后一刷了&…...
数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台
数据库云平台软件厂商「北京新数科技有限公司」(以下简称「新数科技」)已于2023年完成B1轮和B2轮融资,分别由渤海创富和彬复资本投资;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年,当前产品矩阵包括数据库…...
【Linux 内核源码分析】Linux内核通知链机制
Linux内核通知链(notifier chain)是一种机制,用于实现内核中的事件通知和处理。它提供了一种灵活的方式,让不同的模块可以注册自己感兴趣的事件,并在事件发生时接收到通知。 通知链由一个或多个注册在其中的回调函数组…...
2023年度回顾:怿星科技的转型与创新
岁月不居,时节如流。随着2023年的落幕,怿星科技在这一年中不仅实现了自身的转型,还在技术创新、产品研发、行业合作和人才培养等方面取得了显著的成就。这一年,怿星科技正式完成了从服务型公司向产品型公司的战略转变,…...
STM32MP157D-DK1 Qt程序交叉编译与运行测试
上篇文章介绍了STM32MP157D-DK1开发板Qt镜像的构建,通过在Ubuntu中重新编译带有Qt功能的系统来实现。 本篇在上篇的基础上,继续搭建Qt的交叉编译环境,实现Qt程序在Ubuntu中编译,在STM32MP157板子中运行。 1 编译安装SDK 在上篇…...
Rancher 单节点 docker 部署备份与恢复
Rancher 单节点 docker 部署备份与恢复 1. 备份集群 获取 rancher server 容器名,本例为 angry_aryabhata docker ps | grep rancher/rancher6a27b8634c80 rancher/rancher:v2.5.14 xxx angry_aryabhata停止容器 docker stop angry_aryabhata创建备…...
表白网页代码/公司网站优化
在微信里面,是不能通过应用宝以外的方式去直接下载app的,但是却可以通过跳转到浏览器去下载app,因此如果刚好各位公司有刚刚上线的app,可以试试这种办法。 解决方案:弹出一个遮罩,提示用户在浏览器中打开进…...
北京注册公司代理机构/星沙网站优化seo
leetcode第377题组合总数 **思路:**动态规划 一眼看上去就是动态规划完全背包问题,凑零钱里面说到 先遍历物品在遍历背包是求组合先遍历背包在遍历物品是求排列没什么可说的,还算是比较合适吧! class Solution {public int combinationSu…...
长春公司网站建设/百度seo2022新算法更新
linux安装Navicat,界面出现乱码解决方法 (转发)参考文章: (1)linux安装Navicat,界面出现乱码解决方法 (转发) (2)https://www.cnblogs.com/miao…...
wordpress tinymce 代码高亮/互联网平台公司有哪些
项目介绍 一款 PHP 语言基于 Laravel9.x、Layui、MySQL等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件&…...
如何做公司的英文网站/广州seo团队
PageHelper是一个开源的MyBatis分页插件。它可以通过拦截器来实现自动分页。PageHelper拦截器会在查询语句执行之前拦截它并自动为其添加分页参数。PageHelper可以支持各种不同类型的数据库,包括MySQL、Oracle和PostgreSQL等。 PageHelper非常易于使用,只…...
用jsp做的简单网站代码/厦门人才网官网招聘信息网
数据描述:司机A和司机B在某市每天接送乘客的区域和时间 数据格式: 司机 上客区 下客区 上车时间 下车时间 A 漓江区 天河区 2020-07-15 10:05:10 2020-07-15 10:25:02 B 天河区 天顺区 2020-07-15 11:43:22 2020-07-15 11:55:45 A 常德区 天河区 2020-07…...