Mybatis参数传递及返回类型
mybatis参数传递:
单个参数:不做特殊处理
#{参数名}:取出参数值
多个参数:做特殊处理
多个参数会被封装成一个map
key:param1 ... paramN
value:传入的参数值
#{}就是从map中获取指定的key值
操作:
方法:public Employee getEmployeeByNmaeAndPass(String name,String pass);
取值:#{name},#{pass}
命名参数:明确指定封装参数时map的key:@Param("id")
多个参数会被封装成一个map
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
POJO:
如果多个参数是业务模型中的数据,可以直接使用POJO:
#{属性名}:取出传入的POJO 的属性值
Map:
如果多个参数不是业务模型中的数据,没有对应的POJO,为了方便,可以传入map
#{key}:取出map中对应的值
TO:
如果多个参数不是业务模型中的数据,但是经常要是用,推荐来编写一个TO(Transfer Object)数据传输对象
Page{
int index;
int size;
}
示例:
1、public Employee getEmployee(@Param("name")String name,String pass);
取值:name=====>#{name/param1} pass=====>#{param2}
2、public Employee getEmployee(String name,@Param("emp")Employee employee);
取值:name====>#{param1} pass=====>#{emp.pass/param2.pass}
3、如果是Collection(List Set)类型或者是数组型,也会特殊处理,
也是把传入的list或者数组封装在map中
key:Collection(collection),如果是List还可以使用这个key(list)
数组(array)
public Employee getEmpById(List<Integer> ids);
取值:取出第一个id的值:#{list[0]}
mybatis处理参数:
总结:参数多时会封装map,未了不混乱,可以使用@Param来指定封装时使用的key;
#{key}就可以取出map中的值
(@Param("id")Integer id,@Param("name")String name);
ParamNameResolver解析参数封装的map:
names:{0=id,1=name}
1、获取每个标了param注解的参数的@Param的值:id,name:赋值给name
2、每次解析一个参数给map中保存信息:(key:参数索引,value:name的值)
name的值:
标注了param注解:注解值
没有标注:
1、全局配置:userActualParam(jdk1.8):name=参数名
2、name=map.size();相当于当前元素索引
mybatis参数值的获取
#{}:可以获取map中的值或者pojo对象属性的值
${}: 可以获取map中的值或者pojo对象属性的值
区别:
#{}:是以预编译的形式,将参数设置到sql语句中:PreparedStatement;防止sql注入
${}:取出的值,直接拼接在sql语句中,会由安全问题;
大多情况下,都会使用#{}
当存在分表、排序:按照年份分表拆分
原生jdbc不支持占位符的地方就可以使用${}进行取值
select * from ${year}_salary where xxxx;
select * from tb_student order by ${name}
#{}:
可以规定参数的一些规则:
JavaType、jdbcType、mode(存储过程)、numeriScale、resultMap、typeHandler、jdbcTypeName
jdbcType通常需要在某种特定的条件下呗被设置:
在数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。
比如:Oracle(报错)
insert into student(id,name,age) values(null,'test',null)
oracle不能识别对null的操作,报错。因为mybatis对所有的null都映射的是原生jdbc的other类型。
但是MySQL可以识别对null的操作,若想解决此问题,则使用以下添加语句;
1、insert into student(id,name,age) values(#{id},#{name},#{age,jdbcType=NULL})
2、由于全局配置中,jdbcTypeForNull=OTHER:oracle不支持
<setting name="jdbcTypeForNull" value="NULL">
此配置对使用MySQL数据库时的影响。
返回参数类型:
List型:
resultType:返回的是一个集合,要写集合中元素的类型
Map型:
resultType=“map”:返回一条记录
key:就是列名 value:对应的值
mybatis对用到的部分类进行了封装,可直接使用封装类型。
返回多条记录封装一个map:
1、resultType:要写集合中元素的类型。
Map<Integer,Employee>:
键是这条记录的主键,值是记录封装后的JavaBean
2、在对应的方法上添加@MapKey("id") 告诉mybatis封装这个map的时候使用哪个属性作为map的key
Mybatis参数传递及返回类型的更多相关文章
- 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法
使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,会报异常. 例如: <select id="getPersonRecordId" parameterTy ...
- mybatis中查询结果为空时不同返回类型对应返回值
今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同 ...
- mybatis默认返回类型
在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认的先将查询回的值放入一个hashMap中(如果返回的值不止一条就是一个包含hashMap的list).这其中的区别在于,如果你指 ...
- C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...
- mybatis 调用存储过程 返回游标 实例
存储过程示例: create or replace procedure Fsp_Plan_CheckPrj(v_grantno varchar2, v_deptcode number, v_curso ...
- MyBatis返回主键,MyBatis Insert操作返回主键
MyBatis返回主键,MyBatis Insert操作返回主键 >>>>>>>>>>>>>>>>> ...
- Mybatis批量insert 返回主键值和foreach标签详解
Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...
- 函数----基础,参数传递,返回类型和return语句
一.函数基础1.形参和实参 实参是形参的初始值.第一个实参初始化第一个形参,第二个实参初始化第二个形参,以此类推.尽管实参与形参存在对应关系,但是并没有规定实参的求值顺序.编译器能以任意可行的顺序对实 ...
- mybatis+sqlserver中返回非自增主键
首先把实体类贴出来(这里只贴出属性,其它的就是getter和setter方法): public class Around { private String xccd; //对应主键 ...
随机推荐
- Java 开发者的编程噩梦,为什么你的代码总有 bug🐛?
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 很多 Java 初学者在 ...
- AlgorithmMan,一套免费的算法演示神器
概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/971 访问. 文章末尾附带GitHub开源下载地址. 0.概述 ...
- C#LeetCode刷题-几何
几何篇 # 题名 刷题 通过率 难度 587 安装栅栏 21.5% 困难 892 三维形体的表面积 C#LeetCode刷题之#892-三维形体的表面积(Surface Area of 3D Sh ...
- Webpack file-loader 和 url-loader
二者最好只选择一个来进行对文件的打包,防止有冲突出现导致图片加载失败 如果相对不同大小的问题选择不同的loader,可以在url-loader的fallback属性指定不满足条件时的loader { ...
- JavaScript async/await 基础知识
async 作用: async函数返回一个 Promise对象,无论内部有没有await关键字. await 作用: await等待的是一个表达式,这个表达式的计算结果是 Promise 对象 或者是 ...
- hdfs学习(三)
HDFS 的 API 操作 使用url方式访问数据(了解) @Test public void urlHdfs() throws IOException { //1.注册url URL.setURLS ...
- 笔记:HTTP协议基础
一.HTTP协议特点: 简单快速,请求方式有get.post.head 等8种 无连接无状态 支持模式有 B/S(浏览器) C/S(通过websocket去通信) URL,统一资源定位符,在网络中用来 ...
- 笔记:Xshell、更新源、安装软件
一.Xshell首次连接kali系统中的ssh 1.Xshell :帮助我们去连接各种服务平台,方便管理服务器,链路可以加密处理(ssh/vsftp). 2.步骤: step1:开启kali中的ssh ...
- github Repository not found 解决办法
git pull的时候遇到下面的报错. remote: Repository not found fatal: repository 'https://github.com/MyRepo/projec ...
- 小白学PyTorch 动态图与静态图的浅显理解
文章来自公众号[机器学习炼丹术],回复"炼丹"即可获得海量学习资料哦! 目录 1 动态图的初步推导 2 动态图的叶子节点 3. grad_fn 4 静态图 本章节缕一缕PyTorc ...