从零开始——springboot增删改查小demo

news2024/11/24 13:10:31

首先,先创建数据库 -----sushe,然后创建表 person,表结构是这样的,一共四个字段。

 向里面添加一些寝室成员数据即可。

INSERT INTO person(p_id,p_name,p_phone,p_score)VALUES
(1,'李阳','123456','7890'),
(2,'张骞','123456','7890'),
(3,'马康敬','123456','7890'),
(4,'尚世宇','123456','7890'),
(5,'赵题','123456','7890'),
(6,'王澳','123456','7890');

下面来到idea,创建springboot项目,无需添加组件。

在setting中导入本地maven模块

 然后在pom中加入依赖,注意springboot的parent的版本不易过高,2.1.5.RELRASE 即可。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>sushe</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sushe</name>
    <description>sushe</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        
        <!--分页插件,使用后可以很轻松的进行分页功能-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--thymeleaf模板-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
       <!--数据库版本为8.0.32,注意与5.0的不一致,并且配置也不一样-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然后配置application.properties 

spring.datasource.url=jdbc:mysql://localhost:3306/sushe?charaterEncoding=utf-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=*********

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.database=mysql
spring.jpa.properties.hibernate.enable.enable_lazy_load_no_trans=true

#thymleaf模板
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

mybatis.type-aliases-package=com.example.sushe.dao
mybatis.mapper-locations=classpath:mapper/*.xml

项目大概的架构是这样的

 首先实体类dao包的Person代码

package com.example.sushe.dao;

public class Person {

    private String pId;
    private String pName;
    private String pPhone;
    private String pScore;

    public Person() {
    }

    public Person(String pId, String pName, String pPhone, String pScore) {
        this.pId = pId;
        this.pName = pName;
        this.pPhone = pPhone;
        this.pScore = pScore;
    }

    public String getpId() {
        return pId;
    }

    public void setpId(String pId) {
        this.pId = pId;
    }

    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }

    public String getpPhone() {
        return pPhone;
    }

    public void setpPhone(String pPhone) {
        this.pPhone = pPhone;
    }

    public String getpScore() {
        return pScore;
    }

    public void setpScore(String pScore) {
        this.pScore = pScore;
    }

    @Override
    public String toString() {
        return "Person{" +
                "pId='" + pId + '\'' +
                ", pName='" + pName + '\'' +
                ", pPhone='" + pPhone + '\'' +
                ", pScore='" + pScore + '\'' +
                '}';
    }
}

然后是mapper层PersonMapper代码

package com.example.sushe.mapper;

import com.example.sushe.dao.Person;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

//查询数据的话应该要用链表或者数组,甚至实体类 Zsgc进行接收数据
//如果是功能类,类似于添加,删除,修改等使用void返回

@Mapper
public interface PersonMapper {

    //查询所有,使用list集合来接收
    List<Person> findAll();

    //根据单个ID进行查询
    Person findPersonById(String pId);

    //向寝室中增加一条数据
    void addPerson(Person person);

    //修改一条寝室成员信息
    void updatePerson(Person person);

    //删除一条寝室成员信息
    void deletePerson(String pId);
}

然后是PersonMapper.xml 增删改查代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.sushe.mapper.PersonMapper">

<!--    mybatis写SQL时没有黄色背景,将上面的https改为http即可-->
    <select id="findAll" resultType="com.example.sushe.dao.Person">
        select
            p_id AS pId,
            p_name AS pName,
            p_phone AS pPhone,
            p_score AS pScore
        from
            person
    </select>

    <select id="findPersonById" resultType="com.example.sushe.dao.Person">
        select
            p_id AS pId,
            p_name AS pName,
            p_phone AS pPhone,
            p_score AS pScore
        from
            person
        where p_id=#{pId}
    </select>

    <insert id="addPerson" parameterType="com.example.sushe.dao.Person">
        insert into person(p_id,p_name,p_phone,p_score)
        values(#{pId},#{pName},#{pPhone},#{pScore})
    </insert>

    <update id="updatePerson">
        update person
        set p_id=#{pId},p_name=#{pName},p_phone=#{pPhone},p_score=#{pScore}
        where p_id=#{pId}
    </update>

    <delete id="deletePerson" parameterType="com.example.sushe.dao.Person">
        delete from person where p_id=#{pId}
    </delete>

</mapper>

然后是service层的PersonService,采用接口设计

package com.example.sushe.service;

import com.example.sushe.dao.Person;

import java.util.List;

public interface PersonService {

    List<Person> findAll();

    Person findPersonById(String pId);

    void addPerson(Person person);

    void updatePerson(Person person);

    void deletePerson(String pId);


}

后面的impl中的PersonServiceImpl继承PersonService的接口,并调用PersonMapper中的增删改查与数据库进行交互。

package com.example.sushe.service.impl;

import com.example.sushe.dao.Person;
import com.example.sushe.mapper.PersonMapper;
import com.example.sushe.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PersonServiceImpl implements PersonService {
   @Autowired
    private PersonMapper personMapper;


    @Override
    public List<Person> findAll() {
        return personMapper.findAll();
    }

    @Override
    public Person findPersonById(String pId) {
        return personMapper.findPersonById(pId);
    }

    @Override
    public void addPerson(Person person) {
          personMapper.addPerson(person);
    }

    @Override
    public void updatePerson(Person person) {
         personMapper.updatePerson(person);
    }

    @Override
    public void deletePerson(String pId) {
        personMapper.deletePerson(pId);
    }
}

最后就是controller层的PersonController

package com.example.sushe.controller;

import com.example.sushe.dao.Person;
import com.example.sushe.service.PersonService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;


//重定向return "redirect:/zsgc/findAll"  中是进行二次发送请求,不是返回html页面
//在springmvc中,除了重定向就是页面请求,而一般springmvc会将页面的前缀、/templates/,后缀.html除去

@Controller
@RequestMapping("/person")
public class PersonController {

    @Autowired
    private PersonService personService;

    /**
     * 执行分页查询
     * 1、介入pagehelper插件
     * 2、一旦插件介入之后,查询所有的数据将会自动分页
     * 3、封装分页数据
     * 4、将分页数据转入model,跳转页面显示即可
     * pageInfo对象基本属性
     * list:分页集合数据
     * total:总记录数
     * isFistPage:是否第一页
     * isLastPage:是否最后一页
     * prePage:上一页
     * nextPage:下一页
     * firstPage:第一页
     * lastPage:最后一页
     */

    @RequestMapping("/findAll")
    public String findAll(@RequestParam(name="pageNum",defaultValue = "1")Integer pageNum,
                          @RequestParam(name = "pageSize",defaultValue = "6")Integer pageSize,
                          Model model){
        /**
         * 介入pageHelper插件,指定页码和页面大小
         * pageNum:页码,一般默认是首次为1
         * pageSize:页面大小,由客户和后台指定,默认值由后台提供
         * */
        PageHelper.startPage(pageNum,pageSize);

        List<Person> allStudent=personService.findAll();

        PageInfo<Person> pageInfo=new PageInfo<>(allStudent);

        model.addAttribute("list",pageInfo);

        return "/person/person-list";

    }

    @RequestMapping("/add")
    public String add(){
        return "/person/person-add";
    }

    @RequestMapping("/addPerson")
    public String addPerson(Person person){

        personService.addPerson(person);

        return "redirect:/person/findAll";
    }

    @RequestMapping("/update")
    public String update(String pId,Model model){

        Person updatePerson=personService.findPersonById(pId);

        model.addAttribute("updateP",updatePerson);

        return "/person/person-update";
    }

    @RequestMapping("/updatePerson")
    public String updatePerson(Person person){
        personService.updatePerson(person);

        return "redirect:/person/findAll";
    }

    @RequestMapping("/delete")
    public String delete(String pId){
        personService.deletePerson(pId);
        return "redirect:/person/findAll";
    }


}

最后,就是三个小页面

person-list.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>员工列表</title>
    <style>
        tr:hover {
            background-color: darkgrey;
        }

        button {
            background-color: skyblue;
        }

        a {
            text-decoration: none;
            color: white;
        }
    </style>
</head>
<body>
&nbsp;&nbsp;&nbsp;
<button style="margin-left: 205px">
    <a th:href="@{/person/add}">添加</a>
</button>

<br>
<!--查询所有员工分页数据--->
<div th:if="${list}" align="center" style="margin-top: 8px;margin-bottom: 8px">
    <table border="1" style="border-collapse: collapse;width: 70%">
        <!--表头-->
        <tr>
            <th>员工编号</th>
            <th>姓名</th>
            <th>电话号码</th>
            <th>身份证号码</th>
            <th>操作</th>
        </tr>
        <!--表数据-->
        <tr th:each="person,personStat:${list.list}" align="center">
            <td th:text="${person.pId}"></td>
            <td th:text="${person.pName}"></td>
            <td th:text="${person.pPhone}"></td>
            <td th:text="${person.pScore}"></td>
            <td>
                <button>
                    <a th:href="@{/person/update(pId=${person.pId})}" onclick="return check()">编辑</a>
                </button>
                <button>
                    <a th:href="@{/person/delete(pId=${person.pId})} " onclick="return checkDel()">删除</a>
                </button>
            </td>
        </tr>

    </table>
    <br>
    <!--分页基础数据-->
    <span th:text="|共有${list.total}条|"></span>
    &nbsp;
    <span th:text="|共有${list.pages}页|"></span>
    &nbsp;
    <span th:text="|当前${list.pageNum}页|"></span>
    <br>
    <!--分页查询按钮-->
    <button>
        <!--默认查询第一页即可-->
        <a th:href="@{/person/findAll}">首页</a>
    </button>
    <button>
        <a th:href="@{/person/findAll(pageNum=${list.isFirstPage}?${list.firstPage}:${list.prePage})}">上一页</a>
    </button>
    <button>
        <a th:href="@{/person/findAll(pageNum=${list.isLastPage}?${list.lastPage}:${list.nextPage})}">下一页</a>
    </button>
    <button>
        <a th:href="@{/person/findAll(pageNum=${list.pages})}">尾页</a>
    </button>
</div>
<!--js脚本-->
<script>
    function checkDel() {
        if (confirm("确认删除")) {
            return true;//删除
        } else {
            return false;//取消
        }
    }
    function check() {
        if (confirm("确认修改")) {
            return true;//修改
        } else {
            return false;//取消
        }
    }
</script>
</body>
</html>

person-add.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>员工添加</title>
</head>
<body>
<div align="center" style="margin-top: 25%">
    <!--添加表单-->
    <!--在表单提交后进行请求/zsgc/addZsgc处理-->
    <form th:action="@{/person/addPerson}" method="post" onsubmit="return checkAdd()">
        姓名:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <input id="pName" name="pName" placeholder="输入姓名"><br>
        电话号码:
        <input id="pPhone" name="pPhone" placeholder="输入电话号码"><br>
        身份证号:
        <input id="pScore" name="pScore" placeholder="输入身份证号码"><br>
        <br>
        <input type="submit" value="确认添加"><br>
    </form>
</div>
<!--js脚本-->
<script>
    function checkAdd() {
        //获取用户输入的值
        var same = document.getElementById("pName").value;
        var age = document.getElementById("pPhone").value;
        var address = document.getElementById("pScore").value;
        //校验数据(只判断是否为空)
        //对于数据,还需判断输入的值能否正确转换为数值
        if (pName == "" || pName == null) {
            alert("姓名不能为空");
            return false;
        } else if (pPhone == "" || pPhone == null) {
            alert("电话号码不能为空");
            return false;
        } else if (pScore == "" || pScore == null) {
            alert("身份证号码必填");
            return false;
        } else {
            return true;//允许提交表单
        }
    }
</script>
</body>
</html>

person-update.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>员工信息修改</title>
</head>
<body>
<div align="center" style="margin-top: 25%">
    <!--修改表单-->
    <form th:action="@{/person/updatePerson(pId=${updateP.pId})}" method="post" onsubmit="return checkAdd()">
        <!--disabled="disabled"是用来将信息锁定的,是禁止修改的-->
        编号:
        <input th:value="${updateP.pId}" id="pId" name="pId" disabled="disabled"><br>
        姓名:
        <input th:value="${updateP.pName}" id="pName" name="pName" placeholder="输入姓名"><br>
        电话:
        <input th:value="${updateP.pPhone}" id="pPhone" name="pPhone" placeholder="输入年龄"><br>
        身份证:
        <input th:value="${updateP.pScore}" id="pNumber" name="pNumber" disabled="disabled"><br>
        <br>
        <input type="submit" value="确认修改"><br>
    </form>
</div>
<!--js脚本-->
<script>
    function checkAdd() {
        //获取输入的值
        var same = document.getElementById("pName").value;
        var age = document.getElementById("pPhone").value;
        //校验数据(只判断是否为空)
        //对于年龄等数据,还需判断输入的值能否正确转换为数值
        if (pName == "" || pName == null) {
            alert("姓名不能为空");
            return false;
        } else if (pPhone == "" || pPhone == null) {
            alert("电话号码不能为空");
            return false;
        }  else {
            return true;//允许提交表单
        }
    }
</script>
</body>
</html>

最后运行即可

展示页面

主页面

 增加页面

 更新页面

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

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

相关文章

【C语言】指针概要

文章目录 一、什么是指针二、指针类型三、野指针四、二级指针五、字符指针六、数组指针定义数组名 七、函数指针 一、什么是指针 指针就是地址&#xff0c;口语中说的指针通常指的是指针变量。我们可以通过&&#xff08;取地址操作符&#xff09;取出变量的内存起始地址&a…

Nginx转发域名与新增SSL证书校验

1.申请SSL证书 各大资源&#xff1a;SSL免费证书资源 2.我选择的是站点服务 申请成功的界面&#xff1a; 官网安装教程&#xff1a;看看就好系列 3.下载成功后把文件当道nginx中的目录下 4.编写nginx.config配置 增加server配置 通过监听zlXXX.cc域名访问 重定向到https…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

X86架构上的Linux操作系统安装与配置ARM架构(并进行示例测试/为DDS编译打基础)

1 查看Linux操作系统是运行在X86架构还是ARM架构平台上2 X86和ARM到底是什么关系&#xff1f;3 X86、ARM、Linux三者的关系到底是什么&#xff1f;&#xff08;大白话理解&#xff09;4、在X86架构的Linux操作系统上搭建ARM架构并进行测试&#xff08;看elf文件的类型是否属于a…

Spark---第 1 章 Spark 内核概述

Spark 内核泛指 Spark 的核心运行机制&#xff0c;包括 Spark 核心组件的运行机制、Spark 任务调度机制、Spark 内存管理机制、Spark 核心功能的运行原理等&#xff0c;熟练掌握 Spark 内核原理&#xff0c;能够帮助我们更好地完成 Spark 代码设计&#xff0c;并能够帮助我们准…

HTML5+CSS3小实例:带进度条的人物卡片切换效果

实例:带进度条的人物卡片切换效果 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

XHcms 1.0代码审计

关于熊海CMS1.0的代码审计&#xff0c;一直想要提升自己的代码审计的能力&#xff0c;php没有继续去深入的学习这门语言&#xff0c;反而直接是审计CMS&#xff0c;就拿着熊海CMS来进行审计。 关于熊海cms的源码&#xff0c;附在下方&#xff1a; 链接&#xff1a;https://pan…

How to Write and Publish a Scientific Paper-Preparing the Tables and Figures

Preparing the Tables and Figures 目录 Preparing the Tables and FiguresWHEN TO USE TABLESHOW TO ARRANGE TABULAR MATERIALEXPONENTS IN TABLE HEADINGSFOLLOWING THE JOURNAL’S INSTRUCTIONSTITLES, FOOTNOTES, AND ABBREVIATIONSADDITIONAL TIPS ON TABLES WHEN TO USE…

algo算法实验平台代码分享

algo算法实验平台代码分享 1. 介绍 本实验平台包括前端及后台两个模块&#xff0c;前端由 vue开发而来&#xff0c;后端主要采用 python编写&#xff0c;主要用于算法效果测试测评及改进。 原平台算法已做脱敏&#xff0c;使用者可以根据自己需求进行改写或开发&#xff0c;此…

Echarts使用,大数据量时,折线图曲线Y轴取值刻度不正确

如下图&#xff0c;当数据量过大时&#xff0c;会出现数值对应Y轴刻度显示不正确问题。 ​​​​​​​ 可检查配置项是否存在sampling字段 option {series: [{data: [...],type: line,smooth: true,symbolSize: 0,sampling: "average", // 注意此行}] }; samplin…

android 中颜色的基础知识

一.简单介绍Android中的颜色 安卓支持的颜色模式&#xff1a; PS&#xff1a;其中字母表示通道类型&#xff0c;数值表示该类型用多少位二进制来描述。如ARGB8888则表示有四个通道(ARGB),每个对应的通道均用8位来描述。 注意&#xff1a;我们常用的是ARGB8888和ARGB4444&am…

java 网上二手车销售系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上二手车销售系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0…

C#ConsoleKey类讲解

大家好&#xff0c;我是华山自控编程朱老师 前几天一个学员在学习C#与ConsoleKey类交互时,对ConsoleKey提取的键盘字符有些疑惑 。下面我们就详细讲讲C# 和ConsoleKey交互的相关知识。 C#和ConsoleKey是编程领域中重要的概念和工具之一。C#是一种通用的、面向对象的编程语言&…

【优选算法】—— 双指针问题

从今天开始&#xff0c;整个暑假期间。我将不定期给大家带来有关各种算法的题目&#xff0c;帮助大家攻克面试过程中可能会遇到的算法这一道难关。 目录 &#xff08;一&#xff09; 基本概念 &#xff08;二&#xff09;题目讲解 1、难度&#xff1a;easy 1️⃣移动零 2️…

数据结构——二叉树的实现

什么是二叉树&#xff1f; 二叉树&#xff08;binary tree&#xff09;是指树中节点的度不大于2的有序树&#xff0c;它是一种最简单且最重要的树。二叉树的递归定义为&#xff1a;二叉树是一棵空树&#xff0c;或者是一棵由一个根节点和两棵互不相交的&#xff0c;分别称作根…

【实验七】界面化和事件处理

1、完成书上239页实验题目1和题目2 题目1 package chap10.test; //awt是一个软件包&#xff0c;包含用于创建用户界面和绘制图形图像的所有分类。 import java.awt.BorderLayout;//边界管理器import java.awt.Color; import java.awt.FlowLayout;//流布局一般用来安排面板中的…

Django_自定义文件存储类并将图片上传到FastDFS

目录 将图片到FastDFS和浏览的流程图 使用自定义文件存储类 1、定义存储类 2、创建FastDFS的配置文件 3、修改settings.py配置 4、上传图片进行验证 4.1 定义一个包含ImageField字段的模型类 4.2 登录django的admin后台 4.3 上传图片 4.4 查看图片 源码等资料获取方…

What Is the Character Limit for ChatGPT? 聊天GPT的字符限制是多少?

The character limit for ChatGPT text prompts is 4096 characters, and there’s also a limit of 4096 tokens per conversation. If you aren’t sure how many tokens your prompt uses, you can calculate that with OpenAI’s Tokenizer tool. ChatGPT 文本提示的字符限…

AutoHand第三人称的AutoHandVRIK开启和关闭

第三人称结构 第三人称在AutoHandVRIK脚本初始化完毕后&#xff0c;会出把两只手提到玩家对象根部对象上&#xff0c;并且在原始的模型手的位置创建了新的对象&#xff08;leftHandFollowTarget&#xff0c;rightHandFollowTarget&#xff09;&#xff0c;副VRIK大概用途就是I…

从字母百分比看字符串处理的奥妙

本篇博客会讲解力扣“2278. 字母在字符串中的百分比”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff0c;统计字符letter在字符串s中出现的次数cnt&#xff0c;以及字符串s的长度n&#xff0c;其中n也可以使用strlen来求。最终要求计算的百分比是cnt*100/n。 int…