Mybatis-Plus中update更新操作用法

2023-11-12

一、前言

在Mybatis-Plus官网当中并没有对于update进行针对性的详细讲解以及其使用,很多初级小白都用不明白,包括我有时候都迷迷糊糊的,基于这个问题我也是下定决心好好整理一篇。本篇文章重点是通过多个案例来进行讲解,每一个案例执行出来的sql我都会放到文章当中,方便大家快速掌握并使用!

在实际开发当中我们一般都是将service的接口继承IService<T>,然后serviceImpl继承ServiceImpl<M extends BaseMapper<T>, T>,mapper接口继承BaseMapper<T>

BaseMapper相对来说方法比较少,一般都是通过service接口或者serviceImpl来使用,其update的相关方法有如下:

二、update

update方法主要有以下:

// 返回UpdateChainWrapper,主要用来链式调用
UpdateChainWrapper update();
// 返回LambdaUpdateChainWrapper ,同样是主要用来链式调用,只不过是基于Lambda的
LambdaUpdateChainWrapper lambdaUpdate();
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);

参数说明

1、关于修改的4个条件构造器

Mybatis-Plus给我们提供了4个关于Java修改的条件构造器,这四个构造器的顶级父类都是Wrapper

  1. UpdateWrapper
UpdateWrapper<User> objectUpdateWrapper = new UpdateWrapper<>();
UpdateWrapper<User> update1 = Wrappers.update();
  1. LambdaUpdateWrapper:
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper();
LambdaUpdateWrapper<User> updateWrapper = new UpdateWrapper().lambda();
LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
  1. UpdateChainWrapper:可以new,但是必须传入BaseMapper参数或者是传入实体类的字节码,可以通过service来声明。
@Resource
private UserService userService;

@Resource
private UserMapper userMapper;

@Test
void contextLoads() {
    UpdateChainWrapper<User> update = userService.update();
    UpdateChainWrapper<User> userUpdateChainWrapper = new UpdateChainWrapper<>(User.class);
    UpdateChainWrapper<User> userUpdateChainWrapper1 = new UpdateChainWrapper<>(userMapper);
}
  1. LambdaUpdateChainWrapper:同UpdateChainWrapper一样,可以new,但是必须传入BaseMapper参数或者是传入实体类的字节码,可以通过service来声明,LambdaUpdateChainWrapper<User> userLambdaUpdateChainWrapper = userService.lambdaUpdate();
    在这里插入图片描述

UpdateChainWrapper和LambdaUpdateChainWrapper都继承了AbstractChainWrapper,而UpdateWrapper和LambdaUpdateWrapper都继承了AbstractWrapper。AbstractChainWrapper和AbstractWrapper都继承了Wrapper。

在上面我们也了解到了Mybatis-Plus给我们提供了好几个update方法,并且传参都离不开Wrapper,下面我们将通过不同的Wrapper和不同的方法进行结合起来,彻底了解清楚什么时候该用什么方法!

2、UpdateWrapper【用法示例】

UpdateWrapper当中主要这四个方法用的比较多一点

set(String column, Object val)
set(boolean condition, String column, Object val)
setSql(String sql)
setSql(boolean condition, String sql)

参数解释:

类型 参数名 描述
String column 数据库当中的字段名称
Object val 需要修改的数据
boolean condition 判断条件,控制该sql是否用到条件当中,假如为true代表生效
String sql 拼接sql

(1)使用场景一:

UpdateWrapper<User> updateWrapper = Wrappers.update();
// 修改表中name字段为指定的数据
updateWrapper.set("name", "123");
// 假如age不等于空,那么我就将age修改为我指定的参数
Integer age = 66;
updateWrapper.set(age != null, "age", age);
updateWrapper.set("email", "99999@qq.com");
// 修改条件为id=5的数据
updateWrapper.eq("id", 5);
// 假如修改失败返回值为false
boolean update = userService.update(updateWrapper);

日志打印出来的sql:

UPDATE user SET name='123',age=66,email='99999@qq.com' WHERE (id = 5)

使用 boolean update(Wrapper<T> updateWrapper); 修改,他本质上就是调用的update(T updateEntity, Wrapper<T> whereWrapper);,只不过Entity传的为null!

(2)使用场景二:把所有set值全去掉,只使用UpdateWrapper作为修改的条件,然后通过Entity赋值

UpdateWrapper<User> updateWrapper = Wrappers.update();
// 修改条件为id=5的数据
updateWrapper.eq("id", 5);
User user = new User();
user.setName("wdawdwa");
user.setAge(888);
user.setEmail("dwadwad@qq.com");
// 假如修改失败返回值为false
boolean update = userService.update(user, updateWrapper);

日志打印出来的sql:

UPDATE user SET name='wdawdwa', age=888, email='dwadwad@qq.com' WHERE (id = 5)

(3)Entity之和UpdateWrapper两种赋值方式同时使用:

接下来我们进行测试看看boolean update(T updateEntity, Wrapper<T> whereWrapper); 假如同时使用两种赋值方式会是什么样的。

UpdateWrapper<User> updateWrapper = Wrappers.update();

// 修改表中name字段为指定的数据
updateWrapper.set("name", "123");
// 假如age不等于空,那么我就将age修改为我指定的参数
Integer age = 66;
updateWrapper.set(age != null, "age", age);
updateWrapper.set("email", "99999@qq.com");
// 修改条件为id=5的数据
updateWrapper.eq("id", 5);

User user = new User();
user.setName("wdawdwa");
user.setEmail("99999@qq.com");

// 假如修改失败返回值为false
boolean update = userService.update(user, updateWrapper);

日志打印出来的sql:

UPDATE user SET name='wdawdwa', age=0, email='99999@qq.com', name='123222',age=66 WHERE (id = 5)

得出结论:

  • updateWrapper和Entity同时对name进行赋值,很显然Entity根本没起到作用的哈!updateWrapper优先级要高于Entity。
  • 最终查询出来的sql是updateWrapper和Entity两种赋值方式的并集。并不会因为使用了updateWrapper.set赋值就导致整个Entity失效!

(4)现在有一个疑问需要验证一下,new出来的user并没有对email字段赋值,那么他会不会将数据库当中的email赋值为null。

下面我们进行验证,我user表有好几个字段,我只修改了两个!

UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.eq("id", 5);
User user = new User();
user.setName("wdawdwa");
user.setAge(888);
boolean update = userService.update(user, updateWrapper);

日志打印出来的sql:

UPDATE user SET name='wdawdwa', age=888 WHERE (id = 5)

得出结论:

  • Mybatis-Plus会根据字段是否为null来判断条件是否生效,假如实体类当中使用的是基本类型,new出来的对象会赋初始值的,比如int默认就是0,这样就会导致我们并不想对他进行修改,但是最后却修改了。

(5)本质上假如我们不使用UpdateWrapper的set相关方法的话,其实也可以直接使用QueryWrapper的,如下:

QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
updateWrapper.eq("id", 5);
User user = new User();
user.setName("wdawdwa");
user.setAge(888);
user.setEmail("dwadwad@qq.com");
boolean update = userService.update(user, objectQueryWrapper);

日志打印出来的sql同时用UpdateWrapper是一样的:

UPDATE user SET name='wdawdwa', age=0 WHERE (id = 5)

UpdateWrapper和QueryWrapper都继承了AbstractWrapper,AbstractWrapper主要用于生成 sql 的 where 条件,AbstractWrapper又继承了Wrapper。他两个唯一的区别是:

  • UpdateWrapper实现了Update接口,这个接口提供了一些set方法
  • QueryWrapper实现了Query接口,这个接口提供了一些select方法

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

(6)假如我们不使用Entity也不使用UpdateWrapper的set,那sql打印出来是什么呢?

UpdateWrapper<User> updateWrapper = Wrappers.update();
// 修改条件为id=5的数据
updateWrapper.eq("id", 5);
// 假如修改失败返回值为false
boolean update = userService.update(null, updateWrapper);

运行结果:

得出结论:

  • 直接就语法异常了:语法异常userService.update并不会返回false,而是线程直接就终止了!

3、LambdaUpdateWrapper【用法示例】

UpdateWrapper和LambdaUpdateWrapper其实是一样的,都能够实现彼此的功能,只是语法不同,LambdaUpdateWrapper所有的指定column参数不再是字符串,而是SFunction函数。

(1)使用场景:

LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
// 修改条件为id=5的数据
objectLambdaUpdateWrapper.eq(User::getId, 5);
objectLambdaUpdateWrapper.set(User::getAge, 22);
objectLambdaUpdateWrapper.set(User::getName, "zhangsan");
objectLambdaUpdateWrapper.setSql("email='cece@qq.com'");

User user = new User();
user.setAge(666);
boolean update = userService.update(user, objectLambdaUpdateWrapper);

日志打印出来的sql:

UPDATE user SET age=666, age=22,name='zhangsan',email='cece@qq.com' WHERE (id = 5)

(2)原理讲解

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

SFunction其实就是继承了Function函数。而Function是一个函数式(Functional)接口

Function三种使用方法:

public static void main(String[] args) {
    // 匿名内部类
    Function function = new Function<User, Object>() {
        @Override
        public Object apply(User user) {
            return user.getAge();
        }
    };

    // lambda
    Function<User, Object> function1 = (a) -> a.getAge();

    // 方法引用
    Function<User, Object> function2 = User::getAge;
}

核心源码: 感兴趣的可以断点观察一下源码

(3)假如我们的get方法和表中的字段不对应,是否会出问题?

LambdaUpdateWrapper<User> objectLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
// 修改条件为id=5的数据
objectLambdaUpdateWrapper.eq(User::getId, 5);
objectLambdaUpdateWrapper.set(User::getSexaa, "男");
boolean update = userService.update(objectLambdaUpdateWrapper);

日志打印出来的sql:

UPDATE user SET sex='男' WHERE (id = 5)

得出结论:

  • 实体字段名和数据库当中的列名称不一致,并不会影响赋值使用,他实际上是通过反射拿到的是@TableField当中指定的值!而并非只是简单的通过get方法名字来获取的。

4、UpdateChainWrapper【 用法示例】

(1)使用场景一:

// UpdateChainWrapper有三种创建方式
//	UpdateChainWrapper<User> userUpdateChainWrapper = new UpdateChainWrapper<>(User.class);
//	UpdateChainWrapper<User> update = new UpdateChainWrapper<>(userMapper);
User user = new User();
user.setAge(222);
UpdateChainWrapper<User> updateChainWrapper = userService.update();
updateChainWrapper.eq("id", 5)
        .set("name", "张三")
        .setSql("email='cece@qq.com'")
        .setEntity(user)
        .update();

日志打印出来的sql:

UPDATE user SET name='张三',email='cece@qq.com' WHERE age=222 AND (id = 5)

(2)使用场景二:

User user = new User();
user.setAge(222);
UpdateChainWrapper<User> updateChainWrapper = userService.update();
updateChainWrapper.eq("id", 5)
        .update(user);

日志打印出来的sql:

UPDATE user SET age=222 WHERE (id = 5)

5、LambdaUpdateChainWrapper【 用法示例】

LambdaUpdateChainWrapper同UpdateChainWrapper一模一样,只不过参数是函数式表达式,这里就不再过多叙述了。

// LambdaUpdateChainWrapper有三种创建方式
 // LambdaUpdateChainWrapper<User> userUpdateChainWrapper = new LambdaUpdateChainWrapper<>(User.class);
 // LambdaUpdateChainWrapper<User> update = new LambdaUpdateChainWrapper<>(userMapper);
 User user = new User();
 user.setAge(222);
 LambdaUpdateChainWrapper<User> userLambdaUpdateChainWrapper = userService.lambdaUpdate();
 userLambdaUpdateChainWrapper.eq(User::getId,5)
         .update(user);

日志打印出来的sql:

UPDATE user SET age=222 WHERE (id = 5)

6、updateById 和 updateBatchById

(1)updateById 使用场景:

在调用updateById方法前,需要在T entity(对应的实体类)中的主键属性上加上@TableId注解。

User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);
userService.updateById(user);

日志打印出来的sql:

UPDATE user SET age=555 WHERE id=5

(2)updateBatchById 使用场景:

User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);

User user1 = new User();
user1.setId(new Long(4));
user1.setAge(666);
user1.setEmail(null);

List<User> objects = new ArrayList<>();
objects.add(user);
objects.add(user1);
boolean b = userService.updateBatchById(objects);

日志打印出来的sql:

UPDATE user SET age=555 WHERE id=5
UPDATE user SET age=666 WHERE id=4

7、Mybatis-plus设置某个字段值为null的方法总结

Mybatis-Plus给我们提供的update根本没有全量修改的,都是只对不为空的进行修改,例如updateById和update使用Entity赋值的方法都是只对不为null的进行赋值修改。假如遇到需要将某个值赋为null这时候该怎么办?

方式一:在mapper.xml中写对应的sql语句

方式二:实体类对应字段添加注解

@TableField注解介绍:

  • @TableField(insertStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成insert sql时会忽略该字段值的判断
  • @TableField(updateStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成update sql时会忽略该字段值的判断
  • @TableField(whereStrategy = FieldStrategy.IGNORED) 添加该注解值的字段在Mybatis-plus生成sql时的where条件中会忽略该字段值的判断

可以聚合三种进行同时使用:

@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)  

说明 FieldStrategy 的可选值:

  • FieldStrategy.NOT_NULL:不为null则更新,也就是字段值为null则不生成到sql中不更新该字段,如果字段值为""(空字符串)也是会更新的
  • FieldStrategy.NOT_EMPTY:不为空则更新,也就是该字段值为null或为""(空字符串)都不会更新
  • FieldStrategy.DEFAULT:默认值,和全局配置保持一致
  • FieldStrategy.IGNORED:忽略判断,该字段值不论是什么,都进行更新
  • FieldStrategy.NEVER:不做更新操作,该字段值不论是什么,都不进行更新

在email字段中设置注解,加上该注解之后,Mybatis-plus会在对应的情况下生成sql时忽略掉该字段值的判断;即该字段值不论是什么都会生成在sql中,就可以设置字段值为null了;

@TableField(value = "email", updateStrategy = FieldStrategy.IGNORED)

测试添加注解后的效果:

User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);
userService.updateById(user);

日志打印出来的sql:

UPDATE user SET age=555, email=null WHERE id=5

方式三:通过条件构造器的set进行赋值

UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", null);
updateWrapper.eq("id", 5);
boolean update = userService.update(updateWrapper);

方式四:Mybatis-plus 全局参数配置(yaml方式配置如下)

全局配置的值可选项和第二种方式 FieldStrategy 的可选项一致,全局配置默认值为 not_null

mybatis-plus:
  global-config:
    db-config:
      insert-strategy: ignored
      update-strategy: ignored
      select-strategy: ignored

这种方式和第二种一样可能会使用不当导致字段值为null,数据丢失;并且该方式是全局配置,对所有表的实体类所有字段都生效,危害会更严重;如果同时配置了第二种,那么优先第二种生效。

三、saveOrUpdate

saveOrUpdate方法主要有以下:

// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

参数说明:

下面进行一个一个讲解

1、saveOrUpdate 【用法示例】

方法一:

boolean saveOrUpdate(T entity);  

这个方法我就不演示了哈,通过源码已经可以看的一清二楚了,如下:

方法二:

default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
    return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
}
User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);

UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", "123");
boolean b = userService.saveOrUpdate(user, updateWrapper);

日志打印出来的sql:

我把user.setId(new Long(5));这一行去掉之后也是打印出来的下面的sql

UPDATE user SET age=555, name='123'

通过上面示例好像说明不了其作用,我们再来看一个示例:

User user = new User();
user.setAge(555);
user.setEmail(null);

UpdateWrapper<User> updateWrapper = Wrappers.update();
// 修改表中name字段为指定的数据
updateWrapper.set("name", "123");
// 假如不存在id为5的数据,这时候会进行新增
updateWrapper.eq("id",5);
boolean b = userService.saveOrUpdate(user, updateWrapper);

日志打印出来的sql:

UPDATE user SET age=555, name='123' WHERE (id = 5)

假如不存在id为5的数据,这时候打印出来的sql:

UPDATE user SET age=555, name='123' WHERE (id = 6)
INSERT INTO user ( id, age ) VALUES ( 1668194662817099777, 555 )

得出结论:

  • 像我们平常使用的updateByid不就是根据id来判断是新增还是修改。而这个方法说白了他就是要以updateWrapper当中所组成的where条件来判断是新增还是修改。

2、saveOrUpdateBatch【用法示例】

方法三:

default boolean saveOrUpdateBatch(Collection<T> entityList) {
    return this.saveOrUpdateBatch(entityList, 1000);
}

测试代码:数据库当中只有id为5的数据,没有id为6的数据

User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);

User user1 = new User();
user1.setId(new Long(6));
user1.setAge(666);
user1.setEmail(null);

List<User> objects = new ArrayList<>();
objects.add(user);
objects.add(user1);

boolean b = userService.saveOrUpdateBatch(objects);

System.out.println("11111111111111111111");
System.out.println(b);

日志打印出来的sql:

SELECT id,name,age,email FROM user WHERE id=5
UPDATE user SET age=555 WHERE id=5
SELECT id,name,age,email FROM user WHERE id=6
INSERT INTO user ( id, age ) VALUES ( 6, 666 )

得出结论:

  • 假如是批量的,能查到就修改,查不到就新增,每条数据都是相互隔离的,谁也不影响谁

方法四:

其实方法三就是掉用的方法四,设置了batchSize 为1000。 batchSize代表的是插入批次数量。

boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

3、批量插入优化

如果大数据量(例如五千、一万)插入建议修改MySQL的JDBC连接的url为如下,开启rewriteBatchedStatements,可以优化插入速度。

url: jdbc:mysql://127.0.0.1:3306/text1?characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true

四、防全表更新与删除插件

在使用Mybatis-Plus的时候如果对API不是特别了解很容易导致重大事故,就拿下面的代码来说:

User user = new User();
user.setId(new Long(5));
user.setAge(555);
user.setEmail(null);

UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", "123");
boolean b = userService.saveOrUpdate(user, updateWrapper);

日志打印出来的sql:

UPDATE user SET age=555, name='123'

本来想着只修改id为5的数据,却不料最终执行的sql连where条件都没有,导致把整张表全给修改了。针对于这个问题我们可以添加如下配置进行防范:

这是官网给我们提供的:https://baomidou.com/pages/c571bc/#blockattackinnerinterceptor

@Configuration
public class MybatisPlusConfig {
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
    return interceptor;
  }
}

然后这时候再执行sql会发现直接就异常了,原因是没有where条件!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis-Plus中update更新操作用法 的相关文章

  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • titledBorder 标题中的图标

    您好 是否可以在 titledBorder 的标题中放置一个图标 例如以下代码 import java awt GridLayout import javax swing JFrame import javax swing JLabel i
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐

  • C++学习之旅 第二章 printf与cout

    目录 1 printf简介 2 printf的四种用法 2 1 printf 字符串 2 2 printf 输出控制符 输出参数 2 3 printf 输出控制符1 输出控制符2 输出参数1 输出参数2 2 4 printf 输出控制符 非
  • 百度又发布一个神器!网友直呼好家伙

    目标检测作为计算机视觉领域的顶梁柱 不仅可以独立完成车辆 商品 缺陷检测等任务 也是人脸识别 视频分析 以图搜图等复合技术的核心模块 在自动驾驶 工业视觉 安防交通等领域的商业价值有目共睹 正因如此 YOLOv5 YOLOX PP YOLO
  • 统计相关国际期刊汇总

    统计相关国际期刊汇总 ID 期刊名 编码 大类 小类 3年平均IF 2年总被引 1 Journal of the American Statistical Association JASA 0162 1459 数学2区 top STATIS
  • Hibernate之一对多双向关联查询

    在这里模拟一个业务场景记录hibernate中一对多双向关联的配置及使用 当我们在手机上购物付款之后 是会生成订单的 一个订单中会存在着多个订单项 订单与订单项之间就存在着一对多的关系 一个订单中可以有多个订单项 而多个订单项又组成为一个订
  • speex回声消除源码解读

    一 speex回声消除aec小析 频域自适应算法采用了分块处理的思想 以减少高阶自适应滤波器的计算复杂度 多延迟自适应滤波器 MDF 则更一般可以分M块来处理 其中块的长度比自适应滤波器的阶数更小 后置滤波器系数一直在更新 单讲时前置滤波器
  • C\C++编程技巧之全局变量的初始化

    为了增强代码的鲁棒性 减少不必要的bug出现 务必在定义变量的时候就想好在哪里对其初始化 对于全局变量 最好在该模块的init函数中对其初始化 该init函数一般在上电过程中初始化 对于文件内的局部变量一般在调用该模块时进行初始化 C 中构
  • aspose 实现 WORD转PDF【亲测可用】

    aspose 实现word转PDF 直接上代码 import java io File import java io FileOutputStream import java io InputStream import com aspose
  • Spring Boot连接DB2查询结果时报错“java.lang.AbstractMethodError: com.ibm.db2.jcc.t4.b.isValid(I)Z”的解决办法...

    关于在maven项目中如何添加DB2的坐标的详细 见 https www cnblogs com zifeiy p 7918554 html Spring Boot项目中的application properties文件内容如下 DB Co
  • 育碧2k微软服务器,育碧服务器出现大规模的BUG:影响到多个平台

    PConline资讯 昨日 育碧的服务器出现大规模的BUG 包括 彩虹六号 幽灵行动 等多款育碧游戏无法进行联机游戏 育碧官方也是在第一时间在微博和推特发布了消息并表示正在积极抢修 而期间间歇性的断开连接和排队则一直没有停止过 PS4 Xb
  • elementUI el-button 点击后样式自动恢复的方法

    问题描述 elementUI 中的按钮 点击后会有focus样式 且只有点击其他地方后 按钮才会失焦 样式才会恢复到点击之前的样式 例如主要按钮是亮蓝色 点击后是暗蓝色 点击其他地方才会恢复亮蓝色 我希望将鼠标放在按钮上时会改变样式 但是点
  • 三伏天是几月几号2023-三伏天需要注意什么

    三伏天是几月几号2023 2023年三伏天具体时间如下 初伏 2023年7月11日 2023年7月20日 共10天 中伏 2023年7月21日 2023年8月9日 共20天 末伏 2023年8月10日 2023年8月19日 共10天 三伏天
  • 奇偶数分离

    描述 有一个整型偶数n 2 lt n lt 10000 你要做的是 先把1到n中的所有奇数从小到大输出 再把所有的偶数从小到大输出 输入 第一行有一个整数i 2 lt i lt 30 表示有 i 组测试数据 每组有一个整型偶数n 输出 第一
  • JavaWeb:Servlet

    Servlet 文章目录 Servlet Servlet介绍 Web服务器 Tomcat Servlet接口 Servlet接口介绍 类图 Servlet接口源码 GenericServlet抽象类 HttpServlet抽象类 Servl
  • Python 报错:can only concatenate str (not “int”)to str

    x 1 print x x 使用 连接时 只能将字符串与字符串连接 不能和int型连接 需要将x强制转换成str型 x 1 print x str x
  • 如何配置H3C S5500每个VLAN配一个DHCP池

    给Vlan定义地址并配置其工作在服务器模式 interface Vlan interface12 ip address 172 18 12 1 255 255 255 0 dhcp select server global pool 给Vl
  • 计算机浮点数规格化表示

    说明 在IEEE标准中 浮点数在内存中的表示是将特定长度的连续字节的所有二进制位按特定长度划分为符号域 指数域和尾数域三个连续域 float float类型在内存中占用的位数为 1 8 23 32bits double 1 11 52 64
  • Android 关于NestedScrollView与RecyclerView的滑动冲突的最终解决方案

    最近做项目的时候发现一个小问题 当NestedScrollView嵌套RecyclerView的时候回出现种种不适 网上给出的解决方案 比如去除RecyclerView的滑动事件 修改NestedScrollView或者RecyclerVi
  • TensorFlow 框架(contrib) - TensorFlow图形编辑器(contrib)

    TensorFlow 框架 contrib TensorFlow 框架工具 tf contrib framework assert same float dtype tf contrib framework assert scalar tf
  • pandas某一列中每一行拆分成多行的方法

    在处理数据过程中 常会遇到将一条数据拆分成多条 比如一个人的地址信息中 可能有多条地址 既有家庭地址也有工作地址 还有电话信息等等类似的情况 实际使用数据的时候又需要分开处理 这个时候就需要将这一条数据进行拆分成多条 以方便使用 在pand
  • Mybatis-Plus中update更新操作用法

    目录 一 前言 二 update 1 关于修改的4个条件构造器 2 UpdateWrapper 用法示例 3 LambdaUpdateWrapper 用法示例 4 UpdateChainWrapper 用法示例 5 LambdaUpdate