启用 -parameters 编译选项简化 mybatis @Param 注解重复问题

news2024/11/18 5:52:05

在使用 mybatis 查询的时候, 只需要定义一个查询接口, mybatis 会为我们注入注解实现或是 xml 实现. 但当我们需要传递参数时, 通常需要 @Param 来定义一个名称, 但经常的, 我们也不难发现, 这个名称与参数名称通常是一样的:

User findUser(@Param("username") String username, @Param("password") String password);

如上, usernamepassword 都重复了.

而之所以要这么使用, 是因为 xml 中 ${xxx} 所引用的名称就来自于 @Param 里定义的值:

<select id="findUser" resultType="net.xiaogd.demo.mybatis.entity.User">
    select * from user where username = #{username} and password = #{password}
</select>

这就带来一个重复的问题, 可否简化这个定义, 使得无需重复录入名称, 甚至完全地去掉呢? 比如像下面这样:

User findUser(String username, String password);

答案是可以的, 下面就来说下怎么去做到这一点.

前置条件

  1. 首先项目需要使用 jdk8 或以上;
  2. 其次, 需要增加一个编译时的选项 -parameters.

    也即是这样去编译: javac -parameters

通常, 如果没有加上这个选项, 编译后的方法参数签名会变成这样:

User findUser(String arg0, String arg1);

实际的名称会变成如上所示的 arg0, arg1 这样没有太多含义的, 毕竟解析器并不关心实际的名称, 有含义的名称只是给人阅读的而已.

下面就说说怎么去引入这个编译选项以使得可以保留有意义的参数名, 包括 maven 中的设置及 IDE 中的设置(包括 Intellij IDEA 和 Eclipse)

maven 编译时的选项

对于 maven, 可以在编译插件 maven-compiler-plugin 中使用 compilerArgs 增加参数来实现:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <compilerArgs>
            <arg>-parameters</arg>
        </compilerArgs>
    </configuration>
</plugin>

注: 对于较新的 maven 版本(>= 3.6.2), 也可以直接使用 parameters 配置项:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <parameters>true</parameters>
    </configuration>
</plugin>

参见: https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#parameters

另注: 如果你使用 spring boot 2.0 及以后的版本并依赖了 spring-boot-starter-parent, 默认情况下已经启用了这一选项:

参见这里的说明: https://stackoverflow.com/questions/31845676/how-to-compile-spring-boot-applications-with-java-8-parameter-flag/49316086#49316086

你可以通过查看最终生效的 Effective POM 来确认这一点, 对于 Eclipse, 在打开的 pom.xml 文件下方选项卡中选择"Effective POM", 然后搜索 maven-compiler-plugin 关键字可以找到相关配置:
maven-effective-pom-compiler-parameters-true-eclipse

对于 Intellij IDEA, 在 maven 窗口中 右键–Show Effective POM:
maven-effective-pom-compiler-parameters-true-intellij-idea

或者通过实际是否正常运行来确认这一点, 如果不是很确定, 当然你可以如上所述在自己的 pom.xml 文件中显式地配置上它.

IDE 编译时保留参数名称

说完了 maven 中的配置, 下面再说说在 IDE 中的类似设置.

注: 通常, 如果 maven 中设置了相应选项, 在项目作为 maven 项目导入并构建时, 这些额外的设置也会生效, 无需额外再作设置. 但考虑到 IDE 的版本及可能存在 bug 等各类原因, 如果在 IDE 中运行不正常, 那么则需要额外检查及配置.

Intellij IDEA 中的设置 -parameters

对于 IDEA, 在下述位置 Settings > Build, Execution, Deployment > Compiler > Java Compiler > Additional command line parameters(额外的命令行参数) 的输入框中, 输入-parameters:

Intellij-idea-compiler-additional-command-line-parameters-javac-parameters

参考: https://stackoverflow.com/questions/39217830/how-to-use-parameters-javac-option-in-intellij

如前所述, 如果没有设置也运行正常, 则不必去设置.

Eclipse 中的设置 -parameters

对于 Eclipse, 则是检查 Store information about method parameters 选项, 看看是否已经是勾选上, 如果没有, 则把它勾上:

eclipse-java-compiler-store-information-about-method-parameters

如前所述, 如果没有勾选也运行正常或者默认已经勾选上了, 则不必再去勾选.

另注: 因为以上设置涉及编译, 所以通常需要重新编译项目(如果设置后没有自动触发 rebuild), 如果还不生效, 甚至可能需要重启 IDE.

没有配置成功时的异常

如果没有加入 -parameters 选项或因其它原因没有启用成功, 则去掉 @Param 注解后可能会遇到下述异常:

exception:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘username’ not found. Available parameters are [arg1, arg0, param1, param2]

完整的异常如下:

exception: 
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy78.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy86.findUserByUsernameAndPassword(Unknown Source)
	at net.xiaogd.demo.mybatis.dao.user.UserDaoTest.testXmlDao(UserDaoTest.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
	at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
	at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:202)
	at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:45)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
	at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:219)
	at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:146)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 38 more

那么, 按照其提示, 可以将相应的 xml 语句调整为:

<select id="findUser" resultType="net.xiaogd.demo.mybatis.entity.User">
    select * from user where username = #{arg0} and password = #{arg1}
</select>

或者是使用 param1, param2 这样的名称(注意, 与 arg 从 0 编号不同, 这里是从 1 开始编号)

<select id="findUser" resultType="net.xiaogd.demo.mybatis.entity.User">
    select * from user where username = #{param1} and password = #{param2}
</select>

自然, 使用这些没有太多含义的编号参数名, 代码的可读性就差了很多, 参数是否正确对上了也不容易看出来.

mybatis 版本及 useActualParamName(use-actual-param-name) 的问题

最后, 还有一个配置 useActualParamName (使用实际的参数名称) 可能导致一些异常, 这点与 mybatis 不同版本的缺省配置不同有关, 也与项目本身是否显式配置了这一参数值有关.

在没有启用 -parameters 以保留方法参数名并且没有用 @Param 设置一个有效的名称时, 有时你可能会发现使用 arg0 也还是提示找不到参数:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘arg0’ not found. Available parameters are [0, 1, param1, param2]

完整的异常如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [0, 1, param1, param2]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy78.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
	at com.sun.proxy.$Proxy86.findUserByUsernameAndPassword(Unknown Source)
	at net.xiaogd.demo.mybatis.dao.user.UserDaoTest.testXmlDao(UserDaoTest.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
	at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [0, 1, param1, param2]
	at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:202)
	at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:45)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
	at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:219)
	at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:146)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 38 more

而这是由于 mybatis 版本及 useActualParamName(use-actual-param-name) 选项设置的原因.

在早期的版本中(< 3.4.1), useActualParamName 选项的默认值是 false, 而之后的版本(>= 3.4.1), 这个选项的默认值则是 true.

只有设置为 true, 才能利用 -parameters 配置带来的好处.

或者就是项目本身配置了其它不同于缺省的值, 如果使用了 spring boot 项目, 可以检查如下选项:

mybatis.configuration.use-actual-param-name=false

或是在 xml 配置文件中设置:

<setting name="useActualParamName" value="false" />

如果设置了 false, 那么就要写成 #{0}, #{1} 这样:

<select id="findUser" resultType="net.xiaogd.demo.mybatis.entity.User">
    select * from user where username = #{0} and password = #{1}
</select>

如果以前有大量这样的写法, 而你为了兼容它们不想去调整, 那你就无法利用 -parameters 配置带来的好处.

无论是使用 {0}, {1}, 还是使用 {arg0}, {arg1}, 可读性都不是很好, 而且在后续如果需要增加参数, 还容易引入错误, 因此并不推荐这样的写法.

关于启用 -parameters 编译选项简化 mybatis @Param 注解重复问题就介绍到这里.

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

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

相关文章

Docker使用Volumes做数据持久化

场景&#xff1a;docker 安装的 Pgsql 每当电脑重启docker重启 会发现 数据库都没了数据也没了 解决办法&#xff1a;使用docker volumes 做挂载 以PGSQL为例子&#xff0c;理论其他数据库或者项目需要持久化数据 应该都可以 1.创建Volumes 名字自己可以随便取。 2.拉去镜像…

开源预训练框架 MMPRETRAIN官方文档(概览、环境安装与验证、基础用户指南)

MMPretrain是全新升级的开源预训练框架。它已着手提供多个强大的预训练骨干网并支持不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和MMSelfSup&#xff0c;并开发了许多令人兴奋的新功能。目前&#xff0c;预训练阶段对于视觉识别至关重要。凭借丰富而强…

[SSM]MyBatis查询语句与动态SQL

目录 十、MyBatis查询语句专题 10.1返回Car 10.2返回List 10.3返回Map 10.4返回List 10.5返回Map,map> 10.6resultMap结果映射 使用resultMap进行结果映射 是否开启驼峰命名自动映射 10.7返回总记录条数 十一、动态SQL 11.1 if标签 11.2 where标签 11.3 trim标…

Oracle表空间和用户

Oracle表空间和用户 前言 1、创建表空间 2、 删除表空间 3、创建用户 4、用户赋权限 5、Oracle三个重要的角色 1、创建表空间 ORACLE 数据库的逻辑单元。 一个表空间可以与多个数据文件&#xff08;物理结构&#xff09;关联 一个数据库下可以建立多个表空间&#xff0c;一个表…

探秘制造业数智化:揭开低代码开发平台的新篇章

前言 随着数智时代的到来&#xff0c;制造业面临着前所未有的转型机遇。在这个信息爆炸的时代&#xff0c;如何有效运用科技和数据资源&#xff0c;成为了制造业企业的当务之急。而低代码开发平台&#xff0c;如JNPF快速开发平台&#xff0c;正是这个转型过程中不可或缺的利器。…

【编程语言 · C语言 · 结构体】

【编程语言 C语言 结构体】https://mp.weixin.qq.com/s/pWI712NxhPJi37eWrE9ofw

【产生初始解利器】基于蒙特卡洛模拟产生满足固定需求和固定供给的随机供给矩阵

如何生成一个总和是定值的随机矩阵 震惊&#xff0c;如果做一个约束比较强的模型&#xff0c;解的矩阵需要满足很多等式约束&#xff0c;而且都是整数&#xff0c;随机产生初始解很困难&#xff0c;该怎么办&#xff1f; 震惊&#xff0c;如果做一个约束比较强的模型&#xff0…

多元回归预测 | Matlab粒子群算法(PSO)优化极限梯度提升树XGBoost回归预测,PSO-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 粒子群算法(PSO)优化极限梯度提升树XGBoost回归预测,PSO-XGBoost回归预测模型,多变量输入模型,多变量输入模型,matlab代码回归预测,多变量输入模型,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高…

多元回归预测 | Matlab麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型,多变量输入模型,matlab代码回归预测,多

windows设置右键一键打开文件的配置

在安装软件时一般通过msi或者exe安装&#xff0c;这是一般会有提示绑定到鼠标右键&#xff0c;如果没有勾选则安装后就无法通过右键打开&#xff0c;这是需要把文件拖到快捷方式上面才可以使用该软件打开。 另外如何下载的是zip的压缩包源码格式根本没有设置的选项&#xff0c…

2.3 Web应用 -- 3. HTTP 消息格式

2.3 Web应用 -- 3. HTTP 消息格式 HTTP请求消息HTTP响应消息 HTTP请求消息 HTTP协议有两类消息 请求消息(request)响应消息(response) 请求消息 ASCII&#xff1a;人直接可读 HTTP请求消息的通用格式 上传输入的方法 POST方法 网页经常需要填写表格(form)在请求消息的消息体(…

【CMU15-445 FALL 2022】Project #1 - Extendable Hashing

Reference & Thank & Related CMU15445-project1-可扩展哈希表数据库——可拓展哈希&#xff08;Extendable Hashing&#xff09;【CMU15-445数据库】bustub Project #1&#xff1a;Buffer PoolExtendible Hashing (Dynamic approach to DBMS) Extendable Hashing co…

链表问题——长整数加法运算题解【双向链表】

长整数加法运算 问题描述 假设2个任意长度的整数x、y分别用链表A和B存储&#xff0c;现要求设计一个算法&#xff0c;实现xy。计算结果存储在链表C中。 说明&#xff1a; 链表A、B、C可以是单向链表或双向链表&#xff0c;但由于A和B输出时需要从头至尾遍历&#xff0c;而做…

Git提交项目到服务器上

目录 第一步&#xff1a;git status第二步&#xff1a;git pull第三步&#xff1a;git status第四步&#xff1a;git add第五步&#xff1a;git commit第六步&#xff1a;git push 第一步&#xff1a;git status git status 看一下你这个项目里&#xff0c;修改过什么公版的东西…

性能优化(一)JMeter使用

简介&#xff1a; jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简 单。因为 jmeter 是 java 开发的&#xff0c;所以运行的时候必须…

Django_模板(四)

目录 一、模板 创建模板文件 定义模板 视图调用模板 简写视图调用的模板 二、去除模板中的硬编码 URL 三、为 URL 名称添加命名空间 四、生成模板渲染后的静态文件 源码等资料获取方法 一、模板 如何向请求者返回一个漂亮的页面呢&#xff1f; 肯定需要用到html、css…

多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于鲸鱼优化深度置信网络(WOA-DBN)的分类预测,多输入单输出模型,多特征输入模型,WOA-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语…

Unity3d的智力拼图小游戏

Unity3d的智力拼图小游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88015674

关于async/await

async/await是什么&#xff1f; 简单来说async/await是Promise的语法糖&#xff0c;async是异步的意思&#xff0c;await是等待的意思。async function 声明一个函数里面可能有异步代码需要执行&#xff0c;await则可以认为是等待一个异步方法执行完成。 async/await的用法 …

创建台虚拟机并安装上window10系统(NETBASE 第一课)

虚拟机&#xff08;Virtual Machine&#xff09;是一种基于软件的模拟技术&#xff0c;它可以将一台物理计算机模拟成多个虚拟计算机运行不同的操作系统和应用程序&#xff0c;从而实现资源的虚拟化和隔离。在虚拟机中&#xff0c;每个虚拟计算机都拥有自己的独立的操作系统和应…