关于SpringMVC的一点学习笔记

news2024/11/15 15:32:32

关于SpringMVC的一点学习笔记

  • 1、 maven依赖/目录结构
  • 2、配置文件
  • 3、从前端请求开始
  • 4、Controller
  • 5、Service
  • 6、Dao
  • 7、mybatis
  • 8、utils公共类
  • 9、 分页查询 QueryPageBean / PageResult
  • 10、静态页面Freemarker用在经常访问但不经常变化的页面场景中
  • 11、Reids
  • 12、Echarts
  • 13、认证、授权Spring Security
  • 14、批处理任务Spring Schedule
  • 参考资料

1、 maven依赖/目录结构

  1. pom文件
    大型工程可转列一个公共common模块,用于提供公共的方法类,如日期格式处理、SMS短信等;
    设置一个interface接口模块,用于Controller与Service分离的情况(如dubbo等),但对于小工程这种分离会降低调试效率,因为Controller与Service是分离的,通过接口的maven install来更新,比较慢。可先开发,后分离。
    参考一个较为齐全的pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>health_parent</artifactId>
        <groupId>cn.cathayinfo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>health_common</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
        </dependency>
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.miemiedev</groupId>
            <artifactId>mybatis-paginator</artifactId>
        </dependency>

        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <!-- dubbo相关 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
        </dependency>


        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>


    </dependencies>
</project>
  1. 父子工程:parent
    parent组织全部工程,并统一依赖版本
  2. build:Tomcat轻量级Tomcat,可不依赖于本机的Tomcat,使得开发和上线运行容器环境一致
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
  1. 目录结构:src->main->java/resource/webapp
    maven的骨架结构,可自建和使用骨架。

2、配置文件

  1. web.xml
    要点:
    (1)将springmvc作为默认处理请求的DispatcherServlet
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value> <!-- 通过这里将web.xml与springmvc.xml发生关联 -->
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

(2)处理编码问题

<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>utf-8</param-value>
  </init-param>
  <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

(3)采用系统登录的话处理登录问题 (用这种方式感觉有些复杂,还没太搞明白)

  1. springmvc.xml
    开启注解
    自动扫描根目录的设置
    各种bean的加载(数据库、redis、文件上传、dubbo等)
  2. DemoDao.xml
    参考中文官网
  3. jdbc.properites
    放在resource的一级目录下可自动加载,可在Spring中以${value}的形式读取数值
  4. log4j.properties
    log4j日志记录
    配置模板:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
​
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
​
### set log levels - for more verbose logging change 'info' to 'debug' ###
​
log4j.rootLogger=debug, stdout
  1. freemarkerDemo.ftl
    freemarker使用场景:主要用于经常访问,但不怎么变化的页面(如物品详情页),在添加该商品时提前生成,减少数据库查询频率。
private void generateHtml(String templateName, String htmlPageName, Map dataMap) {
        Configuration configuration = freeMarkerConfigurer.getConfiguration();
        Writer writer = null;
        try {
            Template template = configuration.getTemplate(templateName);
            writer = new FileWriter(new File(outputpath+"\\"+htmlPageName));
            template.process(dataMap,writer);
        }catch (Exception ex){
            ex.printStackTrace();
        }finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

3、从前端请求开始

axios.get axios.post是两种常用的请求方式,以json格式发送和接收输入,=>是ECMAScript6规范。以res接收服务端发过来的response,解析其中的res.data.data。后端配套Result类作为统一的返回数据类,规范交互。

created(){
            axios.post("/user/getUsername.do").then(
                res=>{
                    if (res.data.flag){
                        this.username = res.data.data;
                        axios.post("/user/getMenuList.do").then(
                            res => {
                                if (res.data.flag){
                                    this.menuList = res.data.data;
                                }
                            }
                        );
                    }
                })
        }

4、Controller

@RestController ----------Controller与Respondbody的集合体
@RequestMappping(“/user”)
@Reference(dubbo)
@Autowired
@RequestParameter(“id”) ------- 接收单个指定名称的字段
@RequestBody User ----------直接将前台传过来的json转为pojo对象

5、Service

@Service
@Transional 重点:注意事务的捕捉等级(rollbackFor = Exception.class)与异常抛出的等级(RuntimeException、 Exceptio)的对应关系。如下文注释部分。

@Service(interfaceClass = BankService.class)
@Transactional
public class BankServiceImpl implements BankService {

    @Autowired
    private BankDao bankDao;

    @Override
    public void transforMoney(String from, String to, int money) throws Exception{

        BankUser fromBankUser = bankDao.getBankUserByName(from);
        BankUser toBankUser = bankDao.getBankUserByName(to);

        Map map = new HashMap();
        map.clear();
        map.put("id", toBankUser.getId());
        map.put("money", toBankUser.getMoneycount() + money);
        bankDao.updateCount(map);


        if (fromBankUser.getMoneycount() - money < 0) {
            bankDao.mistake(1);
            //throw new Exception("余额不足");
            //注意Spring默认捕捉到RuntimeException和Error的错误才会rollback回退事务,
            //所以(1)(2)都行,但是(!3)无法回退事务
            //(1)@Transactional  与 throw new RuntimeException("余额不足");
            //(2)@Transactional(rollbackFor = Exception.class) 与  throw new Exception("余额不足");
            //(!3)@Transactional 与 throw new Exception("余额不足");
        }
        map.clear();
        map.put("id", fromBankUser.getId());
        map.put("money", fromBankUser.getMoneycount() - money);
        bankDao.updateCount(map);

    }
}

6、Dao

只写接口,对应在mybatis的xml文件中描述,main、resource路径是完全对应的,maven install后合并在同一路径下。

7、mybatis

xml文件
select --------(1)如果数据库字段名与pojo字段名不对应时使用 select member_id as “memberId” … 的方式insert --------(1)主键是由数据库自增的,可通过以下配置实现主键id的自返回

<insert id="add" parameterType="cn.cathayinfo.pojo.CheckGroup" useGeneratedKeys="true" keyProperty="id">
        insert into t_checkgroup (code,name,helpCode,sex,remark,attention)
        values (#{code},#{name},#{helpCode},#{sex},#{remark},#{attention})
    </insert>

parameterType 注意多个复杂参数时用map传进去
resultType -------- pojo时指定路径全称
resultMap ------------- 最复杂、多表联合查询,

<select id="findById" resultMap="findByIdResultMap">
  select * from t_setmeal  where id=#{id}
</select>
<resultMap type="pojo.Setmeal" id="baseResultMap">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="code" property="code"/>
  <result column="helpCode" property="helpCode"/>
  <result column="sex" property="sex"/>
  <result column="age" property="age"/>
  <result column="price" property="price"/>
  <result column="remark" property="remark"/>
  <result column="attention" property="attention"/>
  <result column="img" property="img"/>
</resultMap>
<resultMap type="pojo.Setmeal" 
           id="findByIdResultMap" 
           extends="baseResultMap">
  <collection property="checkGroups" 
              javaType="ArrayList"
              ofType="pojo.CheckGroup" 
              column="id"
              select="findCheckGroupById">
  </collection>
</resultMap>

8、utils公共类

DateUtils
POIUtils
QiniuUtilis
SMSUtilis
CalidateCode/Redis/Cookies

9、 分页查询 QueryPageBean / PageResult

@Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        Page<CheckGroup> checkGroups = checkGroupDao.selectByCondition(queryPageBean.getQueryString());
        return new PageResult(checkGroups.getTotal(), checkGroups);
    }

10、静态页面Freemarker用在经常访问但不经常变化的页面场景中

http://freemarker.foofun.cn/index.html

11、Reids

12、Echarts

<script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart1 = echarts.init(document.getElementById('chart1'));

        // 使用刚指定的配置项和数据显示图表。
        //myChart.setOption(option);

        axios.get("/report/getMemberReport.do").then((res)=>{
            myChart1.setOption(
                                {
                                    title: {
                                        text: '会员数量'
                                    },
                                    tooltip: {},
                                    legend: {
                                        data:['会员数量']
                                    },
                                    xAxis: {
                                        data: res.data.data.months
                                    },
                                    yAxis: {
                                        type:'value'
                                    },
                                    series: [{
                                        name: '会员数量',
                                        type: 'line',
                                        data: res.data.data.memberCount
                                    }]
                                });
        });
    </script>

13、认证、授权Spring Security

(1)基础表:User、Role、Permission、Menu 及 t_user_role、t_role_permission、t_role_menu。
请添加图片描述

(2)配置spring-security.xml文件,并引入到springmvc中;
(3)在web中配置权限filter;
(4) 实现@Component public class SpringSecurityUserService implements UserDetailsService
在这个类中实现上述表格的查询,根据用户user查询角色role,根据角色role查询可以看到哪些菜单Menu,根据角色role查询拥有哪些权限Permission。
(5)在每个方法上注解好权限要求

@PreAuthorize("hasAnyAuthority('CHECKITEM_QUERY')")
@RequestMapping("findAll")
public Result findAll() {
  try {
    List<CheckItem> checkItems =  checkItemService.findAll();
    return new Result(true, MessageConstant.QUERY_CHECKITEM_SUCCESS,checkItems);
   } catch (Exception ex) {
      return new Result(false, MessageConstant.QUERY_CHECKITEM_FAIL);
   }
 }

TODO:后期再找找看看有没有可视化的权限配置平台。现在使用的这个代码维护成本太高。

14、批处理任务Spring Schedule

引入Spring Schedule
cron表达式可从网上查,根据自己需求稍加修改即可
Spring Schedule的功能不够强大,单线程,处理简单问题还可,处理复杂耗时问题可能会产生死锁等待情况,可使用第三方更为强大的定时任务工具(如 Quartz Scheduler)。


    @Scheduled(cron = "0 0 12 * * ?")
    public void redisScheduledJob() {
        System.out.println("执行Redis清理缓存定时任务");
        Set<String> diff = jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES);
        if (diff != null && diff.size() > 0) {
            for (String fileName : diff) {
                QiniuUtils.deleteFromQiniu(fileName);
                jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES, fileName);
            }
        }
    }

参考资料

  1. java doc : https://docs.oracle.com/javase/8/docs/api/
  2. Spring:https://springdoc.cn/spring/index.html
  3. Spring MVC:https://springdoc.cn/spring/web.html#spring-web
  4. mybatis:https://mybatis.org/mybatis-3/zh_CN/configuration.html
  5. maven:https://maven.apache.org/pom.html
  6. freemarker:http://freemarker.foofun.cn/index.html
  7. echarts:https://echarts.apache.org/examples/zh/index.html
  8. axios:http://www.axios-js.com/zh-cn/docs/

以上。

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

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

相关文章

后台管理权限自定义按钮指令v-hasPermi

第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…

软件设计之MySQL(2)

软件设计之MySQL(2) 此篇应在JavaSE之后进行学习: 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 Navicat可以在软件管家下载 使用navicat连接mysql数据库创建数据库、表、转储sql文件&#xff0c;导入sql数据 学习内容&#xff1a; 基础的SELECT语…

数据分析:宏基因组数据的荟萃分析

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 介绍 宏基因组数据的荟萃分析是一种综合多个独立宏基因组研究结果的方法&#xff0c;目的是揭示不同人群或样本中微生物群落的共同特征和差异。这种方法特别适用…

ubantu安装python3.10

1.从官网下载安装 1.1安装依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev1.2从官网下载源文件 wget https://www.python.org/ftp/pyth…

设计资讯 | 巴黎 2024 年奥运会“另一个自我”以 DAB 汽车定制电动摩托车的形式亮相

巴黎 2024 年奥运会运动作为定制电动摩托车 DAB Motors 融入了2024 年巴黎奥运会的精神&#xff0c;通过其定制电动摩托车诠释了奥运会的五环。这些车辆由其服务部门 DAB Custom Studio (DCS) 提供&#xff0c;颜色编码与奥运五环一样。每种颜色代表一项运动&#xff1a;蓝色代…

RobotFramework框架+Selenium实现UI自动化测试(十六)

学习目录 1 UI自动化测试 2安装RF框架所需的 robotframework-seleniumlibrary包 1&#xff09; robotframework-seleniumLibrary版本说明 2&#xff09; robotframework-selenium2Library版本说明 3 selenium介绍 3.1 配置操作系统环境支持使用selenium打开浏览器 3.2 s…

「OC」简单网络请求的实现

「OC」简单网络请求的实现 文章目录 「OC」简单网络请求的实现写在前面URL和API网络请求的流程网络申请数据解析参考文章 写在前面 在暑假最后一个项目天气预报之中&#xff0c;使用了网络请求&#xff0c;虽然说还是不太理解网络请求之中的相关内容&#xff0c;以及在写天气预…

傻瓜式一步到位Mysql 8.0 密码修改

5.7之前修改密码语句 update user set authentication_string password(“root”) where user “root”; mysql 5.7.9以后废弃了password字段和password()函数&#xff1b;并在user表加了authentication_string:字段表示用户密码 #进入到mysql 安装目录下 #停止 mysql 服务 …

低碳环保测试知识问答活动

全国生态日&#xff0c;倒计时1天。为了组织这场关于“低碳环保测试知识问答”主题的线上知识竞赛&#xff0c;我们历经从活动方案策划到落地答题小程序上线。 一、活动背景 通过举办此次知识竞赛&#xff0c;旨在提高公众对低碳环保的认识和参与度&#xff0c;推广低碳生活方…

网络协议七 应用层 DNS协议 和 DHCP协议 这两个都了解就好

应用层常见的协议 1. DNS 协议 了解 将baidu.com 解析成具体IP的协议 实际上可以理解为&#xff1a;客户端 通过 DNS 协议 和 DNS 服务器进行交互&#xff0c;将域名转换成IP 2. DHCP 协议 了解 从DHCP 服务器自动获取IP地址

P1305 新二叉树

题目&#xff1a; 洛谷传送门&#xff1a;P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,ans; char root; struct node{char nod,r,l; }a[100000]; void dfs(char idx){cout<…

Erupt 项目搭建

创建Spring Boot项目 Maven依赖 Spring Boot版本为 2.7.10&#xff0c;erupt版本为 1.12.14 erupt版本要与Spring Boot版本适配&#xff0c;3.x.x版本Spring Boot暂不适用说是 <properties><erupt.version>1.12.14</erupt.version></properties> <…

全场景——(三)USB开发基础(1)

文章目录 一、USB 系统硬件框架和软件框架1.1 实验现象1.2 硬件框架1.3 软件框架 二、USB 电气信号2.1 USB 设备状态切换图2.2 硬件线路2.3 电子信号2.4 低速/全速信号电平2.5 高速信号电平2.6 设备连接与断开2.6.1 连接2.6.2 断开 2.7 复位2.8 设备速率识别2.8.1 低速/全速2.8…

【STM32】入门教程(完整版汇总非常详细)

本教程参考b站江协科技STM32入门教程&#xff0c;视频链接&#xff1a; 哔哩哔哩江协科技STM32入门教程https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from333.337.search-card.all.click “唯一能持久的竞争优势是胜过竞争对手的学习能力。”——盖亚斯 希望对您有帮…

栈的定义及基本操作

栈的定义和特点 栈是一个特殊的线性表&#xff0c;是限定在一端进行插入和删除操作的线性表&#xff1b; 插入到栈顶称作入栈&#xff08;PUSH) 从栈顶删除最后一个元素称作出栈 &#xff08;POP&#xff09; 图1 栈的表示 假设三个元素a,b,c入栈顺序为a&#xf…

【洛谷/水滴题解】[NOIP2005 普及组] 采药

1.难度&#xff1a;普及- 2.类型&#xff1a;dp&#xff0c;01背包 3.描述&#xff0c;输入输出格式&#xff0c;样例&#xff1a; 4.AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int t,m; int dp[1005]; int main() {ios::sync_with_stdio(false…

MySQL第8讲--DCL(数据控制语言)的基本操作

文章目录 前言DCL(数据控制语言)用户管理查询用户创建用户修改用户密码删除用户 权限控制查询权限授予权限撤销权限 前言 在第六讲MySQL第6讲–DQL(数据查询语言)的基本操作之基本和条件查询和第七讲MySQL第7讲–DQL(数据查询语言)的基本操作中我们讲述了DQL中的&#xff0c;基…

高性能云桌面在工业设计中的应用,百度智能云云桌面给出答案

在之前的文章中我们讲到&#xff0c;边缘云桌面可以通过在距离用户较近的边缘节点上直接处理数据和应用&#xff0c;减少了数据传输时间&#xff0c;降低延迟&#xff0c;提高数据处理的速度和安全性。用户可以通过任何设备&#xff0c;随时随地访问自己的桌面环境&#xff0c;…

每日OJ_牛客HJ59 找出字符串中第一个只出现一次的字符

目录 牛客HJ59 找出字符串中第一个只出现一次的字符 解析代码 牛客HJ59 找出字符串中第一个只出现一次的字符 找出字符串中第一个只出现一次的字符_牛客题霸_牛客网 解析代码 可以用一个数组的每一个位置表示对应的位置。对应的字符位置存放字符出现的次数。统计完之后&…

【云备份】学习bundle库

文章目录 1.认识bundle⽂件压缩库bundle库实现⽂件压缩bundle实现文件解压缩 1.认识bundle⽂件压缩库 BundleBundle 是一个嵌入式压缩库&#xff0c;支持23种压缩算法和2种存档格式。使用的时候只需要加入两个文件 bundle.h 和 bundle.cpp 即可。 showcase #include <cass…