MyBatis操作数据库(一)

什么是MyBatis?
MyBatis是一个优秀的持久层框架,⽤于简化JDBC的开发。
MyBatis本是Apache的⼀个开源项⽬iBatis,2010年这个项目由apache迁移到了googlecode,并且改名为MyBatis。
简单来说MyBatis是更加简单完成数据和数据库交互的框架

什么是持久层呢?
web应⽤程序⼀般分为三层,有Controller、Service、
Dao流程如下浏览器发起请求,先请求Controller,Controller接收到请求之后Service进⾏业务逻辑处理Service再调⽤Dao。而持久层就是持久操作的层,就是数据访问层dao,是用来操作数据库

MyBatis入门
(1)创建spingboot工程、并导入mybatis起步依赖、mysql的驱动包
在这里插入图片描述
Mybatis 是⼀个持久层框架,具体的数据存储和数据操作还是在MySQL中操作的,所以需要添加MySQL驱动
我们可以看到创建完成之后pom.xml文件中导入的依赖
在这里插入图片描述
(2)
创建对应的UserInfo

package com.example.mybatisdemo.demos.web;

import javax.xml.crypto.Data;

public class UserInfo {
    private Integer id;
    private String usernane;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Data createTime;
    private Data updateTime;
}

数据准备创建用户表 并创建对应的实体类User

DROP DATABASE IF EXISTS mybatis_test;
create database mybatis_test default character set utf8mb4;
use mybatis_test;
DROP TABLE IF EXISTS userinfo;
        CREATE TABLE `userinfo` (
        `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
        `username` VARCHAR ( 127 ) NOT NULL,
        `password` VARCHAR ( 127 ) NOT NULL,
        `age` TINYINT ( 4 ) NOT NULL,
        `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '120默认 ',
        `phone` VARCHAR ( 15 ) DEFAULT NULL,
        `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0正常, 1删除 ',
        `create_time` DATETIME DEFAULT now(),
        `update_time` DATETIME DEFAULT now(),
        PRIMARY KEY ( `id` )
        ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
 INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
 VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
 INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
 VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
 INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
 VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
 INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
 VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

配置数据库连接字符串
配置application.yml文件

#数据库连接配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    #
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

如果使⽤MySQL是5.x之前的使用的 是"com.mysql.jdbc.Driver",如果是⼤于5.x使用的
是“com.mysql.cj.jdbc.Driver”

写入持久层代码
在项目中建立持久层接口UserIonfoMapper

package com.example.mybatisdemo.demos.web.mapper;

import com.example.mybatisdemo.demos.web.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserInfoMapper {
    //查询所有用户
    @Select("select username, 'password',age, gender, phone from userinfo")
    public List<UserInfo> queryAllUser();
}

@Mapper注解:表示是MyBatis中的接口

程序运⾏时,框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理

@Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容

单元测试
创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类,我们可以直接使⽤这个测试类来进⾏测试

package com.example.mybatisdemo;

import com.example.mybatisdemo.demos.web.UserInfo;
import com.example.mybatisdemo.demos.web.mapper.UserInfoMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class MyBatisdemoApplicationTests {
    @Autowired
    private UserInfoMapper userInfoMapper;
    

    @Test
    void contextLoads() {
        List<UserInfo> userInfoList = userInfoMapper.queryAllUser();
        System.out.println(userInfoList);

    }

}

测试类有注解@SpringBootTest在运⾏时⾃动加载Spring的运⾏环境通过@Autowired这个注解,注⼊我们要测试的类,就可以开始进⾏测试了

然后结果中只有SQL语句中查询的列对应的属性才有赋值
在这里插入图片描述

使用idea自动生成测试类
除此之外,也可以使⽤Idea⾃动⽣成测试类
在使用Mapper接口时
右键->Generate->Test
在这里插入图片描述

在这里插入图片描述
编写代码

package com.example.mybatisdemo.demos.web.mapper;

import com.example.mybatisdemo.demos.web.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest

class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void queryAllUser() {
        List<UserInfo> userInfoList = userInfoMapper.queryAllUser();
        System.out.println(userInfoList);
    }
}

在这里插入图片描述

MyBatis的基础操作

打印MyBatis日志我们借助日志查看sql语句执行 执行传递的参数和执行结果
配置文件

#数据库连接配置
mybatis:
  configuration: #配置打印MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

重新运行查看结果
在这里插入图片描述

其中
表示:查询语句

Preparing: select username, 'password',age, gender, phone from userinfo

表示:查询类型

Parameters:

表示: 查询SQL语句结果

<==    Columns: username, password, age, gender, phone
<==        Row: admin, password, 18, 1, 18612340001
<==        Row: zhangsan, password, 18, 1, 18612340002
<==        Row: lisi, password, 18, 1, 18612340003
<==        Row: wangwu, password, 18, 1, 18612340004
<==      Total: 4

参数传递
需求:查找id为4的用户

@Mapper
public interface UserInfoMapper {
    //查询所有用户
    @Select("select username, 'password',age, gender, phone from userinfo")
    List<UserInfo> queryAllUser();
    @Select("select username, 'password', age, gender, phone from userinfo where id = 4")
    UserInfo queryById();
}

生成测试用例

在这里插入图片描述

package com.example.mybatisdemo.demos.web.mapper;

import com.example.mybatisdemo.demos.web.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest

class UserInfoMapperTestquerById {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void queryById() {
        UserInfo userInfo = userInfoMapper.queryById();
        System.out.println(userInfo);
    }
}

结果
@Select(“select username, ‘password’, age, gender, phone from userinfo where id = #{id}”)
UserInfo queryById(Integer id);在这里插入图片描述
但是这样的话, 只能查找id=4的数据,所以SQL语句中的id值不能写成固定数值,需要变为动态的数值解决⽅案:在queryById⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句
例如:

   @Select("select username, 'password', age, gender, phone from userinfo where id = #{id}")
    UserInfo queryById(Integer id);
    @Test
    void queryById() {
        UserInfo userInfo = userInfoMapper.queryById(4);
        System.out.println(userInfo);
    }

结果
在这里插入图片描述
也可以通过注解@Param设置参数别名#{…}里面的属性名要和@Param里面的一样

@Select("select username, `password`, age, gender, phone from userinfo where 
id= #{userid} ")
 UserInfo queryById(@Param("userid") Integer id);

MyBatis的增删查改

SQL语句

insert into userinfo (username, `password`, age, gender, phone) values 
("zhaoliu","zhaoliu",19,1,"18700001234")

我们把sql中的常量换成动态的参数
例如:

@Insert("insert into userinfo(username,'password',age,gender,phone) values (#{username},#{password},#{age},#{gender},#{phone})")
    Integer insert(UserInfo userInfo);

生成测试案例

在这里插入图片描述

package com.example.mybatisdemo.demos.web.mapper;

import com.example.mybatisdemo.demos.web.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
class UserInfoMapperTestInsert {
    @Autowired
    private  UserInfoMapper userInfoMapper;

    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setGender(2);
        userInfo.setAge(21);
        userInfo.setPhone("18612340005");
        userInfoMapper.insert(userInfo);
    }
}

在这里插入图片描述
也可以设置使用@Param属性 使用#{…} 需要参数.属性获取

 @Insert("insert into userinfo (username, password, age, gender, phone) values (#{userinfo.username},#{userinfo.password},#{userinfo.age},#{userinfo.gender},#{userinfo.phone})")
    Integer insert(@Param("userinfo")UserInfo userinfo);

返回主键
Insert语句默认返回的是受影响行数
有些情况数据插入之后还需要用于后续的关联操作需要新插入数据的id
如果我们想拿到自增id就要在mapper接口上添加一个
@Options注解
例如:

 @Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo (username, password, age, gender, phone) values (#{userinfo.username},#{userinfo.password},#{userinfo.age},#{userinfo.gender},#{userinfo.phone})")
    Integer insert(@Param("userinfo")UserInfo userinfo);

useGeneratedKeys:
这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内的部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字
段),默认值:false.
keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)

测试:

 @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhaoliu");
        userInfo.setPassword("zhaoliu");
        userInfo.setGender(2);
        userInfo.setAge(21);
        userInfo.setPhone("18612340005");
        Integer count =userInfoMapper.insert(userInfo);
        System.out.println(userInfo);
        System.out.println("添加数据条数" + count +",数据ID:" + userInfo.getId());


    }

结果:
在这里插入图片描述
在这里插入图片描述

删除:
对应sql语句

delete from userinfo where id=6
  @Delete("delete from userinfo where id = #{id}")
    void delete(Integer id);

生成测试案例

 @Test
    void delete() {
        userInfoMapper.delete(9);
    }

运行结果
在这里插入图片描述
在这里插入图片描述
改:
对应sql语句

update userinfo set username="xiaozhao" where id=8

接口

@Update("update userinfo set username=#{username} where id=#{id}")
    void update(UserInfo userInfo);

测试代码

  @Test
    void update() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("lisi");
        userInfo.setId(8);
        Integer result = userInfoMapper.update(userInfo);
        if (result>0){
            System.out.println("修改成功");
        }
    }

结果:
在这里插入图片描述
在这里插入图片描述
查:
我们对表上的数据进行查询

 @Select("select id, username,password,age,gender,phone,delete_flag,create_time,update_time from userinfo")
    List<UserInfo> queryALLUser2();

生成的测试类:

@Test
    void queryALLUser2() {
        List<UserInfo> userInfoList = userInfoMapper.queryALLUser2();
        System.out.println(userInfoList);

结果:
我们可以看到表中的delete_flag,create_time,update_time查询到了却没有附上属性的值
在这里插入图片描述

MyBatis 会根据⽅法的返回结果进⾏赋值 ⽅法⽤对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条,
就会⾃动赋值给对象 ⽅法⽤List接收返回结果, MySQL 查询出来数据为⼀条或多条时, 也会⾃动赋值给List
但如果MySQL 查询返回多条, 但是⽅法使⽤UserInfo接收, MyBatis执⾏就会报错.

这是因为当自动映射查询结果时,MyBatis会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略
⼤⼩写)这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性 如果不一致就不会赋值

在这里插入图片描述
在这里插入图片描述
可以看到后面三个的名字不一致
这时我们怎么解决呢?

  1. 起别名
    在SQL语句给列名起别名保持别名和实体类属性名一样
    例如:
    @Select("select id, username, password,age, gender, phone,delete_flag as deleteFlag, " +
            "create_time as createTime, update_time as updateTime" +
            " from userinfo")
    List<UserInfo> queryAllUser();

测试案例:

   @Test
    void queryAllUser() {
        List<UserInfo> userInfoList = userInfoMapper.queryAllUser();
        log.info(userInfoList.toString());
    }

运行结果:
在这里插入图片描述
这里就可以看到之前本为空的
delete_flag 和 create_time 被起别名成createTime
updateTime(和userInfo的属性名对上)之后就能赋值上了

错误笔记:
之前这里的的updateTime和createTime就算改了别名之后赋值还是null找了很久都没有发现错误,最后发现是属性的类型对不上
在这里插入图片描述
这里的类型的包应该是这个包的
在这里插入图片描述
但是我没注意用了这个包的Date从而导致代码看起来是对的但是结果不对
在这里插入图片描述
所以当我们发现mybatis查询值为null时可以从以下几个方面排除

  1. 数据库对应的纪录的字段确实为空;
  2. 映射配置问题:确保在数据库映射配置(比如 MyBatis 的配置)中,对于这两个时间字段的映射处理是正确的。
  3. 查询语句问题: 检查查询语句中对于这两个字段的获取和别名设置是否准确无误
  4. 数据类型不匹配 例如: 代码中定义的 Data 类型与数据库中实际的时间字段类型不匹配,导致无法正确映射。

(2) 结果映射

@Results(id = "BaseMap",value = {
            @Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    @Select("select * from userinfo")

测试类

@Test
    void testQueryALLUser2() {
        List<UserInfo> userInfoList = userInfoMapper.queryAllUser2();
        log.info(userInfoList.toString());
    }
    

结果:
在这里插入图片描述
如果我们也希望其他的SQL语句使用这个映射关系
可以使用注解@ResultMap注解来复用其他定义的ResultMap
例如:

运行结果:

    @Select("select id, username, password,age,gender,phone,delete_flag,create_time,update_time " +
            "from userinfo where id = #{userid}")
    @ResultMap(value = "BaseMap")
    UserInfo queryByid(@Param("userid") Integer id);

测试类

@Test
    void queryByid() {
       UserInfo userInfo =  userInfoMapper.queryByid(3);
       log.info(userInfo.toString());
    }

在这里插入图片描述

开启驼峰命名
通常数据库列使⽤蛇形命名法(下划线分割各个单词)
Java 属性⼀般遵循驼峰命名法约定为了在这两种命名⽅式之间启⽤⾃动映射
需要将 mapUnderscoreToCamelCase 设置为 true
例如:

mybatis:
  configuration: #配置打印MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

驼峰命名规则: abc_xyz => abcXyz
表中字段名:abc_xyz
类中属性名:abcXyz
这时我们java代码不做任何处理就可以通过驼峰命名自动转换
例如:

   @Select("select id, username, password,age,gender,phone,delete_flag,create_time,update_time " +
            "from userinfo")
    List<UserInfo> selectAllUser();
@Test
    void selectAllUser() {
        List<UserInfo> userInfoList = userInfoMapper.selectAllUser();
        log.info(userInfoList.toString());
    }

结果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内存泄漏 内存溢出

概念 内存泄漏&#xff1a;是程序没有正确的释放已分配的内存&#xff0c;造成系统内存的浪费。内存泄漏很难发现&#xff0c;因为他不会直接导致程序崩溃&#xff0c;而是会慢慢降低程序的性能。 内存溢出&#xff1a;系统中存在无法回收的内存或使用的内存过多&#xff0c;…

【C#】使用JavaScriptSerializer序列化对象

在C#开发语言编程中&#xff0c;通常使用系统内置的JavaScriptSerializer类来序列化对象&#xff0c;以便将其转换为JSON格式的文本存储与后台服务通信, 在这里将为大家详细介绍一下这个过程。 文章目录 反序列化序列化忽略属性 假设处理的数据中有一个对象类, 如下 public cl…

逆天改命 17岁中专女生横扫全球数学竞赛

“逆天改命!17岁中专女生横扫全球数学竞赛,清华北大高手纷纷落马!” 最近全网被这则消息震惊了。 来!随便挑几个题目,让大家体验一下阿里巴巴全球数学竞赛的难度? 数学是人工智能算法的基石。它为算法提供了逻辑框架和分析工具,使得人工智能能够处理复杂的数据和问…

电商秒杀系统

一&#xff0c;细节 二&#xff0c;需要注意的细节 1.库存超卖问题 使用mysql数据库的 悲观锁 机制。在事务中使用 for update 语句&#xff0c;此时数据库会加锁&#xff0c;其他想要当前读的线程都会被阻塞&#xff0c;在事务处理完成之后释放这一条数据。该方法的缺点在于…

基于springboot实现入校申报审批系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现入校申报审批系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装入校申报审批系统软…

英伟达开源最强通用模型Nemotron-4 340B

英伟达的通用大模型 Nemotron&#xff0c;开源了最新的 3400 亿参数版本。 本周五&#xff0c;英伟达宣布推出 Nemotron-4 340B。它包含一系列开放模型&#xff0c;开发人员可以使用这些模型生成合成数据&#xff0c;用于训练大语言模型&#xff08;LLM&#xff09;&#xff0…

排序——希尔排序

希尔排序实际上是插入排序的优化&#xff0c;所以要先介绍插入排序。 目录 插入排序 思想 演示 代码实现 总结 希尔排序 思想 演示 代码 总结 插入排序 思想 又称直接插入排序。它的基本思想是将一个值插入到一个有序序列中。直至将所有的值都插入完。 演示 假设数…

Web爬虫--fofa-资产信息搜集

免责声明:本文仅做技术交流与学习... 目录 fofa.py fofa搜索参数分析 fofa_api.py fofa.py import requests from bs4 import BeautifulSoup# 登录fofa之后,把自己的cookie弄过来. header{cookie: } # 参数为搜索的语法. urlhttps://fofa.info/result?qbase64dGl0bGU9IuS4…

云计算【第一阶段(14)】Linux的目录和结构

一、Liunx目录结构 1.1、linux目录结构 linux目录结构是树形目录结构 根目录&#xff08;树根&#xff09; 所有分区&#xff0c;目录&#xff0c;文件等的位置起点整个树形目录结构中&#xff0c;使用独立的一个"/",表示 1.2、常见的子目录 必须知道 目录路径目…

xinput1_3.dll怎么安装,关于xinput1_3.dll的多种修复方法分享

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“找不到xinput1_3.dll”。那么&#xff0c;xinput13.dll到底是什么&#xff1f;为什么会出现找不到的情况&#xff1f;它对电脑有什么影响&#xff1f;本文将为您详细解析xinput1_3.dll的含义…

CPN Tools学习——从平面网构建分层 PN

1.先创建平面petri网 创建如下petri网&#xff1a; CPN ide创建petri网真的舒服很多&#xff0c;但是教程又是CPN Tools的&#xff0c;我的想法是看两个版本能不能互通&#xff0c;在前者创建&#xff0c;在后者运行学习。 新增定义&#xff1a; colset E unit with e; 但…

嘻嘻我是图床倒霉蛋

嘻嘻花了将近两个小时的时间配了一个小小的图床 手把手教你搭建阿里云图床(PicGoTypora阿里云OSS)&#xff0c;新手小白一看就会-阿里云开发者社区 (aliyun.com) 大体上按照这篇配置就好 七牛云因为测试域名30天到期,用自己的得备案,所以比较麻烦,建议直接上阿里云 我买了一…

JDBC常见的几种连接池使用(C3P0、Druid、HikariCP 、DBCP)

前言 数据库连接池负责分配、管理和释放数据库连接&#xff0c;它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是重新建立一个。连接池技术尽可能多地重用了消耗内存的资源&#xff0c;大大节省了内存。通过使用连接池&#xff0c;将大大提高程序运行效率。常用的…

数字孪生技术如何赋能智慧工厂

数字孪生技术为什么能在智慧工厂中发挥作用&#xff1f;随着工业4.0的推进和智能制造的普及&#xff0c;数字孪生技术成为智慧工厂的重要推动力。数字孪生是指在虚拟空间中创建一个与现实物理实体相对应的数字模型&#xff0c;通过实时数据交互和分析&#xff0c;实现对物理实体…

DAY24 回溯算法part01 77. 组合 216.组合总和III 17.电话号码的字母组合

理论基础 #什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 在二叉树系列中&#xff0c;我们已经不止一次&#xff0c;提到了回溯&#xff0c;例如二叉树&#xff1a;以为使用了递归&#xff0c;其实还隐藏着回溯 (opens new window)。 回溯是递…

Excel自定义排序和求和

概览 excel作为办公的常备工具&#xff0c;好记性不如烂笔头&#xff0c;在此梳理记录下&#xff0c;此篇文章主要是记录excel的自定义排序和求和 一. 自定义排序 举个例子 1. 填充自定义排序选项 实现步骤&#xff1a; 选定目标排序值&#xff1b;文件->选项->自定…

从0开始理解DevOps

目录 一、DevOps背景 二、DevOps介绍 DevOps 组成 三、Jenkins Jenkins 工作流程 四、云原生与DevOps 相信你一定听过 DevOps 这个词&#xff0c;那它到底是什么呢&#xff1f;为什么越来越多的互联网企业都在追随使用它&#xff1f;它与云原生有什么关系&#xff1f;本文将…

checkbox表单校验 至少选中一个Checkbox , 否则会报错

项目背景 : react ant 需求 : 需实现至少选中一个Checkbox , 否则会报错 需求如下 : 注意 : Input, Select, DatePicker可以直接处理Form.Item的验证规则 , 但Checkbox不行 , 需自定义验证规则 实现 : // 自定义的checkbox校验规则--星期const validateAtLeastOneCheckbo…

面试题 17.07. 婴儿名字

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { public:vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms) {UnionFind uf;for (auto& syn : synonyms) {//c…

【计算机毕业设计】241外卖微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…