[MyBatisPlus]通用Service接口测试通用Service

通用Service接口

说明:

  • 通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
  • 泛型 T 为任意实体对象
  • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承
    Mybatis-Plus 提供的基类
  • 官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%
    A3

IService

/** Copyright (c) 2011-2022, baomidou (jobob@qq.com).** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package com.baomidou.mybatisplus.extension.service;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.ChainQuery;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.ChainUpdate;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper;
import com.baomidou.mybatisplus.extension.kotlin.KtUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.springframework.transaction.annotation.Transactional;import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;/*** 顶级 Service** @author hubin* @since 2018-06-23*/
public interface IService<T> {/*** 默认批次提交数量*/int DEFAULT_BATCH_SIZE = 1000;/*** 插入一条记录(选择字段,策略插入)** @param entity 实体对象*/default boolean save(T entity) {return SqlHelper.retBool(getBaseMapper().insert(entity));}/*** 插入(批量)** @param entityList 实体对象集合*/@Transactional(rollbackFor = Exception.class)default boolean saveBatch(Collection<T> entityList) {return saveBatch(entityList, DEFAULT_BATCH_SIZE);}/*** 插入(批量)** @param entityList 实体对象集合* @param batchSize  插入批次数量*/boolean saveBatch(Collection<T> entityList, int batchSize);/*** 批量修改插入** @param entityList 实体对象集合*/@Transactional(rollbackFor = Exception.class)default boolean saveOrUpdateBatch(Collection<T> entityList) {return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);}/*** 批量修改插入** @param entityList 实体对象集合* @param batchSize  每次的数量*/boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);/*** 根据 ID 删除** @param id 主键ID*/default boolean removeById(Serializable id) {return SqlHelper.retBool(getBaseMapper().deleteById(id));}/*** 根据 ID 删除** @param id      主键(类型必须与实体类型字段保持一致)* @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)* @return 删除结果* @since 3.5.0*/default boolean removeById(Serializable id, boolean useFill) {throw new UnsupportedOperationException("不支持的方法!");}/*** 根据实体(ID)删除** @param entity 实体* @since 3.4.4*/default boolean removeById(T entity) {return SqlHelper.retBool(getBaseMapper().deleteById(entity));}/*** 根据 columnMap 条件,删除记录** @param columnMap 表字段 map 对象*/default boolean removeByMap(Map<String, Object> columnMap) {Assert.notEmpty(columnMap, "error: columnMap must not be empty");return SqlHelper.retBool(getBaseMapper().deleteByMap(columnMap));}/*** 根据 entity 条件,删除记录** @param queryWrapper 实体包装类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default boolean remove(Wrapper<T> queryWrapper) {return SqlHelper.retBool(getBaseMapper().delete(queryWrapper));}/*** 删除(根据ID 批量删除)** @param list 主键ID或实体列表*/default boolean removeByIds(Collection<?> list) {if (CollectionUtils.isEmpty(list)) {return false;}return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));}/*** 批量删除** @param list    主键ID或实体列表* @param useFill 是否填充(为true的情况,会将入参转换实体进行delete删除)* @return 删除结果* @since 3.5.0*/@Transactional(rollbackFor = Exception.class)default boolean removeByIds(Collection<?> list, boolean useFill) {if (CollectionUtils.isEmpty(list)) {return false;}if (useFill) {return removeBatchByIds(list, true);}return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));}/*** 批量删除(jdbc批量提交)** @param list 主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)* @return 删除结果* @since 3.5.0*/@Transactional(rollbackFor = Exception.class)default boolean removeBatchByIds(Collection<?> list) {return removeBatchByIds(list, DEFAULT_BATCH_SIZE);}/*** 批量删除(jdbc批量提交)** @param list    主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)* @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)* @return 删除结果* @since 3.5.0*/@Transactional(rollbackFor = Exception.class)default boolean removeBatchByIds(Collection<?> list, boolean useFill) {return removeBatchByIds(list, DEFAULT_BATCH_SIZE, useFill);}/*** 批量删除(jdbc批量提交)** @param list      主键ID或实体列表* @param batchSize 批次大小* @return 删除结果* @since 3.5.0*/default boolean removeBatchByIds(Collection<?> list, int batchSize) {throw new UnsupportedOperationException("不支持的方法!");}/*** 批量删除(jdbc批量提交)** @param list      主键ID或实体列表* @param batchSize 批次大小* @param useFill   是否启用填充(为true的情况,会将入参转换实体进行delete删除)* @return 删除结果* @since 3.5.0*/default boolean removeBatchByIds(Collection<?> list, int batchSize, boolean useFill) {throw new UnsupportedOperationException("不支持的方法!");}/*** 根据 ID 选择修改** @param entity 实体对象*/default boolean updateById(T entity) {return SqlHelper.retBool(getBaseMapper().updateById(entity));}/*** 根据 UpdateWrapper 条件,更新记录 需要设置sqlset** @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}*/default boolean update(Wrapper<T> updateWrapper) {return update(null, updateWrapper);}/*** 根据 whereEntity 条件,更新记录** @param entity        实体对象* @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}*/default boolean update(T entity, Wrapper<T> updateWrapper) {return SqlHelper.retBool(getBaseMapper().update(entity, updateWrapper));}/*** 根据ID 批量更新** @param entityList 实体对象集合*/@Transactional(rollbackFor = Exception.class)default boolean updateBatchById(Collection<T> entityList) {return updateBatchById(entityList, DEFAULT_BATCH_SIZE);}/*** 根据ID 批量更新** @param entityList 实体对象集合* @param batchSize  更新批次数量*/boolean updateBatchById(Collection<T> entityList, int batchSize);/*** TableId 注解存在更新记录,否插入一条记录** @param entity 实体对象*/boolean saveOrUpdate(T entity);/*** 根据 ID 查询** @param id 主键ID*/default T getById(Serializable id) {return getBaseMapper().selectById(id);}/*** 查询(根据ID 批量查询)** @param idList 主键ID列表*/default List<T> listByIds(Collection<? extends Serializable> idList) {return getBaseMapper().selectBatchIds(idList);}/*** 查询(根据 columnMap 条件)** @param columnMap 表字段 map 对象*/default List<T> listByMap(Map<String, Object> columnMap) {return getBaseMapper().selectByMap(columnMap);}/*** 根据 Wrapper,查询一条记录 <br/>* <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")</p>** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default T getOne(Wrapper<T> queryWrapper) {return getOne(queryWrapper, true);}/*** 根据 Wrapper,查询一条记录** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}* @param throwEx      有多个 result 是否抛出异常*/T getOne(Wrapper<T> queryWrapper, boolean throwEx);/*** 根据 Wrapper,查询一条记录** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/Map<String, Object> getMap(Wrapper<T> queryWrapper);/*** 根据 Wrapper,查询一条记录** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}* @param mapper       转换函数*/<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);/*** 查询总记录数** @see Wrappers#emptyWrapper()*/default long count() {return count(Wrappers.emptyWrapper());}/*** 根据 Wrapper 条件,查询总记录数** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default long count(Wrapper<T> queryWrapper) {return SqlHelper.retCount(getBaseMapper().selectCount(queryWrapper));}/*** 查询列表** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default List<T> list(Wrapper<T> queryWrapper) {return getBaseMapper().selectList(queryWrapper);}/*** 查询所有** @see Wrappers#emptyWrapper()*/default List<T> list() {return list(Wrappers.emptyWrapper());}/*** 翻页查询** @param page         翻页对象* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {return getBaseMapper().selectPage(page, queryWrapper);}/*** 无条件翻页查询** @param page 翻页对象* @see Wrappers#emptyWrapper()*/default <E extends IPage<T>> E page(E page) {return page(page, Wrappers.emptyWrapper());}/*** 查询列表** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper) {return getBaseMapper().selectMaps(queryWrapper);}/*** 查询所有列表** @see Wrappers#emptyWrapper()*/default List<Map<String, Object>> listMaps() {return listMaps(Wrappers.emptyWrapper());}/*** 查询全部记录*/default List<Object> listObjs() {return listObjs(Function.identity());}/*** 查询全部记录** @param mapper 转换函数*/default <V> List<V> listObjs(Function<? super Object, V> mapper) {return listObjs(Wrappers.emptyWrapper(), mapper);}/*** 根据 Wrapper 条件,查询全部记录** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default List<Object> listObjs(Wrapper<T> queryWrapper) {return listObjs(queryWrapper, Function.identity());}/*** 根据 Wrapper 条件,查询全部记录** @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}* @param mapper       转换函数*/default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());}/*** 翻页查询** @param page         翻页对象* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) {return getBaseMapper().selectMapsPage(page, queryWrapper);}/*** 无条件翻页查询** @param page 翻页对象* @see Wrappers#emptyWrapper()*/default <E extends IPage<Map<String, Object>>> E pageMaps(E page) {return pageMaps(page, Wrappers.emptyWrapper());}/*** 获取对应 entity 的 BaseMapper** @return BaseMapper*/BaseMapper<T> getBaseMapper();/*** 获取 entity 的 class** @return {@link Class<T>}*/Class<T> getEntityClass();/*** 以下的方法使用介绍:** 一. 名称介绍* 1. 方法名带有 query 的为对数据的查询操作, 方法名带有 update 的为对数据的修改操作* 2. 方法名带有 lambda 的为内部方法入参 column 支持函数式的* 二. 支持介绍** 1. 方法名带有 query 的支持以 {@link ChainQuery} 内部的方法名结尾进行数据查询操作* 2. 方法名带有 update 的支持以 {@link ChainUpdate} 内部的方法名为结尾进行数据修改操作** 三. 使用示例,只用不带 lambda 的方法各展示一个例子,其他类推* 1. 根据条件获取一条数据: `query().eq("column", value).one()`* 2. 根据条件删除一条数据: `update().eq("column", value).remove()`**//*** 链式查询 普通** @return QueryWrapper 的包装类*/default QueryChainWrapper<T> query() {return ChainWrappers.queryChain(getBaseMapper());}/*** 链式查询 lambda 式* <p>注意:不支持 Kotlin </p>** @return LambdaQueryWrapper 的包装类*/default LambdaQueryChainWrapper<T> lambdaQuery() {return ChainWrappers.lambdaQueryChain(getBaseMapper());}/*** 链式查询 lambda 式* kotlin 使用** @return KtQueryWrapper 的包装类*/default KtQueryChainWrapper<T> ktQuery() {return ChainWrappers.ktQueryChain(getBaseMapper(), getEntityClass());}/*** 链式查询 lambda 式* kotlin 使用** @return KtQueryWrapper 的包装类*/default KtUpdateChainWrapper<T> ktUpdate() {return ChainWrappers.ktUpdateChain(getBaseMapper(), getEntityClass());}/*** 链式更改 普通** @return UpdateWrapper 的包装类*/default UpdateChainWrapper<T> update() {return ChainWrappers.updateChain(getBaseMapper());}/*** 链式更改 lambda 式* <p>注意:不支持 Kotlin </p>** @return LambdaUpdateWrapper 的包装类*/default LambdaUpdateChainWrapper<T> lambdaUpdate() {return ChainWrappers.lambdaUpdateChain(getBaseMapper());}/*** <p>* 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法* 此次修改主要是减少了此项业务代码的代码量(存在性验证之后的saveOrUpdate操作)* </p>** @param entity 实体对象*/default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {return update(entity, updateWrapper) || saveOrUpdate(entity);}
}

MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑
详情查看源码IService和ServiceImpl

创建Service接口和实现类

在这里插入图片描述

UserService.interface

package com.xxxx.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.xxxx.mybatisplus.pojo.User;public interface UserService extends IService<User> {
}

UserServiceImpl

package com.xxxx.mybatisplus.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxxx.mybatisplus.mapper.UserMapper;
import com.xxxx.mybatisplus.pojo.User;
import com.xxxx.mybatisplus.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

测试通过Service

查询总记录数

package com.xxxx.mybatisplus;import com.xxxx.mybatisplus.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class MyBatisPlusServiceTest {@Autowiredprivate UserService userService;/*** 查询总记录数* SELECT COUNT( * ) FROM user*/@Testpublic void testGetCount(){long count = userService.count();System.out.println("总记录数 = "+count);}}

在这里插入图片描述

批量添加功能

@Testpublic void testInsertMore(){List<User> list = new ArrayList<>();for (int i = 1;i<=10;i++){User user = new User();user.setName("ybc"+i);user.setAge(20+i);list.add(user);}boolean b = userService.saveBatch(list);System.out.println(b);}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

程序员修神之路--晦涩难懂的CAP,是否完全正确?

微信搜一搜架构师修行之路菜菜哥&#xff0c;帮忙解决一个问题是不是面试又被虐了&#xff1f;是的呢&#xff0c;这次面试官问我什么是CAP&#xff1f;这个可就说来话长了......01PARTCAP说到CAP&#xff0c;首先不能不说分布式系统&#xff0c;前面几篇也说过&#xff0c;分布…

[MyBatisPlus]雪花算法

雪花算法 背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括&#xff1a;业务分库、主从复制&#xff0c;数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器&#xff0c;能够支撑…

如何隐藏运行 winform 程序?

群里有个同学问了问题 如何隐藏运行 winform 程序&#xff1f;&#xff0c;提起了我的兴趣&#xff0c;玩玩呗&#xff1f;那就玩玩吧&#xff01;第一版 将一个 winform 程序隐藏执行&#xff0c;隐藏执行的方式有很多种&#xff0c;第一个 demo 就用最简单的方式&#xff0c;…

[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

常用注解 TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗&#xff1f; 我们可以通过配置文件来解决这个问题&#xff1a; TableId 将属性所对应的字段指定为主键 TableId的value属性 TableId的ty…

最小堆和最大堆的建立以及基本操作

前言&#xff1a; 堆的特性&#xff1a;用数组表示的完全二叉树。有序性&#xff1a;任一结点的关键字是其子树所有结点的最大值 (最小值) 堆的本质&#xff1a;就是一颗 完全二叉树 堆的数据存储&#xff1a; 用的是 数组 建堆时主要的操作&#xff1a;就是调整 对数组的元素…

字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型

Python语言中最常用的组合数据类型有3大类&#xff0c; 分别是集合类型、序列类型和映射类型。集合类型是一个具体的数据类型名称&#xff0c;而序列类型和映射类型是一类数据类型的总称。集合类型是一个元素集合&#xff0c;元素之间无序&#xff0c;相同元素在 集合中唯一存在…

[MyBatisPlus]条件构造器wapper

wapper简介 QueryWrapper 组装查询条件 查询用户名包含a&#xff0c;年龄在20到30之间&#xff0c;邮箱信息不为null的用户信息 package com.xxxx.mybatisplus;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xxxx.mybatisplus.mapper.Use…

推荐:适合小白入门的Asp.Net Core 开源学习手册

前言推荐一个入门级的.NET Core开源项目&#xff0c;非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址&#xff1a;https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…

从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;小灰来源&#xff1a;程序员小灰本期封面作者&#xff1a;泰勒太乐————— 第二天 —————题目是什么意思呢&#xff1f;比如给定的无序数组如下&#xff1a;如果 k6&#xff0c;也就是要寻找第6大的元素&a…

DFS和BFS总结和代码演示(详解)

1&#xff1a;BFS 广度优先搜索类似于树的层次遍历过程。它需要借助一个队列来实现。如图2-1-1所示&#xff0c;要想遍历从v0到v6的每一个顶点&#xff0c;我们可以设v0为第一层&#xff0c;v1、v2、v3为第二层&#xff0c;v4、v5为第三层&#xff0c;v6为第四层&#xff0c;再…

Kestrel的ListenAnyIP和ListenLocalhost的区别

问题在上篇文章&#xff0c;把AAStore.ProductCatalog.Api部署到docker中运行&#xff0c;输入地址访问报错如下图&#xff0c;说明外部无法访问这个url。&#xff08;当然本地开发环境测试是可以访问的&#xff09;。后来修改此处options.ListenLocalhost(8081)的代码改成opti…

[MyBatisPlus]Plus分页插件的配置和使用

Plus分页插件的配置和使用 配置类 package com.xxxx.mybatisplus.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.Pagin…

控制是否展示_现场展示板管理不在于看,而在于管!

点击上方"五株科技"&#xff0c;关注公众号&#xff0c;天天有精彩&#xff01;一位日本专家根据研究数据宣称&#xff0c;如果中国的中小企业有效实行车间展示板管理&#xff0c;最大能够提升生产效率30%以上。通常被管理者小视的车间展示板&#xff0c;在专家眼中却…

龙芯完成.NET移植稳步推进生态建设

不久前&#xff0c;龙芯团队完成了.Net Core 3.1在龙芯上的移植。早在1年前&#xff0c;一位网友就告知&#xff0c;希望.Net能够移植到龙芯平台&#xff0c;因为一些政务应用场景有这方面的需求。只不过了一年&#xff0c;这就问题就被龙芯团队解决了。龙芯团队之所以移植.Net…

[MyBatisPlus]乐观锁和悲观锁

乐观锁和悲观锁 场景 一件商品&#xff0c;成本价是80元&#xff0c;售价是100元。老板先是通知小李&#xff0c;说你去把商品价格增加50元。小李正在玩游戏&#xff0c;耽搁了一个小时。正好一个小时后&#xff0c;老板觉得商品价格增加到150元&#xff0c;价格太高&#xf…

7月30日 举办专注于微服务的.NET Conf Focus

2020 年 7 月 30 日, 由.NET基金会和微软 将举办一个在线和为期一天的活动&#xff0c;包括 微软 .NET 团队的演讲者以及社区的演讲者。本次在线大会 专注.NET框架构建微服务&#xff0c;演讲者分享构建和部署云原生应用程序的最佳实践、模式、提示和技巧。有关更多信息和随时了…

7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊

一&#xff1a;题目&#xff1a; 哈利波特要考试了&#xff0c;他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha&#xff0c;将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念&#xff0c;例…

ABPHelper.CLI及其依赖项简单介绍

图片gif无法查看&#xff0c;请查看原文至博客园查看详情。目录目录ABPHelper.CLIScriban通过Microsoft.Extensions.FileProviders.Embedded获取嵌入资源通过静态方法获取文件内容使用Microsoft.Extensions.FileProviders.Physical获取文件内容Microsoft.CodeAnalysis.CSharpHu…

[RabbitMQ]整合SpringBoot

整合SpringBoot 创建项目 引入依赖 <dependencies><!--RabbitMQ 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><…

mysql 固定符号分列显示_MySql中指定符号分割并分行展示

1.涉及到的函数三个&#xff1a;1.1 REPLACE(value,str1,str2)用法规则&#xff1a;使用str2替换掉value中的所有的str1;SELECT REPLACE(我来了,来,走)执行结果如下&#xff1a;1.2 LENGTH(str)用法规则&#xff1a;获取字符串的长度&#xff0c;使用 uft8(UNICODE 的一种变长字…