数据库-MySQL-MybatisPlus实战
文章目录
- 前言
- 一、整合mybatis-plus
- 二、CRUD操作
- 1、insert操作
- 2、update操作
- 3、delete操作
- 三、条件构造器(Wrapper)
- QueryWrapper
- UpdateWrapper
- LambdaQueryWrapper
- LambdaUpdateWrapper
- 四、分页查询
- 五、自定义主键生成器
- 六、总结
前言
mybatis相信都不陌生,目前互联网公司大部分都使用mybatis作为持久层框架,无他,因为可以直接在xml文件中编写SQL语句操作数据库,灵活。但是我们在使用的时候,也会发现有很多增删改查的SQL是每个表都会有的基本操作,如果每个表都写一套增删改查的SQL显然是非常耗时耗力的。
于是,就有了mybatis-plus这个框架。正如官网所说,mybatis-plus是为简化开发而生
。
mybatis-plus,简称mbp,有以下特点:
- 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
- 只需简单配置,即可快速进行单表CRUD操作,节省大量时间。
- 代码生成,物理分页,性能分析等功能一应俱全。
一、整合mybatis-plus
这里用的是SpringBoot2.5.2做演示。首先导入依赖:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
<!-- 引入 mybatis-plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.0</version>
</dependency>
然后在application.properties文件配置数据库信息:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/user?createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=root123456
#mapper.xml文件路径地址
mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml
在启动类加上扫描注解:
@SpringBootApplication
@MapperScan(basePackages = "com.yehongzhi.mydemo.mapper")
public class MydemoApplication {public static void main(String[] args) {SpringApplication.run(MydemoApplication.class, args);}
}
其实这样就完成了,可以建个表进行测试。
CREATE TABLE `user` (`id` char(36) NOT NULL DEFAULT '' COMMENT 'ID',`name` varchar(255) DEFAULT '' COMMENT '姓名',`age` int(3) DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 初始化4条数据
INSERT INTO `user`.`user` (`id`, `name`, `age`) VALUES ('1345fc0985b111eba0e488d7f66fdab8', '观辰', '20');
INSERT INTO `user`.`user` (`id`, `name`, `age`) VALUES ('d47561e885b011eba0e488d7f66fdab8', '姚大秋', '30');
INSERT INTO `user`.`user` (`id`, `name`, `age`) VALUES ('ef2741fe87f011eba0e488d7f66fdab8', '周星驰', '60');
INSERT INTO `user`.`user` (`id`, `name`, `age`) VALUES ('ff784f6b85b011eba0e488d7f66fdab8', '李嘉晟', '33');
建了表之后,再创建一个User实体类对应:
//表名
@TableName("user")
public class User {//主键@TableId(type = IdType.UUID)private String id;//姓名private String name;//年龄private Integer age;//getter、setter方法
}
接着创建UserMapper接口类,,然后继承BaseMapper:
@Repository
public interface UserMapper extends BaseMapper<User> {}
创建一个UserMapper.xml与UserMapper对应:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yehongzhi.mydemo.mapper.UserMapper"></mapper>
最后我们写一个UserService接口,查询user表:
@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic List<User> getList() {return userMapper.selectList(null);}
}
启动项目,测试是没问题的:
二、CRUD操作
整合完了之后,按照mybatis-plus的官方说明,是有简单的单表CRUD操作功能。
这些单表的CRUD操作其实都放在BaseMapper里面了,所以当我们继承了BaseMapper类之后,就会获得mybatis-plus的增强特性,其中就包括单表的CRUD操作。
1、insert操作
BaseMapper直接提供一个insert()方法,传一个实体类。
@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic int insertOne(User user) {return userMapper.insert(user);}
}
接着在Controller调用,因为在User类上面贴了注解@TableId
,所以会自动生成ID。
@TableName("user")
public class User {@TableId(type = IdType.UUID)private String id;//省略...
}
Controller层代码:
@RequestMapping("/insert")
public String insertUser(@RequestParam(name = "name") String name,@RequestParam(name = "age") Integer age) {User user = new User();user.setName(name);user.setAge(age);//在实体类使用了@TableId注解,ID会自动生成int i = userService.insertOne(user);return i == 1 ? "success" : "fail";
}
2、update操作
BaseMapper直接提供一个updateById()方法,传一个实体类。
@Override
public int updateOne(User user) {return userMapper.updateById(user);
}
Controller层代码:
@RequestMapping("/update")
public String updateUser(@RequestParam(name = "id") String id,@RequestParam(name = "name",required = false) String name,@RequestParam(name = "age",required = false) Integer age) {User user = new User();user.setId(id);user.setName(name);user.setAge(age);int i = userService.updateOne(user);return i == 1 ? "success" : "fail";
}
3、delete操作
BaseMapper直接提供一个deleteById()方法,传主键值。
@Override
public int deleteOne(String id) {return userMapper.deleteById(id);
}
Controller层代码:
@RequestMapping("/delete")
public String deleteUser(@RequestParam(name = "id") String id) {int i = userService.deleteOne(id);return i == 1 ? "success" : "fail";
}
除此之外,还有批量删除deleteBatchIds方法,传主键值的集合:
@Override
public int deleteBatch(List<String> ids){return userMapper.deleteBatchIds(ids);
}
Controller层代码:
@RequestMapping("/deleteBatch")
public String deleteBatchUser(@RequestParam(name = "ids") String ids) {List<String> list = Arrays.asList(ids.split(","));int i = userService.deleteBatch(list);return i == list.size() ? "success" : "fail";
}
三、条件构造器(Wrapper)
条件构造器在Mybatis-plus各种方法中都有出现,比如:
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
Wrapper通俗点理解就是定义where语句后面的查询条件,是Mybatis-Plus里功能比较强大的工具。Wrapper是一个抽象类,下面有很多子类。
常用的子类实现有四个,分别是:
- QueryWrapper
- UpdateWrapper
- LambdaQueryWrapper
- LambdaUpdateWrapper
QueryWrapper
主要用于生成where条件,举个例子,我们用name查询user表:
public List<User> queryUserByName(String name) {//相当于:SELECT * FROM user WHERE name = ?QueryWrapper<User> queryWrapper = new QueryWrapper<>();//eq()表示相等queryWrapper.eq("name", name);return userMapper.selectList(queryWrapper);
}
我们看日志打印:
==> Preparing: SELECT id,name,age FROM user WHERE name = ?
==> Parameters: 姚大秋(String)
<== Columns: id, name, age
<== Row: d47561e885b011eba0e488d7f66fdab8, 姚大秋, 30
<== Total: 1
假如我们要like查询,可以这样写:
public List<User> queryUserLikeName(String name) {//相当于:SELECT * FROM user WHERE name like %#{name}%QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name",name);return userMapper.selectList(queryWrapper);
}
假如要查询年龄大于30岁,可以这样:
public List<User> queryUserGtByAge(int age) {//相当于:SELECT * FROM user WHERE age > ?QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", age);//小于是lt()//大于等于是ge()//小于等于是le()//范围的话,则使用between()return userMapper.selectList(queryWrapper);
}
如果要查询某个字段不为空,可以这样:
public List<User> queryUserByNameNotNull() {//相当于:SELECT * FROM user WHERE name IS NOT NULLQueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNotNull("name");//查询某个字段为空,则使用isNull()return userMapper.selectList(queryWrapper);
}
如果使用IN查询,可以这样:
public List<User> queryUserByIds(List<String> ids) {//相当于:SELECT * FROM user WHERE name IN ('id1','id2');QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in("id", ids);//相反也提供了notIn()方法return userMapper.selectList(queryWrapper);
}
如果需要排序,可以这样写:
public List<User> queryUserOrderByAge() {//相当于:SELECT * FROM user ORDER BY age ASCQueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByAsc("age");//相反的,如果降序则使用orderByDesc()方法return userMapper.selectList(queryWrapper);
}
如果需要子查询,可以这样写:
public List<User> queryUserInSql() {//相当于:SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE age > 30)QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.inSql("id","select id from user where age > 30");return userMapper.selectList(queryWrapper);
}
大部分的方法都是源自AbstractWrapper抽象类,除此之外还有很多功能,这里就不一一介绍下去了,有兴趣的可以到官网的条件构造器慢慢探索。
UpdateWrapper
UpdateWrapper也是AbstractWrapper抽象类的子类实现,所以上述的设置条件的方法都有,不同的是,UpdateWrapper会有set()和setSql()设置更新的值。举个例子:
public int updateUserNameById(String id, String name) {//相当于:UPDATE user SET name = ? where id = ?UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.eq("id", id);//设置set关键字后面的语句,相当于set name = #{name}userUpdateWrapper.set("name", name);return userMapper.update(new User(), userUpdateWrapper);
}
setSql()就是设置SET关键字后面拼接的部分SQL语句,举个例子:
public int updateUserBySql(String id, String name) {//相当于:UPDATE user SET name = ? where id = ?UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.setSql("name = '" + name + "'");userUpdateWrapper.eq("id", id);return userMapper.update(new User(), userUpdateWrapper);
}
setSql()就是纯粹的SQL语句拼接,我们可以看到SET后面接的是name=‘大D’,而不是占位符会有SQL注入的风险。
==> Preparing: UPDATE user SET name = '大D' WHERE id = ?
==> Parameters: d47561e885b011eba0e488d7f66fdab8(String)
<== Updates: 1
LambdaQueryWrapper
用LambdaQueryWrapper的好处在于消除硬编码,比如QueryWrapper在查询name=?
时,需要这样写:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//使用"name"字符串,就是硬编码
queryWrapper.eq("name", name);
如果换成LambdaQueryWrapper就可以这样写:
public List<User> lambdaQueryUserByName(String name) {//相当于:SELECT id,name,age FROM user WHERE name = ?LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();lambdaQueryWrapper.eq(User::getName, name);return userMapper.selectList(lambdaQueryWrapper);
}
再比如使用模糊查询,可以这样写:
public List<User> lambdaQueryUserLikeName(String name) {LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();lambdaQueryWrapper.like(User::getName, name);return userMapper.selectList(lambdaQueryWrapper);
}
LambdaUpdateWrapper
跟上面差不多,LambdaUpdateWrapper也可以消除硬编码:
public int lambdaUpdateUserNameById(String id, String name) {//相当于:UPDATE user SET name=? WHERE id = ?LambdaUpdateWrapper<User> lambdaUpdateWrapper = new UpdateWrapper<User>().lambda();lambdaUpdateWrapper.set(User::getName, name);lambdaUpdateWrapper.eq(User::getId, id);return userMapper.update(new User(), lambdaUpdateWrapper);
}
四、分页查询
Mybatis-plus提供了分页插件支持分页查询,只需要几个步骤即可实现。
首先添加一个配置类:
@Configuration
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}
第二步,在UserMapper类里定义分页查询方法:
@Repository
public interface UserMapper extends BaseMapper<User> {//分页查询方法IPage<User> selectPageByName(Page<User> page, @Param("name") String name);
}
对应的UserMapper.xml方法:
<select id="selectPageByName" parameterType="java.lang.String" resultType="com.yehongzhi.mydemo.model.User">select * from `user` where name = #{name}
</select>
第三步,在userService里调用:
public IPage<User> selectPageByName(long pageNo, long pageSize, String name) {Page<User> page = new Page<>();//设置当前页码page.setCurrent(pageNo);//设置每页显示数page.setSize(pageSize);return userMapper.selectPageByName(page, name);
}
最后写个Controller接口测试:
@RequestMapping("/queryPage/ByName")
public IPage<User> selectPageByName(@RequestParam("pageNo") long pageNo,@RequestParam("pageSize") long pageSize,@RequestParam("name") String name) {return userService.selectPageByName(pageNo, pageSize, name);
}
查看控制台日志:
==> Preparing: SELECT COUNT(1) FROM `user` WHERE name = ?
==> Parameters: 杜琪峰(String)
<== Columns: COUNT(1)
<== Row: 1
==> Preparing: select * from `user` where name = ? LIMIT ?,?
==> Parameters: 杜琪峰(String), 0(Long), 10(Long)
<== Columns: id, name, age
<== Row: d47561e885b011eba0e488d7f66fdab8, 杜琪峰, 30
<== Total: 1
分页查询成功!
五、自定义主键生成器
有时在实际开发中,可能会遇到,Mybatis-plus提供的主键生成策略并不能满足,需要自定义主键ID生成策略,怎么设置呢?
很简单,根据官网的说明,我们先定义一个主键生成器:
@Component
public class SnowflakeKeyGenerator implements IdentifierGenerator {//自己实现的一个雪花ID生成工具类@Resourceprivate SnowflakeIdWorker snowflakeIdWorker;@Overridepublic Number nextId(Object entity) {//使用雪花ID生成器,生成一个雪花IDlong nextId = snowflakeIdWorker.nextId();System.out.println(String.format("使用自定义ID生成器,生成雪花ID:%s", nextId));return nextId;}
}
然后我们在需要使用该自定义ID生成器的实体类上面加上注解属性:
@TableName("user")
public class User {//属性设置为:IdType.ASSIGN_ID@TableId(type = IdType.ASSIGN_ID)private String id;//省略...
}
接着测试一下,我们可以看到控制台有打印日志:
六、总结
除了上面介绍的功能之外,Mybatis-plus还有很多功能,比如:代码生成器、扩展等等。这里就不再一一介绍了。实际上我们掌握上面介绍的CRUD、条件构造器、分页查询、自定义主键策略,基本上已经足够日常的开发。
参考文章
mybatis-plus全解
相关文章:
数据库-MySQL-MybatisPlus实战
文章目录 前言一、整合mybatis-plus二、CRUD操作1、insert操作2、update操作3、delete操作 三、条件构造器(Wrapper)QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapper 四、分页查询五、自定义主键生成器六、总结 前言 mybatis相信都不陌生,目前互联…...
Vue2学习记录
前言 这篇笔记,是根据B站尚硅谷的Vue2网课学习整理的,用来学习的 如果有错误,还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
网络安全中的数据科学如何重新定义安全实践?
组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…...
通过指令导入/导出vscode扩展插件
导出扩展: 打开VSCode终端: 在VSCode中,你可以通过菜单栏的“终端”选项打开终端,或者使用快捷键Ctrl (反引号,通常在键盘左上角)。运行导出命令: 在终端中,输入以下命…...
vscode添加环境变量(mujoco)
文章目录 前言一、创建.env文件二、编写setting.jason 前言 之前一直用pycharm,最近改用cursor了,在pycharm中设置环境变量修改运行配置就行了,vscode要麻烦一些,记录一下。 一、创建.env文件 以mujoco环境变量为例,…...
0-1背包问题(1):贪心算法
问题: 有 n 个物品和背包的容量,每个物品的重量为 w[i],价值为 v[i],背包的容量为 W。选若干个物品放入购物车,物品不可分割,使价值最大。 问题分析: 首先考虑贪心策略: 每次挑选…...
Qt界面篇:QMessageBox高级用法
1、演示效果 2、用法注意 2.1 设置图标 用于显示实际图标的pixmap取决于当前的GUI样式。也可以通过设置icon pixmap属性为图标设置自定义pixmap。 QMessageBox::Icon icon(...
计算机操作系统——进程控制(Linux)
进程控制 进程创建fork()函数fork() 的基本功能fork() 的基本语法fork() 的工作原理fork() 的典型使用示例fork() 的常见问题fork() 和 exec() 结合使用总结 进程终止与$进程终止的本质进程终止的情况正常退出(Exit)由于信号终止非…...
游戏引擎学习第23天
实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功,表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来,极大提升了开发效率。尽管目前的演示内容较为简单,呈现…...
0基础学java之Day25
Vector /** 知识点:Vector独有的方法 理解: * Vector在JDK1.0开始就已经存在 -- 元老级别的集合类, * 集合框架的概念是JDK1.2开始才有的, * 开发人员为了将Vector保留下来…...
android集成FFmpeg步骤以及常用命令,踩坑经历
1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…...
Mac——鼠标增强插件Mos
功能说明: 能够解决鼠标断续、不灵敏等鼠标问题。 下载地址: Mac——鼠标增强插件Mos...
【c++篇】:解读Set和Map的封装原理--编程中的数据结构优化秘籍
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:c篇–CSDN博客 文章目录 前言一.set和map的初步封装1.树的节点封装修改2.Find()查找函数3.红…...
华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座
HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核,鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征,性能超越Linux内核10.7%。 鸿蒙内核更弹性:元OS架构,性能安全双收益 万…...
ArcGIS API for Javascript学习
一、ArcGIS API for Javascript 介绍 ArcGIS API for Javascript 是由美国 Esri 公司推出,跟随ArcGIS 9.3 同时发布的,是Esri 基于dojo 框架和 REST 风格实现的一套编程接口。通过 ArcGIS API for Javascript可以对ArcGIS for Server 进行访问ÿ…...
LeetCode 3206.交替组 I:遍历
【LetMeFly】3206.交替组 I:遍历 力扣题目链接:https://leetcode.cn/problems/alternating-groups-i/ 给你一个整数数组 colors ,它表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] : colors[i] …...
环形缓冲区
什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…...
Maven 仓库
Maven 仓库对于管理构建 Java 项目所需的依赖和插件至关重要。 Maven 仓库主要有三种类型:本地仓库、中央仓库和远程仓库。 本文将探讨每种仓库的用途以及如何有效使用它们。 Maven 仓库类型 本地仓库 本地仓库是位于您本地机器上的一个目录,Maven 在…...
29.UE5蓝图的网络通讯,多人自定义事件,变量同步
3-9 蓝图的网络通讯、多人自定义事件、变量同步_哔哩哔哩_bilibili 目录 1.网络通讯 1.1玩家Pawn之间的同步 1.2事件同步 1.3UI同步 1.4组播 1.5变量同步 1.网络通讯 1.1玩家Pawn之间的同步 创建一个第三人称项目 将网络模式更改为监听服务器,即将房主作为…...
计算机网络习题解答--个人笔记(未完)
本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章: cookie:(这里是比较老版本的HTTP,具体HTTPs是怎么实现的不是很清楚)cookie的原理其实很简单。就是在HTTP消息头上又多…...
Unity图形学之雾Fog
1.设置雾化: 2.雾化变化曲线:FogMode (1)线性: (2)一次指数: (3)二次指数: Shader "Custom/FogTest" {Properties{_Color ("Color…...
ML 系列:第 36 节 — 统计学中的抽样类型
ML 系列:第 36 天 — 统计学中的抽样类型 文章目录 一、说明二、抽样方法三、简单随机抽样四、 Stratified Sampling分层抽样五、 Cluster Sampling 整群抽样六、Systematic Sampling系统抽样七、Convenience Sampling便利抽样八、结论 一、说明 统计学中的抽样类型…...
docker-compose部署java服务
文章目录 一、下载安装docker-compose二、编写Dockerfile文件三、编写docker-compose.yml文件配置说明 四、服务启动五、测试与验证 一、下载安装docker-compose 在安装docker时,并不会同时把docker-compose安装好,需要额外安装一下 下载docker-compos…...
ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页
一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…...
java接口对接标准
概述 最近在跟许多外部平台对接,遇到了很多问题,在此记录一下接口的对接标准。 接口对接标准 确认环境,分别获取di和prd环境的接口信息,比如域名。确认不同环境的防火墙是否连通。接口校验,接口携带的token信息如何…...
训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么
在训练解码器模型时,文本长度不一致是常见的情况,需要根据任务的特性和数据集的长度分布来设置合理的最大长度 (max_length)。以下是一些指导原则,帮助你设置合适的最大长度: 1. 是否需要覆盖最长文本长度 覆盖最长文本长度: 如果任务对完整性要求很高(例如生成数学公式、…...
安装MySQL服务
安装版本MySQL8的安装包 安装界面 在这里选择MySQL中的Server only 只安装服务器端 如果选择custom需要如下图 进入配置导向,点击ready to configure,点击next即可 采用默认形式 执行成功后,会出现自动选择项 点击next然后再点击Finish 启动…...
十二、正则表达式、元字符、替换修饰符、手势和对话框插件
1. 正则表达式 1.1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...
Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线
文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…...
如何提升编程能力第二篇
如何提升编程能力2 1. 引言2. 掌握理论基础2.1 理解编程语言的核心2.2 数据结构与算法2.3 计算机基础与系统设计3.1 多写代码3.2 参与开源项目3.3 开发自己的项目 4. 提高代码质量4.1 代码风格与可读性4.2 测试驱动开发 1. 引言 编程是推动现代科技发展的核心技能,…...
【AI日记】24.11.26 聚焦 kaggle 比赛
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容:研究 kaggle 比赛时间:3 小时 核心工作 2 内容:学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间:4 小时备注:这…...
计算机网络八股整理(一)
计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
删除链表中的重复元素
删除链表中的重复元素 单链表的创建和使用删除链表中的重复元素 I题目描述解题思路代码实现 删除链表中的重复元素 II题目描述解题思路代码实现 单链表的创建和使用 使用vector结合单链表数据结构创建一个通用单链表。 #include <iostream> #include <vector>str…...
序列求和 牛客网
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 定义S(n) 12 22 … n2,输出S(n) % 1000000007。 注意:1 < n < 1e18。 输入描述: 多组输入,输入直到遇到EOF为止;第一行输…...
【Oracle11g SQL详解】 SELECT 语句的基础用法与示例
SELECT 语句的基础用法与示例 在 Oracle 11g 中,SELECT 语句是最常用的 SQL 语句,用于从数据库表中查询数据。本文将从语法结构、使用方法和常见示例出发,系统讲解 SELECT 语句的基础用法。 一、SELECT 语句的基本语法 SELECT 列名1, 列名2…...
编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体
win32下面编译成功,但是x64报错 1>GetWord.c 1>md5.c 这两个文件无法编译 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数“PVOID GetCurrentFiber(void)”已有主体 1>C:\Program Files (x…...
【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子
目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率,联合概率,交叉概率,交叉概率和,总概率 类型含义 …...
如何使用 Tailwind CSS 构建响应式网站:详细指南
文章目录 前言一、安装 Tailwind CSS二、配置 Tailwind CSS三、使用 Tailwind CSS 构建响应式网站四、优化和部署结语 前言 在当今的数字时代,网站不仅需要在桌面浏览器上看起来出色,还需要在移动设备和平板电脑上提供一致的用户体验。响应式设计成为了…...
LabVIEW发动机热磨合试验台
在汽车发动机的研发和质量控制中,发动机热磨合试验是关键环节。它能够检验发动机在实际运行条件下的性能,及时发现异响、振动、漏油等潜在问题。通过搭建基于LabVIEW的高效测试平台,可以显著提高发动机的可靠性和使用寿命。下面介绍LabVIEW开…...
【GPT】力量训练是什么,必要吗,有可以替代的方式吗
什么是力量训练? 力量训练是一种通过抵抗力(如重量、阻力带、自身体重等)来刺激肌肉收缩,从而提高肌肉力量、耐力和体积的运动形式。它包括以下常见形式: 自由重量训练:使用哑铃、杠铃、壶铃等。固定器械…...
pikachu文件上传漏洞通关详解
声明:文章只是起演示作用,所有涉及的网站和内容,仅供大家学习交流,如有任何违法行为,均和本人无关,切勿触碰法律底线 目录 概念:什么是文件上传漏洞一、客户端check二、MIME type三、getimagesi…...
java hashCode() 详解
hashCode() 是 Java 中 Object 类 提供的一个重要方法,它在 Java 集合框架中扮演着关键角色,特别是在使用哈希表相关的集合(如 HashMap、HashSet 和 Hashtable)时。以下是对 hashCode() 方法的详解,包括概念、用法、规…...
鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)
文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多,跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时,需要解决设备发现、设备认证、设备连接、数据同步等技术难题,不但开发成本高,还存…...
JavaWeb
JavaWeb 一、JavaWeb 是什么?二、JavaWeb 发展阶段三、JavaWeb 常用架构Servlet JSP 架构SSH 架构SSM 架构SpringBoot架构SpringCloud架构 四、JavaWeb 项目结构(带web.xml的)五、如何打包六、war包部署1. Tomcat 介绍2. Tomcat目录结构3. 开…...
加快发展社会保障事业的必要性
题目 【2011年浙江公务员考试】(二)某市将召开一次加快发展社会保障事业的形势分析会。会上,某领导要就加快发展社会保障事业的必要性做主题发言。请结合给定资料7~8,为领导拟一份发言要点。(25分) 要求&a…...
责任链模式在spring security过滤器链中的应用
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。 在Spring Security中,责任链模式得到了广泛应…...
Netty基本原理
目录 前言 原生NIO VS Netty 原生NIO存在的问题 Netty的优点 线程模型 传统阻塞 I/O (Blocking I/O) 2. 非阻塞 I/O (Non-blocking I/O) 3. 多路复用 I/O (Multiplexed I/O) 4. Reactor 模式 常见的 Reactor 模式的变体: Netty线程模型 工作原理 前言 N…...
图论入门编程
卡码网刷题链接:98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …...
Haproxy
一、haproxy简介 HAProxy 是法国开发者 威利塔罗 (Willy Tarreau) 在 2000 年使用 C 语言开发的一个开源软件 是一款具备高并发 ( 万级以上 ) 、高性能的 TCP 和 HTTP 负载均衡器 支持基于 cookie 的持久性,自动故障切换,支持正则表达式及 web 状态统…...