用户信息列表实现增删改查案例的实现【问题及解决过程记录】【综合案例】

news2024/9/9 4:39:50

目录

用户信息列表展示案例

1. 需求:

 1. 简单功能

        1. 列表查询        2. 登录        3. 添加        4. 删除        5. 修改

  2. 复杂功能

        1. 删除选中        2. 分页查询            * 好处:                1. 减轻服务器内存的开销                2. 提升用户体验        3. 复杂条件查询

2. 设计:

 1. 技术选型:

3. 开发:

        1. 环境搭建

                 1. 创建数据库环境                 2. 创建项目,导入需要的jar包

 细节:

                1.添加jar包要注意版本是否适配

                 2.配置文件要根据实际情况进行修改​编辑

         3.注意查询语句是否正确

       4、据要写在forEach内​编辑

       2. 编码

4. 测试

 进阶:

关于登录界面login.jsp

 添加联系人功能

 删除功能

 修改功能

复杂功能

删除选中

 分页查询

​编辑

复杂功能

复杂条件查询功能

  动态查询小技巧:


用户信息列表展示案例

1. 需求:

 1. 简单功能

        1. 列表查询
        2. 登录
        3. 添加
        4. 删除
        5. 修改


  2. 复杂功能

        1. 删除选中
        2. 分页查询
            * 好处:
                1. 减轻服务器内存的开销
                2. 提升用户体验
        3. 复杂条件查询


2. 设计:

 1. 技术选型:

Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtils+tomcat

控制器 + 页面展示+ 操作数据库+ 自动封装 + 连接池提高连接效率+ 封装数据 + 部署到服务器上

  

    2. 数据库设计:
        create database test01; -- 创建数据库
        use test01;                -- 使用数据库
 CREATE TABLE user2(  -- 创建表
    id int PRIMARY KEY auto_increment,
    name VARCHAR(20) not null,
    gender VARCHAR(5), 
    age INT,
    address VARCHAR(32),
    qq VARCHAR(20),
    email VARCHAR(50)
);

3. 开发:

        1. 环境搭建

                 1. 创建数据库环境
                 2. 创建项目,导入需要的jar包

 细节:

                1.添加jar包要注意版本是否适配

 

                 2.配置文件要根据实际情况进行修改

         3.注意查询语句是否正确

       4、据要写在forEach内

       2. 编码

4. 测试

  在/test02/userListServlet下可以输出,但是list.jsp下没有打印出来

 

 试着打印UserListServlet,
response.getWriter();

输出无法识别中文,句首加入

//简单的形式,设置编码,是在获取流之前设置
        response.setContentType("text/html;charset=utf-8");
即可。

 最后终于得出错误原因,不是代码错误也不是配置错愕,是进入的网址错误,得从index.jsp进入首页

 成了!

接着添加增删改操作

先在UserService接口添加对应接口

添加数据,报错

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [insert into user2 set name=?,gender=?,age=?,adress=?,qq=?,email=?]; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'adress' in 'field list'

 查了半天是拼写错误

一个好消息,一个坏消息

好消息:写进去了

坏消息:但没完全写进去

出现中文乱码且丢失

//设置request编码
request.setCharacterEncoding("utf-8");

会发现性别和籍贯因为是有默认选择的复选框,不是手动输入的数据,所以未被存储进去,需要在UserAddServlet里添加存储进去,这样选择框里的对象也能获取到

UserAddServlet代码:
package cn.web.servlet;

import cn.domain.User;
import cn.service.UserService;
import cn.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 乱码酱
 * @date :2022-11-29 15:44
 * @program: HTMLStudy
 * @create:
 */
@WebServlet("/userAddServlet")
public class UserAddServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置request编码
        request.setCharacterEncoding("utf-8");

        //调用UserService完成添加
        UserService service = new UserServiceImpl();
        //获取参数
        String name = request.getParameter("name");
        String gender = request.getParameter("gender");
        int age = Integer.parseInt(request.getParameter("age"));
        String adress = request.getParameter("address");
        String qq = request.getParameter("qq");
        String email = request.getParameter("email");

        //添加到User里
        User user = new User();
        user.setName(name);
        user.setGender(gender);
        user.setAge(age);
        user.setAddress(adress);
        user.setQq(qq);
        user.setEmail(email);
//        调用UserService层
        User user1 = service.addUser(user);

        //        将list存入request域
        request.setAttribute("user1",user);


        //转发到
        request.getRequestDispatcher("/index.jsp").forward(request,response);
3.调转到重新查询的servlet
//        response.sendRedirect(request.getContextPath()+"/userListServlet");
  }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

 进阶:

将已有用户信息列表改进为后面一种格式

 使用Bootstrap上的内联表单样式,但是出现了分层

 解决方法:在div标签的style样式加一个float浮动即可

<div style="float: left">

 至于分页,在Bootstrap的中文档首页“组件”复制分页即可。

关于登录界面login.jsp

验证码执行一个refreshCode();方法

 添加登录所需字段username和password

 可以在数据库查询是否添加成功

SELECT * FROM user2;

 添加好内容

 数据库添加字段,对应实体类User也要跟着修改

 先进入登录界面login.jsp,登录成功会提示

 

 添加联系人功能

  在list.jsp中添加联系人按钮路径跳转到add.jsp

 add.jsp也要连接指定servlet

 之前的addservlet没用util工具类,需要一个一个添加,

@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置request编码
        request.setCharacterEncoding("utf-8");

        //调用UserService完成添加
        UserService service = new UserServiceImpl();
        //获取参数
        String name = request.getParameter("name");
        String gender = request.getParameter("gender");
        int age = Integer.parseInt(request.getParameter("age"));
        String adress = request.getParameter("address");
        String qq = request.getParameter("qq");
        String email = request.getParameter("email");

        //添加到User里
        User user = new User();
        user.setName(name);
        user.setGender(gender);
        user.setAge(age);
        user.setAddress(adress);
        user.setQq(qq);
        user.setEmail(email);
//        调用UserService层
        User user1 = service.addUser(user);

        //        将list存入request域
        request.setAttribute("user1",user);
        

        //转发到
        request.getRequestDispatcher("/index.jsp").forward(request,response);
3.调转到重新查询的servlet
//        response.sendRedirect(request.getContextPath()+"/userListServlet");
  }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

后来加入了工具类,效率提高

 //1.设置编码
        request.setCharacterEncoding("utf-8");
        //2.获取参数
        Map<String, String[]> map = request.getParameterMap();
        //3.封装对象
        User user = new User();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //4.调用service方法报错
        UserService service = new UserServiceImpl();
        service.addUser(user);
        //5.跳转到/userListServlet
//        没有共享数据使用重定向    加上虚拟路径request.getContextPath()
        response.sendRedirect(request.getContextPath()+"/userListServlet");
UserDaoImpl中的addUser方法也优化了
 @Override
    public User addUser(User user) {
        try {
            //第一版
//String sql = "insert into user2 set name = ?, gender = ?, age = ?, address = ?, qq= ?, email = ?";
              //第二版
            String sql ="insert into user2 values(null, ?, ?, ?, ?, ?, ?,null, null )";
            template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail());
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
        return user;
    }

添加用户成功!

 删除功能

 在list.jsp删除按钮添加路径

 编辑DelUserService

原版本:

//1.设置request编码
        request.setCharacterEncoding("utf-8");
        int id = Integer.parseInt(request.getParameter("id"));
        //2.调用service
        UserService service = new UserServiceImpl();
        service.deleteUser(id);
        //3.调转到重新查询的servlet
        response.sendRedirect(request.getContextPath()+"/userListServlet");
        3.转发到
        //        request.getRequestDispatcher("/index.jsp").forward(request,response);

现版本:

//        因为是根据id删除,不涉及汉字,可以不用设置编码
    // 1.获取id对象
        String id = request.getParameter("id");
// 2.调用service删除
        UserService service = new UserServiceImpl();
        service.deleteUser(id);
//3.跳转查询所有servle
        response.sendRedirect(request.getContextPath()+"/userListServlet");

测试:

 轻易就删除了记录,但是不排除误删的可能性,想加入一个确认删除的提示框

在list.jsp删除按钮添加一个方法,点击会有确认框

放到上面去获取不到id,于是传参

 测试一下:

 修改功能

 

 修改update.jsp指向路径并在<input>标签添加value,编写对应service、dao层接口和实现类方法

 测试时出现404错误

 原因是重新建了一个findUserServlet,需要重新启动服务器,启动即可成功访问

之前的修改性别和地址不知道默认值,所以要判断选择框里的性别和籍贯,需要在update.jsp开头加上标签引入

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

加入判断:

 在<select>中selected是默认值

 有几个就做几次判断(默默删除几个选项减少工作量)

 用户修改都是基于id,但是id是数据库生成的,在表单中没有体现,所以建一个隐藏域,将id创建在里面获取

<%--隐藏域提交id--%>
   <input type="hidden" name="id" value="${user.id}">

代码编写好 测试一下

 报了一个500的错

 原来是没重启的锅,重启后恢复正常

但是新的问题出现了,无法修改内容,除去一部分原因是我在数据库写入数据,里面的地址不在<select>选框中无法显示

 于是试了其他的也没能成功修改,查找原因发现是sql语句缺了逗号,离谱! 

成了!

复杂功能

删除选中

获取选中条目id的方法:

在<table>外加一个<form>表单

 【更正】一下,连接的是/delSelectedServlet(删除选中)不是/delUserServlet(删除用户)

【更正】复选框的name和value也写错位置了

   写对应方法

 全选和全不选的实现

 选中后的提示(防止误删)

测试:

全选然后提示框弹出后取消删除会跳转404页面

 原因:在删除选中的超链接写了一个script方法,但是冒号是中文,识别不到方法

 改为英文就能识别了!

 分页查询

要实现的功能及数据

在三层架构的调用


 细节:

//4.调用dao查询List集合
//计算开始的记录索引  0-5  5-10  10-15 ... (含前不含后)
int start = (currentPage - 1) * rows;
List<User> list = dao.findByPage(start, rows);


//5.计算总页码
// 分情况,看能不能整除,例如一页5条记录,15条记录就是显示15/5=3页,17条记录就是显示17/5=3...2,所以是(17/5)+1=4页,
int totalPage = (totalCount % rows) == 0 ? (totalCount / rows) : (totalCount / rows) + 1;
pb.setTotalPage(totalPage);
 UserServiceImpl:
@Override  //分页查询
    public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
        //将String类型的参数封装成Integer
        int currentPage = Integer.parseInt(_currentPage);
        int rows = Integer.parseInt(_rows);
        //1.创建空的PageBean对象
        PageBean<User> pb = new PageBean<User>();
        //2.设置参数
        pb.setCurrentPage(currentPage);
        pb.setRows(rows);

        //3.调用dao查询总记录数
        int totalCount = dao.findTotalCount();
        pb.setTotalCount(totalCount);

        //4.调用dao查询List集合
        //计算开始的记录索引  0-5  5-10  10-15 ... (含前不含后)
        int start = (currentPage - 1) * rows;
        List<User> list = dao.findByPage(start, rows);
        pb.setList(list);

        //5.计算总页码
        // 分情况,看能不能整除,例如一页5条记录,15条记录就是显示15/5=3页,17条记录就是显示17/5=3...2,所以是(17/5)+1=4页,
        int totalPage = (totalCount % rows) == 0 ? (totalCount / rows) : (totalCount / rows) + 1;
        pb.setTotalPage(totalPage);

        return pb;
    }

测试异常

http://localhost/test02/findUserByPageServlet?currentPage=1&rows=5

 重启后正常了

继续编写前台代码

 替换成真正的数据

分页栏和实际数据保持一致

   <%--分页栏设计--%>

<c:forEach begin="1" end="${pb.totalPage}" var="i">

<li>

<a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5">${i}</a>

</li>

</c:forEach>

 分页栏的激活与禁用&添加判断,确保分页栏和当前界面地址栏页码一致

  <%--分页栏设计--%>
<c:forEach begin="1" end="${pb.totalPage}" var="i">
  <%--添加判断,确保分页栏和当前界面地址栏页码一致--%>
    <c:if test="${pb.currentPage == i}">
        <%--li标签里class="active"确保分页栏激活--%>
        <li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5"></a> </li>
    </c:if>

    <c:if test="${pb.currentPage != i}">  <%--分页栏和当前界面地址栏页码不匹配,不激活--%>
        <li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5">${i}</a></li>
    </c:if>
    
</c:forEach>

分页栏的激活与禁用

 确保分页栏和当前界面地址栏页码一致

优化上一页和下一页

在当前页码的基础上进行-1和+1操作

<li>                                            <%--当前页码-1--%>
    <a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage - 1}&rows=5" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
    </a>
</li>

 为了逻辑更严谨,当页码为第一页时无法返回上一页,为最后一页时无法进入下一页

 如此就是样式设置成功啦!

  虽然样式设置不让点,但是实际上还是可以点,这需要到后台编写代码解决

 在后台UserServiceImpl 做判断,分页查询方法findUserByPage

//判断页码是否小于等于0,如果是,设为1

 这样就能确保第一页的上一页无法点击,诸如此类方法还有很多,css样式里也能设置无法选择。。。

最后一页也是类似

list.jsp部分改动后代码:

<c:if test="${pb.currentPage == pb.totalPage}">
    <%--为了逻辑更严谨,当页码为最后一页时无法进入下一页--%>
<li class="disabled">
    </c:if>

    <c:if test="${pb.currentPage != pb.totalPage}">
        <%--当页码不为为最后一页时可以进入下一页--%>
<li>
    </c:if>                                                                                <%--当前页码+1--%>
<a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage + 1}&rows=5"
   aria-label="Next">
    <span aria-hidden="true">&raquo;</span>
</a>
UserServiceImpl部分改动代码:

 测试出错

 出错原因及解决方法:

设置参数存入应该在计算之后而不是之前,将存入部分代码移到方法最后即可解决

  @Override  //分页查询
    public PageBean<User> findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
        //将String类型的参数封装成Integer
        int currentPage = Integer.parseInt(_currentPage);
        int rows = Integer.parseInt(_rows);

//判断页码是否小于等于0,如果是,设为1
        if (currentPage <= 0) {
            currentPage = 1;
        }

        //1.创建空的PageBean对象
        PageBean<User> pb = new PageBean<User>();


        //3.调用dao查询总记录数
        int totalCount = dao.findTotalCount();
        pb.setTotalCount(totalCount);

        //4.调用dao查询List集合
        //计算开始的记录索引  0-5  5-10  10-15 ... (含前不含后)
        int start = (currentPage - 1) * rows;
        List<User> list = dao.findByPage(start, rows);
        pb.setList(list);

        //5.计算总页码
        // 分情况,看能不能整除,例如一页5条记录,15条记录就是显示15/5=3页,17条记录就是显示17/5=3...2,所以是(17/5)+1=4页,
        int totalPage = (totalCount % rows) == 0 ? (totalCount / rows) : (totalCount / rows) + 1;
        pb.setTotalPage(totalPage);

        //判断页码是否大于等于最后一页,如果是,设为最后一页
        if (currentPage >= pb.getTotalPage()) {
            currentPage = pb.getTotalPage();
        }

        //2.设置参数
        pb.setCurrentPage(currentPage);
        pb.setRows(rows);

        return pb;
    }

复杂功能

复杂条件查询功能

  动态查询小技巧:

在原本查询语句

"select count(*) from user2"改为

"select count(*) from user2 where 1 = 1"

这样代码结果不变且可以在后面添加查询条件

sb.append("and key like ?")

 

在form表单添加路径和读取方法,跳转到分页查询servlet

FindUserByPageServlet添加条件查询参数

 

UserServiceImpl中findUserByPage分页查询方法添加条件查询参数

 

 在数据库上查询到的:

 控制台上查询到的

 一条记录,对上了!

接下来完善UserDaoImpl分页查询每页记录方法findByPage()

 改写sql语句复制之前我们写的findTotalCount()方法语句过去

 一些注意的点:

  @Override    //分页查询每页记录
    public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
        String sql = "select * from user2 where 1 = 1 ";  //留空格拼接字符串
        StringBuilder sb = new StringBuilder(sql);   //字符串拼接
        //2.遍历map
        Set<String> keySet = condition.keySet();
        //定义参数的集合
        List<Object> params = new ArrayList<Object>();
        for (String key : keySet) {
            //排除分页条件参数  只要name、address...参数查询
            if("currentPage".equals(key) || "rows".equals(key)){
                continue;//结束当前循环进入下一循环
            }
            //获取value   如果最后不加[0]限定,出来的结果是一个values,所以要加上限定
            String value = condition.get(key)[0];  //只获取一个值
            System.out.println(value);
            //判断value是否有值
            if(value != null && !"".equals(value)){
                //有值
                sb.append(" and "+key+" like ? ");//注意加空格(与前面查询语句拼接) 一个问号对应一个值
                params.add("%"+value+"%");//?条件的值   加% %类似 like "%李%" 模糊查询
            }
        }

        //添加分页查询   记得空格
        sb.append(" limit ? , ? ");
        //添加分页查询参数值
        params.add(start);
        params.add(rows);
        sql = sb.toString();
//不能在调用直接写template.query(sql,... ,start,rows) sql此时变成了sb.toString(),  start,rows变成了params.toArray()
 //但是很多时候会忘记template.query(),干脆将sql = sb.toString();

        //测试
        System.out.println(sql);
        System.out.println(params);

//        return template.query(sql,new BeanPropertyRowMapper<User>(User.class),start,rows);
        return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
    }

打印测试:

 打印后查询记录不见了,只要在map里存入即可

 结果:

 新的问题:跳转页码后查询条件消失

解决方法:

在每个分页地址后面拼接查询条件字符串

&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}

 这样即便跨页也能保存查询条件

 

以上就是全部的流程,有很多细节和操作值得注意!

 累了,喝茶~

 

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

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

相关文章

【云原生 | Kubernetes 实战】06、Pod高级实战:基于污点、容忍度、亲和性的多种调度策略(下)

目录 一、Pod节点亲和性 1.1 案例演示&#xff1a;pod 节点亲和性——podAffinity 1.2 案例演示&#xff1a;pod 节点反亲和性——podAntiAffinity 1.3 案例演示&#xff1a; 换一个 topologykey 值 二、污点和容忍度 2.1 案例演示&#xff1a; 把 node2 当成是生产环境专…

Python中常见的调色板: 颜色 color

Python中常见的调色板&#xff1a; 颜色 color 这个人对颜色的总结&#xff0c;非常到位哈&#xff01; https://blog.csdn.net/weixin_42943114/article/details/81811556

SPI 机制详解

SPI 全称为 Service Provider Interface &#xff0c;它是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件&#xff0c;自动加载文件里所定义的类。这一机制为很多框架拓展提供了可能&#xff0c;比如在Dubbo&#xff0c;JDBC中都使用到了SPI…

go return返回值屏蔽

前言 最近需要写一个云环境的可执行程序&#xff0c;一般使用go语言&#xff0c;毕竟GC原生运行&#xff0c;结合了不需要回收指针的能力和原生运行&#xff0c;但是在程序返回时&#xff0c;笔者看到一个sdk的源码懵了&#xff0c;返回的数据居然可以隐式返回。 准备 go 版本…

机器学习8线性回归法Linear Regression

文章目录一、线性回归算法简介典型的最小二乘法的问题目标&#xff1a;具体怎么推此处省略二、简单线性回归的实现三、向量化运算一、线性回归算法简介 1.解决回归问题&#xff1b; 2.思想简单&#xff0c;实现容易&#xff1b; 3.是许多强大的非线性模型的基础&#xff1b; 4…

ESP32——WEB服务程序测试(基于官方示例restful_server)

一、简介 基于官方示例restful_server创建一个新工程。 参考1&#xff1a; 官方说明 参考2&#xff1a; ES32 RESTful_server实验_NULL_1969的博客-CSDN博客 二、编译下载运行工程 直接编译运行&#xff0c;出现下面两个错误。 2.1 OCD调试错误 esp_semihost: OpenOCD i…

文本生成客观评价指标总结(附Pytorch代码实现)

前言&#xff1a;最近在做文本生成的工作&#xff0c;调研发现针对不同的文本生成场景&#xff08;机器翻译、对话生成、图像描述、data-to-text 等&#xff09;&#xff0c;客观评价指标也不尽相同。虽然网络上已经有很多关于文本生成评价指标的文章&#xff0c;本博客也是基于…

[附源码]JAVA毕业设计计算机组成原理教学演示软件(系统+LW)

[附源码]JAVA毕业设计计算机组成原理教学演示软件&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

PCB元件创建

目录 一&#xff1a;创建元件基本流程 1.1.创建一个原理图库 1. 2.创建元件 1.3绘制 1.4放置管脚 二&#xff1a; 元件创建 2.1电容类元件创建 2.2.电感类元件 2.3.电阻类元件 2.4LED元件 2.5按键元件 2.6芯片类元件创建 2.6.1修改栅格颜色 2.6.2阵列粘贴 2.7接插…

kubernetes Service详解

文章目录Service介绍Service类型Endpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的ServiceExternalName类型的Servicengress介绍Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序…

python Threads and ThreadPools

在之前的文章解释了线程和锁的相关事项&#xff0c;这里准备三篇文章分别介绍下线程和线程池&#xff0c;进程和进程池&#xff0c;已经携程的概念 python Threads and ThreadPoolspython Process and ProcessPolls 本文中重点介绍下线程和线程池的概念。每个python程序都是一…

毕业设计-基于机器视觉的安全帽佩戴识别-yolo-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

mysql监控sql执行情况

要想进阶针对mysql学习乃至掌握mysql调优的基本技能&#xff0c;监控mysql的执行情况必不可少。就像我们的代码&#xff0c;如果不能debug&#xff0c;想要进行调优排错&#xff0c;难度将会大大增加。 所以今天我们就来讲解如何监控mysql的sql执行情况 show profile指令什么是…

Pinely Round 1 (Div. 1 + Div. 2)

比赛链接&#xff1a;Dashboard - Pinely Round 1 (Div. 1 Div. 2) - Codeforces A&#xff1a;思维 题意&#xff1a;定义了一个序列&#xff0c;给定了三个整数n&#xff0c;a&#xff0c;b。问能否构造两个长度为n的序列&#xff0c;使得它们的最长前缀的长度为a&#xf…

Mongo非关系型数据库

mongo三个概念 如何下载MongoDB 参考(5条消息) mongodb免安装配置_剑客916的博客-CSDN博客 (5条消息) MongoDB的安装配置教程&#xff08;很详细&#xff0c;你想要的都在这里&#xff09;_狮子座的男孩的博客-CSDN博客_mongodb配置 下载地址 Download MongoDB Community Se…

PDF Shaper Pro v12.8 全能PDF工具箱中文版

PDF Shaper 是一款实用的全能PDF工具箱&#xff01;这款PDF转换器包含了很多非常实用的PDF工具&#xff0c;可以轻松的把 PDF 转成 Word&#xff0c;PDF 转图像&#xff0c;PDF 加密等等。它还可以合并&#xff0c;分割&#xff0c;加密和解密 PDF&#xff0c;图像转换为 PDF&a…

Python学习笔记-序列

用于记述python中对于序列的应用&#xff0c;包括列表、元组、字典、集合、字符串等。 1.序列

我看世界杯

目录 写在前面 正文 第一次看世界杯 我看重的球队 写在最后 写在前面 说实话&#xff0c;第一次接触足球还是在小学阶段&#xff0c;现在已经记不清那是在哪里搞来的&#xff0c;反正是挺破烂的&#xff0c;外面的五边形布料都已经脱落&#xff0c;都能露出里面的布料&…

java EE初阶 — volatile关键字保证内存可见性

文章目录1.volatile保证内存可见性1.1 如何保证内存可见性1.2 java 内存模型&#xff08;JMM&#xff09;2.volatile 不保证原子性1.volatile保证内存可见性 先来看一段代码 package thread;import java.util.Scanner;class MyCounter {public int flag 0; }public class Th…

Qt实现编辑框失去焦点隐藏功能

今天来为大家分享一个小功能&#xff0c;首先看实现的效果吧~ 功能讲解&#xff1a; QLineEdit控件进行文本编辑&#xff0c;点击保存按钮后&#xff0c;隐藏编辑框和保存按钮&#xff0c;仅展示编辑内容&#xff0c;当鼠标点击空白处时&#xff0c;同样隐藏编辑框、隐藏保存按…