-
Mybatis 传递参数类型为List的取值问题
2020-03-22 19:54:13Mybatis 传递参数类型为List的取值问题 问题描述: 参数传递为List时: 当传递一个 List 实例或者数组作为参数对象传给 Mybatis。此时,Mybatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list...Mybatis 传递参数类型为List的取值问题
问题描述:
参数传递为List时:
当传递一个 List 实例或者数组作为参数对象传给 Mybatis。此时,Mybatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。所以,当我们传递的是一个List集合时,mybatis会自动把我们的list集合包装成以list为Key值的map。
DAO 层:
List<User> selectUserByIDs( List IDs);
XML文件:
<select id="selectUserByIDs" parameterType="java.util.List" resultType="user"> select * from user <where> <if test="IDs != null and IDs.size() >0"> <foreach collection="IDs" open=" and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
报错信息:
org.apache.ibatis.binding.BindingException: Parameter ‘IDs’ not found. Available parameters are [collection, list]
解决方法:
方法一:将我们的XML中collection属性值直接设置为list
DAO 层:
List<User> selectUserByIDs( List IDs);
XML文件:
<select id="selectUserByIDs" parameterType="java.util.List" resultType="user"> select * from user <where> <if test="list != null and list.size() >0"> <foreach collection="list" open=" and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
方法二: 利用注解@Param指定我们的入参名称
DAO层:
List<User> selectUserByIDs(@Param("IDs") List IDs);
XML文件:
<select id="selectUserByIDs" parameterType="java.util.List" resultType="user"> select * from user <where> <if test="IDs != null and IDs.size() >0"> <foreach collection="IDs" open=" and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
-
模板参数类型
2018-09-24 22:26:36文章目录模板参数类型整数模板参数函数指针模板参数指针及引用模板参数成员函数指针模板参数模板型模板参数 这是《深入实践C++模板编程》第三章“模板参数类型详解”的读书笔记。 模板参数类型 模板参数通常表示类型...
这是《深入实践C++模板编程》第三章“模板参数类型详解”的读书笔记。模板参数类型
模板参数通常表示类型,表示类型的模板参数称为类型模板参数(type template parameter);此外还有非类型模板参数(non-type template parameter),非类型模板参数包含以下四种类型:
- 整数及枚举类型
- 指针(对象指针或函数指针)
- 引用(对象引用或函数引用)
- 指向类对象成员函数的指针
模板的参数还可以是一个模板,叫做模板模板参数(template template parameter)。这些类型的模板参数都可以同时出现在模板参数列表中。
整数模板参数
非类型模板参数的作用,是为函数模板或类模板预定义一些常量。这些常量的值在编译期已知,所有模板实例中,都有相同的值。例如一个固定长度的数据类
#include <iostream> #include <stdexcept> template<typename T, unsigned size> class array { T elems[size]; public: T& operator[] (unsigned i) throw (std::out_of_range) { if (i >= size) { throw std::out_of_range("array access out of range."); } else return elems[i]; } }; int main(int argc, char* argv[]) { array<char, 20> array0; array<char, 10> array1; array0[10] = 'b'; try { array1[10] = 'b'; } catch (std::out_of_range& e) { std::cerr << "Access out of range." << std::endl; } return 0; }
函数指针模板参数
函数指针通常用于实现回调。函数指针模板参数也可以用于实现回调,只不过普通函数指针的回调函数可以在运行期确定,函数指针作为模板参数时,要在编译期确定。
#include <iostream> template<typename T, void (*f) (T &v)> void foreach(T array[], unsigned size) { for (unsigned i = 0; i < size; ++i) f(array[i]); } template<typename T> void inc(T &v) { ++v; } template<typename T> void dec(T &v) { --v; } template<typename T> void print(T& v) { std::cout<< ' ' << v; } int main(int argc, char* argv[]) { int array[] = {1, 2, 3, 4, 5, 6, 7, 8}; foreach<int, print<int>>(array, 8); std::cout << std::endl; foreach<int, inc<int>>(array, 8); foreach<int, print<int>>(array, 8); std::cout << std::endl; foreach<int, dec<int>>(array, 8); foreach<int, print<int>>(array, 8); std::cout << std::endl; return 0; }
指针及引用模板参数
指针和引用作为模板参数时,相当于为函数或对象声明一个常量指针或引用。因为模板参数是在编译期确定的,所以只有全局变量/外部变量(extern修饰)/类的静态变量的指针或引用才可以作为模板参数。
#include <iostream> template<int *p> struct wrapper { int get() { return *p; } void set(int v) { *p = v; } }; template<int &p> struct wrapper2 { int get() { return p; } void set(int v) { p = v; } }; int main(int argc, char* argv[]) { int global_variable = 0; wrapper<&global_variable> gwrapper; gwrapper.set(1); std:: cout << gwrapper.get() << std::endl; wrapper2<global_variable> gwrapper2; gwrapper2.set(2); std::cout<< gwrapper2.get() << std::endl; return 0; }
成员函数指针模板参数
成员函数指针作为函数模板参数时,和普通函数指针类型,只是声明方法看上去难理解。例如类
some_class
有多个函数,参数都为int
,返回值也为int
,那么指向这些成员函数的指针可以声明为int (some_class:: *mfp)(int);
可以用
typedef
定义别名,精简一下typedef int (some_class:* some_class_mfp)(int); some_class_mfp mfp;
使用成员函数指针调用函数时,要用到操作符
*.
和->
。这两个操作符优先级比较低,通常需要用括号括起来。例如:some_class a; std::cout << (a.*mfp)(0) << std::endl; some_class *p(&a); std::cout << (p->*mfp)(0) << std::endl;
下面示例为一个
some_class
类包含3个成员函数add_by
,sub_by
,mul_by
,分别对成员变量value
进行对应操作。#include <iostream> class some_value { int value; public: some_value(int _value): value(_value) {} int add_by(int op) { return value += op;} int sub_by(int op) { return value -= op;} int mul_by(int op) { return value *= op;} }; int main(int argc, char* argv[]) { some_value v0(0); std::cout<< call<&some_value::add_by>(v0, 1) << std::endl; std::cout<< call<&some_value::sub_by>(v0, 2) << std::endl; std::cout<< call<&some_value::mul_by>(v0, 3) << std::endl; return 0; }
需要注意的是,在取成员函数指针是,取地址符
&
不能省略。模板型模板参数
模板型模板参数只是,模板的参数是另外一个模板。声明形式类似:
template<typename T, template<typename TT0, typename TT1> class A> struct Foo {A<T, T> bar;};
上面声明中的第二个模板参数A是一个类模板。注意声明中要用到关键字class。只有类模板可以作为模板参数。
在函数指针模板参数的例子中,有
foreach<int, print<int>> (array, 8); foreach<int, inc<int>> (array, 8); foreach<int, dec<int>> (array, 8);
上面都将
int
重复两遍有点冗余。三个函数print
,inc
,dec
都是函数模板。可以用带参数的模板传入,在foreach
内进行实例化即可。只是需要将三个函数模板修改为类模板。#include <iostream> template<template<typename TT> class Func, typename T> void foreach(T array[], unsigned size) { Func<T> func; for (unsigned i = 0; i < size; ++i) func(array[i]); } template<typename T> struct inc { void operator() (T &v) const {++v;} }; template<typename T> struct dec { void operator() (T &v) const {--v;} }; template<typename T> struct print { void operator() (T &v) const { std::cout << " " << v;} }; int main(int argc, char* argv[]) { int array[] = {1, 2, 3, 4, 5, 6, 7, 8}; foreach<print>(array, 8); std::cout << std::endl; foreach<inc>(array, 8); foreach<print>(array, 8); std::cout << std::endl; foreach<dec>(array, 8); foreach<print>(array, 8); std::cout << std::endl; return 0; }
-
HTTP 参数类型简介
2019-07-25 11:17:34HTTP 参数类型简介请求头参数 (head)路径参数 (path)查询参数 (query)请求体参数 (body) http协议 传参类型 根据参数所在协议位置可分为 四大类 请求头参数 (head) 请求头参数顾名思义,是存放在请求头...http协议 传参类型 根据参数所在协议位置可分为 四大类
请求头参数 (head)
请求头参数顾名思义,是存放在请求头中发送给服务器的参数,服务器通过解析请求头获取参数内容。通常会存放本次请求的基本设置,以帮助服务器理解并解析本次请求的body体。
参数形式如:Accept-Language : zh-CN,zh;q=0.8,zh-TW;q=0.5,en-US;q=0.3,en;q=0.2
其中
Accept-Language
为参数名称:
号后面紧跟请求的值。ps:如上则表示本次请求的语言为中文和英文。 q用来标识语种权重 值在 0-1之间
服务器根据会这个请求头选择返回的语言其他http协议中规定的参数及含义请参考 http请求头规范
当然我们也可以自定义请求头内容,参数名称和参数意义必须事先和服务器约定好否则没服务器无法理解你传输请求头的意义会忽略自定义参数。
其中 jQuery 添加请求头方式如下:$.ajax({ headers: { 'Access-Token':$.cookie('access_token') } })
ps:
cookies
是存放在每一条请求中的请求头上的特殊存储体 由于每次请求都会将全部cookies
发送给服务器 所以不建议在cookies
存储大量数据 ,也因此产生了session
技术,不过这是题外话了。路径参数 (path)
路径参数顾名思义,本次请求的资源路径,紧跟请求域名的后面,服务器通过解析路径参数获取资源位置。路径参数是用
/
分隔的一系列字符串,其意义在于对服务器资源进行统一定位,如:http://www.madmk.com/office/zhangsan
其中
/office/zhangsan
便是路径参数,其含义可解释为 找办公室里的张三,大多数情况下路径参数会代表服务器真实的文件路径。REST API的兴起赋予了路径参数更为广阔的含义,有兴趣的朋友可以找一下有关 REST API 设计的文章。
ps:其中参数如有中文 或特殊符号如
/
,:
,?
,#
,+
,=
等需要进行转义处理。查询参数 (query)
查询参数,是房放在请求地址后面的参数同样以键值对进行标识形如:
userId=1
其中
userId
表示参数名称1
表示参数的值。参数名称为可重复的。
请求地址与参数之间用?
进行分隔 多个参数之间用&
进行分隔,完整请求如下:http://www.madmk.com/a/b/c?userId=1&userId=1&age=18&sex=男
大多数情况下使用 查询参数 进行传值的是
GET
请求,所有用表单提交的GET
请求都会使用 查询参数 进行传参。ps:其中参数如有中文 或特殊符号如
/
,:
,?
,#
,+
,=
等需要进行转义处理。请求体参数 (body)
请求体参数顾名思义,是存放在请求体中发送给服务器的参数。请求体参数格式复杂多变,服务器会先根据请求头中的
Content-Type
获取其格式,然后再根据其格式进行解析,常见的格式如下:Content-Type值 内容格式 消息示例 application/from 表单传值,也是默认的解析形式,服务器会对表单进行解析 userId=1&userId=1&age=18&sex=男 text/plain 文本值,服务器会将本次请求的请求体当作普通字符串看待 Hello world application/json json,服务器会将请求体进行json解析,获取参数 {“userId”:1,“sex”:“男”} application/xml xml,服务器会将请求体进行xml解析,获取参数 参见 xml 标准格式 text/html html,服务器会将请求体进行html解析,获取参数 参见 html 标准格式 ps:其中
application/from
类型如有中文 或特殊符号如/
,:
,?
,#
,+
,=
等需要进行转义处理。类似的还有很多这里不一一列举。有兴趣可以翻一下,Content-Type介绍
-
python限制参数类型
2019-12-09 17:34:15welcome to my blog ...python3.5支持限制参数类型了 下面的示例表示,name需要是str类型的, greeting()的返回值是str类型的 def greeting(name: str) -> str: return 'Hello ' + name 官方文档链接 ...welcome to my blog
python3.5对类型进行标注了, 但是貌似不检查具体类型是啥
下面的示例表示,name需要是str类型的, greeting()的返回值是str类型的, 但是传入其他类型的变量也不会报错, 只是起到了标注类型的作用
def greeting(name: str) -> str: return 'Hello ' + name
进一步
# 限制了a的参数类型为list, 返回值类型为tuple def tmp0(a:list) -> tuple: pass # 复杂一点的写法 from typing import List, Tuple, Dict # 限制了返回值类型为列表, 并且列表的元素是int类型或者str类型 def tmp1(a:float, s:str) -> List[int or str]: pass # 限制了返回值为元组类型, 并且元组内的元素类型依次为元组,字典,字符串,布尔 def tmp2(a:bool, s:str) -> Tuple[Tuple, Dict, str, bool]: pass
-
Switch的参数类型
2018-06-13 21:25:15昨天面试问了一个java的基础问题:switch中参数类型可以有哪些?平时虽然有用过,但真没怎么注意switch中参数的类型。然后就随便蒙了一个答案,答对了。今天就对switch分析一下。在jdk1.7版本以前,参数类型只能是... -
python 函数参数类型
2018-05-23 19:45:441:无参数2:多个参数3:默认参数4:指定参数5:动态参数前两个就不说了,默认参数就是在参数后面给定默认值:用处:由于python 在指定形参时是不需要指定类型的,但是有时候我们在函数内部需要用到参数类型的方法,... -
python 函数参数类型检查
2019-05-22 09:38:52在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里。 我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了。而且一旦参数有改动,这部分也需要改动。 下面我们用... -
java 方法中的参数类型是类类型的
2019-08-02 22:03:09今天做作业遇到方法中的参数类型是类类型的;有点懵。所以上网查了一些资料,并且和参数类型是基本数据类型的比较了一下。 1方法参数类型是基本数据类型的: public void test(int a) { a=6; System.err.println... -
MyBatis的返回参数类型
2016-06-17 11:53:41MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1. resultMap : 1.2. resultType : 2 . 对应返回值类型: 2.1. resultMap : 结果集[对象等] 2.2. resultType : Integer,String ,Long ,class 3. ... -
C#取得一个函数或方法的参数类型参数名称返回值类型
2018-03-23 11:46:432018年3月23日11:43:06 using System.Reflection //取得YourClassName中的名称为foo的方法 Type className = Type(YourClassName) .../*取得方法的参数个数、参数类型和名称、返回值类型*/ ... -
MyBatis的parameterType传入参数类型
2018-06-05 11:42:39在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的输入参数类型即可。parameterType有基本数据类型和复杂的数据类型... -
python函数的4种参数类型
2019-06-29 16:18:16总结 python 函数中的不同参数类型的使用方法。 在调用函数时,通常会传递参数,函数内部的代码保持不变,针对 不同的参数 处理 不同的数据。 有位置传参、关键字传参、默认值参数、多值参数等。 1、参数传递 形参... -
Java 获取泛型对象的参数类型
2020-03-01 13:48:28文章目录一、类中有 class 信息二...但有几种特殊情况,能够获取泛型对象的参数类型: 1、类中有 class 信息(类中有一个 Class 字段) 2、父类中有 class 信息(父类是泛型类,并指定了参数类型) 3、持有者中有 c... -
在方法的入参中,根据参数名和参数类型如何获取参数值?
2016-07-25 01:49:51//已知参数名与参数类型 String paramAName = "a"; String paramAType = String.class.getName(); String paramBName = "b"; String paramBType = Object.class.getName(); ....... System.out.print(.... -
运算符重载函数的参数类型以及返回值类型
2015-03-23 10:37:06参数类型: 大家都知道运算符重载函数的参数类型必须是引用类型,这是为什么呢。拿我们最常用的赋值运算符重载来说,如果参数类型不是引用类型,那么传参时就需要一个对象的副本,将实参复制到形参,这种复制是浅... -
python-函数参数类型检查
2019-04-24 15:08:56python在3.5后引入了参数类型注解,例: def add(x:int,y:int)->int:#对x,y和返回值都进行注释,为int类型 return x + y 注:注解是对函数参数和返回值的‘注释’,没有强制定义的作用(因为python是动态语言啊... -
C++模板取函数参数类型和返回值类型的方法
2018-08-02 11:53:28假设要利用模板元编程获取位于index的参数的类型: template&... // FuntionType的返回值类型和参数类型? }; int f(int, short, float); static_assert(is_same_v&lt;decltype(f), int(int... -
pycharm 使用文档注释定义参数类型
2018-05-26 11:36:52pycharm有一个会帮助检查参数类型的功能,大部分时候这个功能可以帮助code更加完善,但是一些时间,他不能识别我们想要给参数传递的类型,而导致编译不通过。 这个时候在确定自己已传参数类型正确时,可以使用文档... -
python ctypes库2_指定参数类型和返回类型
2018-04-12 10:08:45python函数的参数类型和返回类型默认为int。如果需要传递一个float值给dll,那么需要指定参数的类型。如果需要返回一个flaot值到python中,那么需要指定返回数据的类型。数据类型参考python文档:... -
c++11模板:获取函数的参数类型
2019-02-23 12:55:18假设我们已经知道一个函数类型的定义double(unsigned char*, unsigned char*),如何获取这个函数定义中的输入和输出参数类型呢? c++11提供的模板函数std::function和std::tuple_element可以将一个函数定义的输入和... -
C++ 中的switch函数参数类型
2019-03-27 19:10:38C++ 中的switch函数参数类型 switch (exp1)中, exp1 是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于, byte,short,char都可以隐含转换为 int ,所以,这些类型以及这些类型的包装类型也是... -
switch所支持的参数类型
2017-09-07 23:56:04在Java的流程控制语句中的switch语句,他所支持的参数类型有三类: 1、基本数据类型:byte、short、char、int 2、引用数据类型:Byte、Short、Character、Integer、String 3、特殊类型:枚举 其实,switch只... -
C/C++ switch()参数类型
2019-04-26 09:50:44关于switch的参数类型 switch(expr1)中,expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。 由于,byte,short,char都可以隐含转换为int,... -
Android Retrofit 实现图文上传-文字参数类型
2016-08-24 16:12:52回顾在 Android Retrofit 实现文字(参数)和多张图片一起上传 博客中,我们详细介绍了多张图片和文字参数上传的具体原理和实现,今天我们重点说说文字参数类型的问题。Post请求抓包信息:接口定义:从抓包信息中... -
TypeScript入门-3.参数类型
2017-01-19 15:25:30TypeScript入门-3.参数类型 -
函数类型和参数类型
2016-05-23 13:01:56//1、参数(所有实例默认在函数返回值为int类型,即返回类型为一个值) //(1)、传值参数:实参要复制一份传值给形参(形参的改变对实参没有影响),复制过程是由形参类型的复制构造函数来完成。函数运行结束时,... -
Android JNI入门第二篇——Java参数类型与本地参数类型对照
2011-11-10 14:22:42这一篇从基础上了解一些Java参数类型与本地参数类型区别。 1) java中的返回值void和JNI中的void是完全对应的哦!(仅仅一个而已)。2) java中的基本数据类型(byte ,short ,int,long,float,double ,boolean,char... -
idea等去掉函数参数类型显示
2018-01-15 11:07:10如下图,IDEA(phpstorm)默认设置显示函数参数类型,参数较多时候编辑比较蛮烦。 可以如下位置修改:
-
使用ViewPage+PagerAdapter做左右滑屏,As项目源码
-
前端架构师-速成
-
找出";吸血鬼数";(Java,冒泡排序)
-
电商设计专业思维
-
【数据分析-随到随学】Hive详解
-
【数据分析-随到随学】机器学习模型及应用
-
彻底学会正则表达式
-
did you eat?98是一种帮助人们更好开发和利用球体的系统的软件,但是是英文的,for win3.1
-
【数据分析-随到随学】量化交易策略模型
-
lsof-master
-
【2021】UI自动化测试Selenium3
-
RabbitMQ集群(非常详细总结)
-
国家注册渗透测试工程师(Web安全)
-
Excel高级图表技巧
-
vue-cli3 内存溢出 JavaScript heap out of memory
-
2021-01-19
-
Cookie、Session、Filter
-
promise的基本用法
-
nxp-pn5xx.zip
-
64位IE11升级包.zip