get占位符传多个参数_mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法...

useActualParamName配置

useActualParamName

允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,你的工程必须采用Java 8编译,并且加上-parameters选项。(从3.4.1开始)

true | false

true

mybatis的全局配置useActualParamName决定了mapper中参数的写法,默认为true

代码展示:

@Test

public void findUserById() {

SqlSession sqlSession = getSessionFactory().openSession();

UserDao userMapper = sqlSession.getMapper(UserDao.class);

User user = userMapper.findUserById(1,"lpf");

Assert.assertNotNull("没找到数据", user);

}

public interface UserDao {

User findUserById (int id,String name);

}

1.如果useActualParamName设置为true时

传递参数需要使用

#{arg0}-#{argn}或者#{param1}-#{paramn}

比如:

select * from m_user where id = #{arg0} and name =#{arg1}

或者

select * from m_user where id = #{param1} and name =#{param2}

2.如果useActualParamName设置为false时

传递参数需要使用

#{0}-#{n}或者#{param1}-#{paramn}

select * from m_user where id = #{0} and name =#{1}

或者

select * from m_user where id = #{param1} and name =#{param2}

下面是多个参数的错误写法直接写参数名(如果方法只有一个参数是可以用参数名代替的,其实如果只有一个参数,任何名称都是可以的)

select * from m_user where id = #{id} and name =#{name}

源码解读(3.4.6):

在mapper的代理对象调用方法时,最终会是MapperMethod对象的execute方法。如下:

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

try {

// 如果目标方法是Object类继承来的,直接调用目标方法

if (Object.class.equals(method.getDeclaringClass())) {

return method.invoke(this, args);

} else if (isDefaultMethod(method)) {

return invokeDefaultMethod(proxy, method, args);

}

} catch (Throwable t) {

throw ExceptionUtil.unwrapThrowable(t);

}

// 从缓存中获取MapperMethod 对象,如果没有就创建新的并添加

final MapperMethod mapperMethod = cachedMapperMethod(method);

// 执行sql 语句

return mapperMethod.execute(sqlSession, args);

}

MapperMethod的一个内部类MethodSignature封装了Mapper接口中定义的方法的相关信息。而MethodSignature的一个属性ParamNameResolver对象处理接口中定义的方法的参数列表。

ParamNameResolver 的属性

// 记录参数在参数列表中的位置索引与参数名称之间的对应关系

private final SortedMap names;

// 记录对应的方法参数是否使用了@Param注解

private boolean hasParamAnnotation;

ParamNameResolver的构造函数

/**

* 通过反射读取方法中的信息,并初始化上面两个字段

* @param config

* @param method

*/

public ParamNameResolver(Configuration config, Method method) {

// 获取参数列表中每个参数的类型

final Class>[] paramTypes = method.getParameterTypes();

// 获取参数列表上的注解 @Param

final Annotation[][] paramAnnotations = method.getParameterAnnotations();

// 该集合用于记录参数索引与参数名称的对应关系

final SortedMap map = new TreeMap();

int paramCount = paramAnnotations.length;

// 遍历所有参数

for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) {

if (isSpecialParameter(paramTypes[paramIndex])) {

// 如果参数是RowBounds类型或者ResultHandler类型,则跳过该参数

continue;

}

String name = null;

// 遍历该参数上的注解集合

for (Annotation annotation : paramAnnotations[paramIndex]) {

if (annotation instanceof Param) {

// 获取@Param注解指定的参数名称

hasParamAnnotation = true;

name = ((Param) annotation).value();

break;

}

}

// 没有@Param注解的话 执行下面逻辑

if (name == null) {

// useActualParamName==true时 即name = arg0 ...

if (config.isUseActualParamName()) {

name = getActualParamName(method, paramIndex);

}

if (name == null) {//useActualParamName == false是 即 name="0" ...

// use the parameter index as the name ("0", "1", ...)

// 使用参数的索引作为其名称

name = String.valueOf(map.size());

}

}

map.put(paramIndex, name);

}

names = Collections.unmodifiableSortedMap(map);

}

names集合主要是在ParamNameResolver.getNamedParams方法中使用

/**

*

* @param args 用户传入的参数值列表

* @return

*/

public Object getNamedParams(Object[] args) {

final int paramCount = names.size();

if (args == null || paramCount == 0) {

return null;

} else if (!hasParamAnnotation && paramCount == 1) {// 未使用@Param注解且参数列表只有一个

return args[names.firstKey()];//即args[0] 参数的值

} else {

// 下面是为参数创建param+索引的格式作为默认参数名称 如:param1 下标从1开始

final Map param = new ParamMap();

int i = 0;

for (Map.Entry entry : names.entrySet()) {

param.put(entry.getValue(), args[entry.getKey()]);

// add generic param names (param1, param2, ...)

final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);

// ensure not to overwrite parameter named with @Param

if (!names.containsValue(genericParamName)) {

param.put(genericParamName, args[entry.getKey()]);

}

i++;

}

return param;

}

}

总结:

1.如果接口方法有一个或多个参数,并且使用了@Param注解,sql语句中的参数用注解的value值,

2.如果接口方法的参数只有一个,并且没有使用@Parma注解sql语句直接使用任何名称均可。

3.如果接口的方法有多个参数,并且没有使用@Parma注解,sql语句使用param1...paramn是不会错的。

4.sql语句中的参数占位符名称和接口方法的参数名称没有什么关系。

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

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

相关文章

HTTP协议简介_请求消息/请求数据包/请求报文_响应消息/响应数据包/响应报文

文章目录HTTP 介绍请求数据包/请求消息/请求报文请求数据包解析响应数据包/响应消息/响应报文HTTP 介绍 概念&#xff1a;Hyper Text Transfer Protocol 超文本传输协议 传输协议&#xff1a;定义了客户端和服务器端通信时发送数据的格式 特点: 1.基于TCP/IP的高级协议 2.默认…

Linux的open函数的调用过程,Linux 中open系统调用实现原理

用户空间的函数在内核里面的入口函数是sys_open通过grep open /usr/include/asm/unistd_64.h查找到的#define __NR_open2__SYSCALL(__NR_open, sys_open)观察unistd_64.h&#xff0c;我们可以猜测用户空间open函数最终调用的系统调用号是2来发起的sys_open系统调用(毕竟glibc一…

java登录界面命令_Java命令行界面(第29部分):自己动手

java登录界面命令本系列有关从Java解析命令行参数的系列简要介绍了28个开源库&#xff0c;这些库可用于处理Java代码中的命令行参数。 即使涵盖了这28个库&#xff0c;该系列也没有涵盖用于解析Java命令行选项的所有可用开源库。 例如&#xff0c;本系列文章未涉及docopt &…

log nginx 客户端请求大小_nginx

博主会将与Nginx有关的知识点总结到"nginx短篇系列"文章中&#xff0c;如果你对nginx不是特别了解&#xff0c;请按照顺序阅读"nginx短篇系列"&#xff0c;以便站在前文的基础上理解新的知识点。当我们访问nginx服务时&#xff0c;nginx会记录日志&#xf…

Linux 下如何查询 tomcat 的安装目录

在命令终端输入如下命令&#xff1a; [roothtlwk0001host ~]# sudo find / -name *tomcat*

rxjava 背压_背压加载文件– RxJava常见问题解答

rxjava 背压事实证明&#xff0c;将文件作为流进行处理非常有效且方便。 许多人似乎忘记了&#xff0c;自Java 8&#xff08;3年以上&#xff01;&#xff09;以来&#xff0c;我们可以很容易地将任何文件变成一行代码&#xff1a; String filePath "foobar.txt"; …

linux 卸载nfs device is busy,umount.nfs: device is busy解决办法

&period;NET Core全新的配置管理&lbrack;共9篇&rsqb;提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两 ...Windows无法安装到G…

php 时间加法函数_php 时间加减

date_default_timezone_set(PRC); //默认时区echo"今天:",date("Y-m-d",time()),"";echo "今天:",date("Y-m-d",strtotime("18 june2008")),"";echo "昨天:",date("Y-m-d",strtoti…

如何用xapmm测试php_如何在Xampp中运行PHP程序?

成为经过认证的专业PHP是最流行的web后端编程语言。PHP代码将作为web服务器模块或命令行界面运行。要运行PHP for the web&#xff0c;您需要安装像Apache这样的web服务器&#xff0c;还需要像MyS成为经过认证的专业PHP是最流行的web后端编程语言。PHP代码将作为web服务器模块或…

中文标点符号大全

文章目录常见的中文标点符号标点符号的位置中文的标点符号包括句号&#xff0c;逗号&#xff0c;感叹号&#xff0c;问号&#xff0c;引号&#xff0c;冒号等等&#xff0c;接下来分享常见的中文标点符号名称。常见的中文标点符号 句号 。 用于句子末尾&#xff0c;表示陈述语气…

linux 查看链接最终目标,linux学习笔记7-链接

hard link and soft link硬链接&#xff1a;一个文件两个不同的进入&#xff0c;相当于一个教室两个门&#xff0c;从哪个门进都进到同一个教室硬链接特征&#xff1a;1、拥有相同的 i节点 和相同的存储block快&#xff0c;可以看做是同一个文件2、可通过i节点识别&#xff0c;…

apache.camel_Apache Camel 2.20发布–新增功能

apache.camelApache Camel 2.20已于今天发布&#xff0c;并且像往常一样&#xff0c;我受命撰写有关此出色新版本及其亮点的博客。 该版本具有以下重点。 1&#xff09;Java 9技术预览支持 我们已经开始支持Java 9的工作&#xff0c;此版本称为技术预览。 源代码在Java 9上…

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法

操作无法完成(错误 0x000006ba)&#xff0c;Windows 11 PDF打印机无法使用解决办法 解决方式一 先重启一次电脑&#xff0c;看看是否可以解决问题。 解决方式二 重新启动 Printer Spooler 服务

java 头像 微信群_java怎么生成带用户微信头像的图片,并把这张图片发送给用户。...

展开全部这个是要一个图片中嵌套另外一张图片你可以62616964757a686964616fe59b9ee7ad9431333431336163试试下面这段代码import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOE…

MyEclipse 的 TCP/IP Monitor 的使用

文章目录步骤 1&#xff1a;新建 web02 工程步骤 2&#xff1a;在 WebRoot 下创建 add_employee.html步骤 3&#xff1a;部署项目步骤 4&#xff1a;启动服务器步骤 5&#xff1a;打开 TCP/IP Monitor步骤 6&#xff1a;增加新的监视器步骤 7&#xff1a;启动监视器步骤 8&…

ubuntu linux mac地址,Ubuntu下修改mac地址

说明&#xff0c;本文翻译自man macchanger&#xff0c;若遇到不能理解的地方请参考man文档概述macchanger是linux下用于查看和修改网络接口mac地址的工具使用方法macchanger [options] device选项-e, --ending不要修改vendor-a, --another设置为一个同类型的MAC&#xff0c;同…

openwrt固定速率_固定速率与固定延迟– RxJava常见问题解答

openwrt固定速率如果您使用的是纯Java&#xff0c;从版本5开始&#xff0c;我们有一个方便的调度程序类&#xff0c;该类允许以固定速率或固定延迟运行任务&#xff1a; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService;Schedu…

如何处理表单中的中文(中文编码/解码问题)

浏览器会如何对表单中的数据进行编码? 当表单采用 post 方式提交时&#xff0c;浏览器会按照打开该表单所在的页面的编码来对表单中的数据进行编码。 在 html 文件当中设置字符编码集&#xff08;即字符编码格式&#xff09; <meta http-equiv"content-type" …

linux 进城 管道丢数据,linux – 使用命名管道与bash – 数据丢失的问题

有人在线搜索,发现简单的“教程”使用命名管道.但是,当我做任何后台工作时,我似乎失去了大量的数据.[[编辑&#xff1a;找到一个更简单的解决方案,看到回复帖子.所以我提出的问题现在是学术性的 – 万一有人想要一个工作服务器]]使用Ubuntu 10.04与Linux 2.6.32-25-generic#45-…

wso2 安装_WSO2注册表安装简介

wso2 安装这篇文章基于有关注册表安装及其工作原理等常见问题。以下是人们提出的主要问题&#xff1a; 1&#xff09;。 安装如何工作&#xff1f; 2&#xff09;。 Config Registry和Governance Registry有什么区别&#xff1f; 3&#xff09;。 可以将H2以外的数据库用于本…